From 793c946ecbf1d833842d286534db958c843a3b2e 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. llvm-svn: 282401 --- .../Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 14 ++++++++------ llvm/test/Transforms/InstCombine/vec_demanded_elts.ll | 9 +++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 7d89a5f..3f4262f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/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/llvm/test/Transforms/InstCombine/vec_demanded_elts.ll b/llvm/test/Transforms/InstCombine/vec_demanded_elts.ll index 2ee30d7..7c46ada 100644 --- a/llvm/test/Transforms/InstCombine/vec_demanded_elts.ll +++ b/llvm/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.7.4