From 34552649e8185e5a5bf78d550bd41b2bea5724e6 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Mon, 26 Sep 2016 13:18:59 +0000 Subject: [PATCH] [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 --- lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 14 ++++++++------ test/Transforms/InstCombine/vec_demanded_elts.ll | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) 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 -- 2.11.0