From: Alexey Bataev Date: Mon, 26 Sep 2016 13:18:59 +0000 (+0000) Subject: [InstCombine] Fixed bug introduced in r282237 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=34552649e8185e5a5bf78d550bd41b2bea5724e6;p=llvm [InstCombine] Fixed bug introduced in r282237 The index of the new insertelement instruction was evaluated in the wrong way, it was considered as the index of the inserted value instead of index of the position, where the value should be inserted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282401 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 7d89a5f8e41..3f4262fe13b 100644 --- a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -1048,8 +1048,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, if (TmpV) { I->setOperand(1, TmpV); MadeChange = true; } bool NewUndefElts = false; - unsigned LHSIdx = -1u; - unsigned RHSIdx = -1u; + unsigned LHSIdx = -1u, LHSValIdx = -1u; + unsigned RHSIdx = -1u, RHSValIdx = -1u; bool LHSUniform = true; bool RHSUniform = true; for (unsigned i = 0; i < VWidth; i++) { @@ -1064,7 +1064,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, NewUndefElts = true; UndefElts.setBit(i); } else { - LHSIdx = LHSIdx == -1u ? MaskVal : LHSVWidth; + LHSIdx = LHSIdx == -1u ? i : LHSVWidth; + LHSValIdx = LHSValIdx == -1u ? MaskVal : LHSVWidth; LHSUniform = LHSUniform && (MaskVal == i); } } else { @@ -1072,7 +1073,8 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, NewUndefElts = true; UndefElts.setBit(i); } else { - RHSIdx = RHSIdx == -1u ? MaskVal - LHSVWidth : LHSVWidth; + RHSIdx = RHSIdx == -1u ? i : LHSVWidth; + RHSValIdx = RHSValIdx == -1u ? MaskVal - LHSVWidth : LHSVWidth; RHSUniform = RHSUniform && (MaskVal - LHSVWidth == i); } } @@ -1091,14 +1093,14 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, if (LHSIdx < LHSVWidth && RHSUniform) { if (auto *CV = dyn_cast(Shuffle->getOperand(0))) { Op = Shuffle->getOperand(1); - Value = CV->getOperand(LHSIdx); + Value = CV->getOperand(LHSValIdx); Idx = LHSIdx; } } if (RHSIdx < LHSVWidth && LHSUniform) { if (auto *CV = dyn_cast(Shuffle->getOperand(1))) { Op = Shuffle->getOperand(0); - Value = CV->getOperand(RHSIdx); + Value = CV->getOperand(RHSValIdx); Idx = RHSIdx; } } diff --git a/test/Transforms/InstCombine/vec_demanded_elts.ll b/test/Transforms/InstCombine/vec_demanded_elts.ll index 2ee30d771e1..7c46adaf616 100644 --- a/test/Transforms/InstCombine/vec_demanded_elts.ll +++ b/test/Transforms/InstCombine/vec_demanded_elts.ll @@ -212,6 +212,15 @@ define <2 x double> @test_fpext(float %f) { ret <2 x double> %ret } +define <4 x double> @test_shuffle(<4 x double> %f) { +; CHECK-LABEL: @test_shuffle( +; CHECK-NEXT: [[RET1:%.*]] = insertelement <4 x double> %f, double 1.000000e+00, i32 3 +; CHECK-NEXT: ret <4 x double> [[RET1]] +; + %ret = shufflevector <4 x double> %f, <4 x double> , <4 x i32> + ret <4 x double> %ret +} + define <4 x float> @test_select(float %f, float %g) { ; CHECK-LABEL: @test_select( ; CHECK-NEXT: [[A0:%.*]] = insertelement <4 x float> undef, float %f, i32 0