[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