[llvm] a9b052e - [SLP]Fix PR59693: Do not crash trying to set insert point for buildvector

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 27 06:03:10 PST 2022


Author: Alexey Bataev
Date: 2022-12-27T06:01:38-08:00
New Revision: a9b052e2efc5600bab7122a627ca0a65022ee2f5

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

LOG: [SLP]Fix PR59693: Do not crash trying to set insert point for buildvector
of extractvalues.

No need to get the last instruction only for vectorized extractvalues,
for gathered(buildvector sequence) still need to get the insertion
  point.

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll

Modified: 
    llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index db078b2b26126..122caaccd5d6f 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -9512,7 +9512,8 @@ Value *BoUpSLP::vectorizeTree(ExtraValueToDebugLocsMap &ExternallyUsedValues,
   for (const std::unique_ptr<TreeEntry> &E : VectorizableTree) {
     if ((E->State == TreeEntry::NeedToGather &&
          (!E->getMainOp() || E->Idx > 0)) ||
-        E->getOpcode() == Instruction::ExtractValue ||
+        (E->State != TreeEntry::NeedToGather &&
+         E->getOpcode() == Instruction::ExtractValue) ||
         E->getOpcode() == Instruction::InsertElement)
         continue;
     Instruction *LastInst = &getLastInstructionInBundle(E.get());

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll b/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll
new file mode 100644
index 0000000000000..a5130cc887ddd
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/buildvector_splat_extractvalue.ll
@@ -0,0 +1,55 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -mtriple=x86_64-unknown-linux-gnu --passes=slp-vectorizer -S -o - %s | FileCheck %s
+
+define float @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[DOTOBIT1683:%.*]] = extractvalue { i64, i1 } zeroinitializer, 1
+; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <8 x i1> poison, i1 [[DOTOBIT1683]], i32 0
+; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <8 x i1> [[TMP0]], <8 x i1> poison, <8 x i32> zeroinitializer
+; CHECK-NEXT:    [[TMP2:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> zeroinitializer)
+; CHECK-NEXT:    [[TMP3:%.*]] = call i1 @llvm.vector.reduce.or.v8i1(<8 x i1> [[TMP1]])
+; CHECK-NEXT:    [[OP_RDX:%.*]] = or i1 [[TMP2]], [[TMP3]]
+; CHECK-NEXT:    [[OP_RDX1:%.*]] = or i1 [[OP_RDX]], false
+; CHECK-NEXT:    [[OP_RDX2:%.*]] = or i1 [[OP_RDX1]], false
+; CHECK-NEXT:    br i1 [[OP_RDX2]], label [[EXIT1:%.*]], label [[EXIT2:%.*]]
+; CHECK:       exit2:
+; CHECK-NEXT:    ret float 0.000000e+00
+; CHECK:       exit1:
+; CHECK-NEXT:    ret float 0.000000e+00
+;
+entry:
+  %.obit1683 = extractvalue { i64, i1 } zeroinitializer, 1
+  %state907 = or i1 %.obit1683, %.obit1683
+  %state915 = or i1 false, %state907
+  %state1017 = or i1 false, %state915
+  %state1021 = or i1 false, %state1017
+  %state1032 = or i1 %.obit1683, %state1021
+  %state1035 = or i1 false, %state1032
+  %state1052 = or i1 false, %state1035
+  %state1067 = or i1 false, %state1052
+  %state1076 = or i1 %.obit1683, %state1067
+  %state1142 = or i1 false, %state1076
+  %state1156 = or i1 false, %state1142
+  %state1161 = or i1 false, %state1156
+  %state1165 = or i1 %.obit1683, %state1161
+  %state1173 = or i1 false, %state1165
+  %state1193 = or i1 false, %state1173
+  %state1240 = or i1 false, %state1193
+  %state1258 = or i1 %.obit1683, %state1240
+  %state1278 = or i1 false, %state1258
+  %state1293 = or i1 false, %state1278
+  %state1298 = or i1 false, %state1293
+  %state1302 = or i1 %.obit1683, %state1298
+  %state1329 = or i1 false, %state1302
+  %state1336 = or i1 false, %state1329
+  %state1350 = or i1 false, %state1336
+  %state1359 = or i1 %.obit1683, %state1350
+  br i1 %state1359, label %exit1, label %exit2
+
+exit2:
+  ret float 0.000000e+00
+
+exit1:
+  ret float 0.000000e+00
+}


        


More information about the llvm-commits mailing list