From: Eugene Leviant Date: Fri, 17 Feb 2017 07:36:03 +0000 (+0000) Subject: InstCombine: fix extraction when performing vector/array punning X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6684504281042321d26648e2b0a27b0010ff747a;p=llvm InstCombine: fix extraction when performing vector/array punning Differential revision: https://reviews.llvm.org/D29491 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295429 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index b2477f6c863..10f03c4bdd8 100644 --- a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -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(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) diff --git a/test/Transforms/InstCombine/shufflevec-bitcast.ll b/test/Transforms/InstCombine/shufflevec-bitcast.ll new file mode 100644 index 00000000000..0f0365a07fb --- /dev/null +++ b/test/Transforms/InstCombine/shufflevec-bitcast.ll @@ -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> + %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 +}