[llvm] cce80bd - [SLP]Adjust assertion check for scalars in several insertelements.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Mon May 9 13:29:23 PDT 2022


Author: Alexey Bataev
Date: 2022-05-09T13:07:59-07:00
New Revision: cce80bd8b74d54deb82b1b6ae0cbec1ab53c1dbb

URL: https://github.com/llvm/llvm-project/commit/cce80bd8b74d54deb82b1b6ae0cbec1ab53c1dbb
DIFF: https://github.com/llvm/llvm-project/commit/cce80bd8b74d54deb82b1b6ae0cbec1ab53c1dbb.diff

LOG: [SLP]Adjust assertion check for scalars in several insertelements.

If the same scalar is inserted several times into the same buildvector,
the mask index can be used already. In this case need to check, that
this scalar is already part of the vectorized buildvector.

Added: 
    

Modified: 
    llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
    llvm/test/Transforms/SLPVectorizer/X86/buildvector-shuffle.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 4f3db8c83394c..8abe0bddbc624 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -6592,7 +6592,16 @@ InstructionCost BoUpSLP::getTreeCost(ArrayRef<Value *> VectorizedVals) {
           SmallVectorImpl<int> &Mask = ShuffleMasks[VecId][ScalarTE];
           if (Mask.empty())
             Mask.assign(FTy->getNumElements(), UndefMaskElem);
-          assert(Mask[InIdx] == UndefMaskElem &&
+          // InsertElement should not be used already or the scalar is part of
+          // TreeEntry, which is operand of the root insertelement instructions.
+          assert((Mask[InIdx] == UndefMaskElem ||
+                  any_of(ScalarTE->UserTreeIndices,
+                         [](const EdgeInfo &EI) {
+                           return EI.EdgeIdx == 1 &&
+                                  EI.UserTE->getOpcode() ==
+                                      Instruction::InsertElement &&
+                                  !EI.UserTE->isAltShuffle();
+                         })) &&
                  "InsertElementInstruction used already.");
           Mask[InIdx] = EU.Lane;
           DemandedElts[VecId].setBit(InIdx);

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/buildvector-shuffle.ll b/llvm/test/Transforms/SLPVectorizer/X86/buildvector-shuffle.ll
index 92762dd28174f..fa4fd9d75bdb2 100644
--- a/llvm/test/Transforms/SLPVectorizer/X86/buildvector-shuffle.ll
+++ b/llvm/test/Transforms/SLPVectorizer/X86/buildvector-shuffle.ll
@@ -41,3 +41,28 @@ entry:
 }
 
 declare float @llvm.fmuladd.f32(float, float, float)
+
+define void @test(float %a) {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <2 x float> poison, float [[A:%.*]], i32 0
+; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x float> [[TMP0]], float [[A]], i32 1
+; CHECK-NEXT:    br label [[LOOP:%.*]]
+; CHECK:       loop:
+; CHECK-NEXT:    [[TMP2:%.*]] = fadd <2 x float> zeroinitializer, [[TMP1]]
+; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x float> [[TMP2]], i32 0
+; CHECK-NEXT:    [[AGG:%.*]] = insertelement <2 x float> [[TMP2]], float [[TMP3]], i64 1
+; CHECK-NEXT:    br label [[LOOP]]
+;
+entry:
+  br label %loop
+
+loop:
+  %add.i157 = fadd float 0.000000e+00, %a
+  %add23.i = fadd float 0.000000e+00, %a
+  %insert = insertelement <2 x float> zeroinitializer, float %add.i157, i64 0
+  %insert.i = insertelement <2 x float> %insert, float %add23.i, i64 1
+  %agg = insertelement <2 x float> %insert.i, float %add.i157, i64 1
+  br label %loop
+}
+


        


More information about the llvm-commits mailing list