[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