forked from OSchip/llvm-project
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.
llvm-svn: 180045
This commit is contained in:
parent
eeb0034918
commit
10260a75e3
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue