[PATCH] D98432: [SLP] Fix crash when matching associative reduction for integer min/max.
Valeriy Dmitriev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 11 11:54:37 PST 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG73f94969b29f: [SLP] Fix crash when matching associative reduction for integer min/max. (authored by vdmitrie).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98432/new/
https://reviews.llvm.org/D98432
Files:
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/test/Transforms/SLPVectorizer/slp-umax-rdx-matcher-crash.ll
Index: llvm/test/Transforms/SLPVectorizer/slp-umax-rdx-matcher-crash.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SLPVectorizer/slp-umax-rdx-matcher-crash.ll
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -slp-vectorizer -S < %s 2>&1 | FileCheck %s
+; REQUIRES: asserts
+
+; Given LLVM IR caused associative reduction matching routine crash in SLP.
+; The routines begins with select as integer Umax reduction kind
+; and then follows to llvm.umax intrinsic call which also matched
+; to UMax and thus same reduction kind is returned.
+; The routine's later code merely assumes the instruction to be a select.
+
+define dso_local void @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: br i1 undef, label [[NEXT:%.*]], label [[THEN:%.*]]
+; CHECK: then:
+; CHECK-NEXT: [[UM:%.*]] = call i8 @llvm.umax.i8(i8 0, i8 undef)
+; CHECK-NEXT: [[SELCMP:%.*]] = icmp ult i8 [[UM]], undef
+; CHECK-NEXT: [[I0:%.*]] = select i1 [[SELCMP]], i8 undef, i8 [[UM]]
+; CHECK-NEXT: br label [[NEXT]]
+; CHECK: next:
+; CHECK-NEXT: [[T7_0:%.*]] = phi i8 [ undef, [[ENTRY:%.*]] ], [ [[I0]], [[THEN]] ]
+; CHECK-NEXT: ret void
+;
+entry:
+ br i1 undef, label %next, label %then
+
+then:
+ %um = call i8 @llvm.umax.i8(i8 0, i8 undef)
+ %selcmp = icmp ult i8 %um, undef
+ %i0 = select i1 %selcmp, i8 undef, i8 %um
+ br label %next
+
+next:
+ %t7.0 = phi i8 [ undef, %entry ], [ %i0, %then ]
+ ret void
+}
+
+declare i8 @llvm.umax.i8(i8, i8)
+
Index: llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
===================================================================
--- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -6590,16 +6590,18 @@
if (match(I, m_Intrinsic<Intrinsic::minnum>(m_Value(), m_Value())))
return RecurKind::FMin;
- if (match(I, m_SMax(m_Value(), m_Value())))
- return RecurKind::SMax;
- if (match(I, m_SMin(m_Value(), m_Value())))
- return RecurKind::SMin;
- if (match(I, m_UMax(m_Value(), m_Value())))
- return RecurKind::UMax;
- if (match(I, m_UMin(m_Value(), m_Value())))
- return RecurKind::UMin;
if (auto *Select = dyn_cast<SelectInst>(I)) {
+ // These would also match llvm.{u,s}{min,max} intrinsic call
+ // if were not guarded by the SelectInst check above.
+ if (match(I, m_SMax(m_Value(), m_Value())))
+ return RecurKind::SMax;
+ if (match(I, m_SMin(m_Value(), m_Value())))
+ return RecurKind::SMin;
+ if (match(I, m_UMax(m_Value(), m_Value())))
+ return RecurKind::UMax;
+ if (match(I, m_UMin(m_Value(), m_Value())))
+ return RecurKind::UMin;
// Try harder: look for min/max pattern based on instructions producing
// same values such as: select ((cmp Inst1, Inst2), Inst1, Inst2).
// During the intermediate stages of SLP, it's very common to have
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98432.330043.patch
Type: text/x-patch
Size: 3023 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210311/3aa67153/attachment.bin>
More information about the llvm-commits
mailing list