[llvm] 6ca5a41 - [SLP]Fix PR87358: broken module, Instruction does not dominate all uses.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 10 08:30:51 PDT 2024
Author: Alexey Bataev
Date: 2024-04-10T08:24:15-07:00
New Revision: 6ca5a410d26262f06f954e91200eefe0cbfb7fb8
URL: https://github.com/llvm/llvm-project/commit/6ca5a410d26262f06f954e91200eefe0cbfb7fb8
DIFF: https://github.com/llvm/llvm-project/commit/6ca5a410d26262f06f954e91200eefe0cbfb7fb8.diff
LOG: [SLP]Fix PR87358: broken module, Instruction does not dominate all uses.
If the first node is a gather node with extractelement instructions,
still need to put the vector value after all instructions, not after the
very first one.
Added:
llvm/test/Transforms/SLPVectorizer/X86/extractlements-gathered-first-node.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 22ef9b5fb994e3..6b758f63a7961e 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10736,9 +10736,13 @@ Instruction &BoUpSLP::getLastInstructionInBundle(const TreeEntry *E) {
[](Value *V) {
return !isa<GetElementPtrInst>(V) && isa<Instruction>(V);
})) ||
- all_of(E->Scalars, [](Value *V) {
- return !isVectorLikeInstWithConstOps(V) && isUsedOutsideBlock(V);
- }))
+ all_of(E->Scalars,
+ [](Value *V) {
+ return !isVectorLikeInstWithConstOps(V) &&
+ isUsedOutsideBlock(V);
+ }) ||
+ (E->State == TreeEntry::NeedToGather && E->Idx == 0 &&
+ all_of(E->Scalars, IsaPred<ExtractElementInst, UndefValue>)))
Res.second = FindLastInst();
else
Res.second = FindFirstInst();
diff --git a/llvm/test/Transforms/SLPVectorizer/X86/extractlements-gathered-first-node.ll b/llvm/test/Transforms/SLPVectorizer/X86/extractlements-gathered-first-node.ll
new file mode 100644
index 00000000000000..57fa83b1ccdd69
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/extractlements-gathered-first-node.ll
@@ -0,0 +1,18 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
+; RUN: opt -S --passes=slp-vectorizer -slp-threshold=-99999 -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: define void @test() {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i32> zeroinitializer, i32 0
+; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i32> zeroinitializer, i32 0
+; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i32> <i32 0, i32 undef>, i32 [[TMP1]], i32 1
+; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i32 [[TMP0]], [[TMP1]]
+; CHECK-NEXT: ret void
+;
+bb:
+ %0 = extractelement <4 x i32> zeroinitializer, i32 0
+ %1 = extractelement <2 x i32> zeroinitializer, i32 0
+ %icmp = icmp ult i32 %0, %1
+ ret void
+}
More information about the llvm-commits
mailing list