Changed back (relative to commit 179786) the operations executed when extract(cast) is transformed to cast(extract). It uses the Builder class as before. In addition the result node is added to the Worklist, so all the previous extract users will become the new scalar cast users.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anat Shemer 2013-04-22 20:51:10 +00:00
parent 566542c87b
commit c9090b0723
2 changed files with 21 additions and 3 deletions

View File

@ -279,9 +279,9 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
// Canonicalize extractelement(cast) -> cast(extractelement)
// bitcasts can change the number of vector elements and they cost nothing
if (CI->hasOneUse() && (CI->getOpcode() != Instruction::BitCast)) {
Value *EE = InsertNewInstWith(
ExtractElementInst::Create(CI->getOperand(0), EI.getIndexOperand()),
*CI);
Value *EE = Builder->CreateExtractElement(CI->getOperand(0),
EI.getIndexOperand());
Worklist.AddValue(EE);
return CastInst::Create(CI->getOpcode(), EE, EI.getType());
}
}

View File

@ -0,0 +1,18 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
define void @test (float %b, <8 x float> * %p) {
; CHECK: extractelement
; CHECK: fptosi
%1 = load <8 x float> * %p
%2 = bitcast <8 x float> %1 to <8 x i32>
%3 = bitcast <8 x i32> %2 to <8 x float>
%a = fptosi <8 x float> %3 to <8 x i32>
%4 = fptosi float %b to i32
%5 = add i32 %4, -2
%6 = extractelement <8 x i32> %a, i32 %5
%7 = insertelement <8 x i32> undef, i32 %6, i32 7
%8 = sitofp <8 x i32> %7 to <8 x float>
store <8 x float> %8, <8 x float>* %p
ret void
}