[llvm] 5e67c41 - [SLP]Fix PR90780: insert cast instruction for PHI nodes after all phi nodes.
Alexey Bataev via llvm-commits
llvm-commits at lists.llvm.org
Thu May 2 06:34:21 PDT 2024
Author: Alexey Bataev
Date: 2024-05-02T06:30:14-07:00
New Revision: 5e67c41a932256e047ae093ae4f7f5a53df1527d
URL: https://github.com/llvm/llvm-project/commit/5e67c41a932256e047ae093ae4f7f5a53df1527d
DIFF: https://github.com/llvm/llvm-project/commit/5e67c41a932256e047ae093ae4f7f5a53df1527d.diff
LOG: [SLP]Fix PR90780: insert cast instruction for PHI nodes after all phi nodes.
Need to check if the vectorized value is a PHINode before insert casting
instruction and insert it after all phis to generate the code correctly.
Added:
llvm/test/Transforms/SLPVectorizer/ext-after-phi-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 bc553c5009ed32..f3970f8b549c8c 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -13747,7 +13747,10 @@ Value *BoUpSLP::vectorizeTree(
auto VecIt = VectorCasts.find(Key);
if (VecIt == VectorCasts.end()) {
IRBuilderBase::InsertPointGuard Guard(Builder);
- if (auto *IVec = dyn_cast<Instruction>(Vec))
+ if (auto *IVec = dyn_cast<PHINode>(Vec))
+ Builder.SetInsertPoint(
+ IVec->getParent()->getFirstNonPHIOrDbgOrLifetime());
+ else if (auto *IVec = dyn_cast<Instruction>(Vec))
Builder.SetInsertPoint(IVec->getNextNonDebugInstruction());
Vec = Builder.CreateIntCast(
Vec,
diff --git a/llvm/test/Transforms/SLPVectorizer/ext-after-phi-node.ll b/llvm/test/Transforms/SLPVectorizer/ext-after-phi-node.ll
new file mode 100644
index 00000000000000..0abfdc91e72958
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/ext-after-phi-node.ll
@@ -0,0 +1,38 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
+;RUN: opt -S -S --passes=slp-vectorizer -slp-threshold=-99999 < %s | FileCheck %s
+
+define double @test() {
+; CHECK-LABEL: define double @test() {
+; CHECK-NEXT: bb:
+; CHECK-NEXT: br label [[BB7:%.*]]
+; CHECK: bb7:
+; CHECK-NEXT: [[TMP0:%.*]] = phi <2 x i32> [ poison, [[BB9:%.*]] ], [ zeroinitializer, [[BB:%.*]] ]
+; CHECK-NEXT: [[TMP1:%.*]] = phi <2 x i32> [ zeroinitializer, [[BB9]] ], [ zeroinitializer, [[BB]] ]
+; CHECK-NEXT: [[TMP2:%.*]] = zext <2 x i32> [[TMP0]] to <2 x i64>
+; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i32> [[TMP0]], i32 0
+; CHECK-NEXT: [[TMP4:%.*]] = zext i32 [[TMP3]] to i64
+; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1
+; CHECK-NEXT: [[TMP6:%.*]] = zext i32 [[TMP5]] to i64
+; CHECK-NEXT: [[ICMP:%.*]] = icmp ult i64 [[TMP6]], [[TMP4]]
+; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <2 x i64> zeroinitializer, <2 x i64> [[TMP2]], <2 x i32> <i32 3, i32 1>
+; CHECK-NEXT: ret double 0.000000e+00
+; CHECK: bb9:
+; CHECK-NEXT: br label [[BB7]]
+;
+bb:
+ br label %bb7
+
+bb7:
+ %0 = phi <2 x i32> [ poison, %bb9 ], [ zeroinitializer, %bb ]
+ %1 = phi <2 x i32> [ zeroinitializer, %bb9 ], [ zeroinitializer, %bb ]
+ %2 = extractelement <2 x i32> %0, i32 1
+ %3 = extractelement <2 x i32> %0, i32 0
+ %zext8 = zext i32 %3 to i64
+ %zext = zext i32 %2 to i64
+ %icmp = icmp ult i64 %zext, %zext8
+ %4 = insertelement <2 x i64> zeroinitializer, i64 %zext, i32 0
+ ret double 0.000000e+00
+
+bb9:
+ br label %bb7
+}
More information about the llvm-commits
mailing list