[llvm] 1d6b5b6 - [SLP]Fix PR61050: Assertion `I->use_empty() && "trying to erase instruction with users."

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 28 07:52:59 PST 2023


Author: Alexey Bataev
Date: 2023-02-28T07:51:34-08:00
New Revision: 1d6b5b66bb6b678578016791b439ff918e4c2c31

URL: https://github.com/llvm/llvm-project/commit/1d6b5b66bb6b678578016791b439ff918e4c2c31
DIFF: https://github.com/llvm/llvm-project/commit/1d6b5b66bb6b678578016791b439ff918e4c2c31.diff

LOG: [SLP]Fix PR61050: Assertion `I->use_empty() && "trying to erase instruction with users."

When gathering the counter for the reused scalars, need to use reduced
value, not the original reduced value. Same values counter is gathered
for reduced values, not original ones.

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/reduction-modified-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 a6dfbe9313562..4317aabb5057e 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -13157,7 +13157,7 @@ class HorizontalReduction {
         for (Value *RdxVal : VL) {
           Value *OrigV = TrackedToOrig.find(RdxVal)->second;
           if (IsSupportedHorRdxIdentityOp) {
-            VectorizedVals.try_emplace(OrigV, SameValuesCounter[OrigV]);
+            VectorizedVals.try_emplace(OrigV, SameValuesCounter[RdxVal]);
             continue;
           }
           ++VectorizedVals.try_emplace(OrigV, 0).first->getSecond();

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/reduction-modified-values.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduction-modified-values.ll
new file mode 100644
index 0000000000000..dbf490c5fe6a2
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduction-modified-values.ll
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+define i32 @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
+; CHECK-NEXT:    [[TMP1:%.*]] = or <4 x i32> [[TMP0]], zeroinitializer
+; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP1]])
+; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP0]])
+; CHECK-NEXT:    [[OP_RDX:%.*]] = add i32 [[TMP2]], [[TMP3]]
+; CHECK-NEXT:    ret i32 [[OP_RDX]]
+;
+bb:
+  %0 = shufflevector <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
+  %1 = extractelement <4 x i32> %0, i32 3
+  %2 = extractelement <4 x i32> %0, i32 2
+  %3 = extractelement <4 x i32> %0, i32 1
+  %4 = extractelement <4 x i32> %0, i32 0
+  %inst514 = or i32 %4, 0
+  %inst494 = or i32 %3, 0
+  %inst474 = or i32 %2, 0
+  %inst454 = or i32 %1, 0
+  %inst458 = add i32 %1, %inst454
+  %inst477 = add i32 %inst458, %2
+  %inst478 = add i32 %inst477, %inst474
+  %inst497 = add i32 %inst478, %3
+  %inst498 = add i32 %inst497, %inst494
+  %inst517 = add i32 %inst498, %4
+  %inst518 = add i32 %inst517, %inst514
+  ret i32 %inst518
+}


        


More information about the llvm-commits mailing list