[llvm] 254558a - [SLP]Fix PR69976: Check for multi-node uses during node building.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 24 07:02:00 PDT 2023


Author: Alexey Bataev
Date: 2023-10-24T07:01:46-07:00
New Revision: 254558ac53e7d5c14b73f38d9ddb2272ececcbd6

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

LOG: [SLP]Fix PR69976: Check for multi-node uses during node building.

Need to check if there is already a node created for the multi-node
instruction before ending up with creating a new node for such
instructions.

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/multi-node-with-save-values.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 f694ab88ccab8ea..2a7129e17831b9d 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -5831,6 +5831,19 @@ void BoUpSLP::buildTree_rec(ArrayRef<Value *> VL, unsigned Depth,
   if (TreeEntry *E = getTreeEntry(S.OpValue)) {
     LLVM_DEBUG(dbgs() << "SLP: \tChecking bundle: " << *S.OpValue << ".\n");
     if (!E->isSame(VL)) {
+      auto It = MultiNodeScalars.find(S.OpValue);
+      if (It != MultiNodeScalars.end()) {
+        auto *TEIt = find_if(It->getSecond(),
+                             [&](TreeEntry *ME) { return ME->isSame(VL); });
+        if (TEIt != It->getSecond().end())
+          E = *TEIt;
+        else
+          E = nullptr;
+      } else {
+        E = nullptr;
+      }
+    }
+    if (!E) {
       if (!doesNotNeedToBeScheduled(S.OpValue)) {
         LLVM_DEBUG(dbgs() << "SLP: Gathering due to partial overlap.\n");
         if (TryToFindDuplicates(S))

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/multi-node-with-save-values.ll b/llvm/test/Transforms/SLPVectorizer/X86/multi-node-with-save-values.ll
new file mode 100644
index 000000000000000..2088a3db212bed6
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/multi-node-with-save-values.ll
@@ -0,0 +1,47 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+define void @foo() {
+; CHECK-LABEL: define void @foo() {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[BB1:%.*]]
+; CHECK:       bb1:
+; CHECK-NEXT:    switch i32 0, label [[BB3:%.*]] [
+; CHECK-NEXT:    i32 0, label [[BB2:%.*]]
+; CHECK-NEXT:    i32 4, label [[BB4:%.*]]
+; CHECK-NEXT:    i32 1, label [[BB4]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    br label [[BB4]]
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB4]]
+; CHECK:       bb4:
+; CHECK-NEXT:    [[TMP0:%.*]] = phi <2 x i32> [ zeroinitializer, [[BB3]] ], [ zeroinitializer, [[BB2]] ], [ zeroinitializer, [[BB1]] ], [ zeroinitializer, [[BB1]] ]
+; CHECK-NEXT:    br label [[BB1]]
+;
+entry:
+  %add1 = add i32 0, 0
+  %add2 = add i32 0, 0
+  %add3 = add i32 0, 0
+  %add4 = add i32 0, 0
+  %add5 = add i32 0, 0
+  br label %bb1
+
+bb1:
+  switch i32 0, label %bb3 [
+  i32 0, label %bb2
+  i32 4, label %bb4
+  i32 1, label %bb4
+  ]
+
+bb2:
+  br label %bb4
+
+bb3:
+  br label %bb4
+
+bb4:
+  %p1 = phi i32 [ %add1, %bb3 ], [ %add4, %bb2 ], [ %add2, %bb1 ], [ %add2, %bb1 ]
+  %p2 = phi i32 [ %add2, %bb3 ], [ %add5, %bb2 ], [ %add3, %bb1 ], [ %add3, %bb1 ]
+  br label %bb1
+}


        


More information about the llvm-commits mailing list