[InstCombine] Fixed bug introduced in r282237
authorAlexey Bataev <a.bataev@hotmail.com>
Mon, 26 Sep 2016 13:18:59 +0000 (13:18 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Mon, 26 Sep 2016 13:18:59 +0000 (13:18 +0000)
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

llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
llvm/test/Transforms/InstCombine/vec_demanded_elts.ll

index 7d89a5f8e419c2cb18aff9b69ab0426bd281a726..3f4262fe13ba6cfb5d786590d14df94ed58842b3 100644 (file)
@@ -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<ConstantVector>(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<ConstantVector>(Shuffle->getOperand(1))) {
           Op = Shuffle->getOperand(0);
-          Value = CV->getOperand(RHSIdx);
+          Value = CV->getOperand(RHSValIdx);
           Idx = RHSIdx;
         }
       }
index 2ee30d771e1ca5d243be0a7454d1b35cb2d7d9d8..7c46adaf616e69399ad23f1bb490a7cff11e1e6f 100644 (file)
@@ -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> <double undef, double 1.0, double undef, double undef>, <4 x i32> <i32 0, i32 1, i32 2, i32 5>
+  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