InstCombine: fix extraction when performing vector/array punning

Differential revision: https://reviews.llvm.org/D29491

llvm-svn: 295429
This commit is contained in:
Eugene Leviant 2017-02-17 07:36:03 +00:00
parent 7f1604aae6
commit 958fcd7502
2 changed files with 17 additions and 1 deletions

View File

@ -1209,7 +1209,6 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
if (isShuffleExtractingFromLHS(SVI, Mask)) {
Value *V = LHS;
unsigned MaskElems = Mask.size();
unsigned BegIdx = Mask.front();
VectorType *SrcTy = cast<VectorType>(V->getType());
unsigned VecBitWidth = SrcTy->getBitWidth();
unsigned SrcElemBitWidth = DL.getTypeSizeInBits(SrcTy->getElementType());
@ -1223,6 +1222,7 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
// Only visit bitcasts that weren't previously handled.
BCs.push_back(BC);
for (BitCastInst *BC : BCs) {
unsigned BegIdx = Mask.front();
Type *TgtTy = BC->getDestTy();
unsigned TgtElemBitWidth = DL.getTypeSizeInBits(TgtTy);
if (!TgtElemBitWidth)

View File

@ -0,0 +1,16 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
define void @test(<16 x i8> %w, i32* %o1, float* %o2) {
; CHECK: %v.bc = bitcast <16 x i8> %w to <4 x i32>
; CHECK-NEXT: %v.extract = extractelement <4 x i32> %v.bc, i32 3
; CHECK-NEXT: %v.bc{{[0-9]*}} = bitcast <16 x i8> %w to <4 x float>
; CHECK-NEXT: %v.extract{{[0-9]*}} = extractelement <4 x float> %v.bc{{[0-9]*}}, i32 3
%v = shufflevector <16 x i8> %w, <16 x i8> undef, <4 x i32> <i32 12, i32 13, i32 14, i32 15>
%f = bitcast <4 x i8> %v to float
%i = bitcast <4 x i8> %v to i32
store i32 %i, i32* %o1, align 4
store float %f, float* %o2, align 4
ret void
}