[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