[llvm] b0f0313 - [SLP]Add an extra check for select minmax reduction to avoid crash.

Alexey Bataev via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 06:07:19 PDT 2022


Author: Alexey Bataev
Date: 2022-05-17T06:05:52-07:00
New Revision: b0f0313febe755eeb7bacd62cf5862d9812f1690

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

LOG: [SLP]Add an  extra check for select minmax reduction to avoid crash.

Need to check if the reduction is still (not)cmp-select pattern min/max
reduction to avoid compiler crash during building list of reduction
operations. cmp-sel pattern provides 2 reduction operations, while
intrinsics - just one.

Added: 
    llvm/test/Transforms/SLPVectorizer/X86/reduction-min-select.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 2a8b3cee5c8a3..340c3dcd7d594 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -10270,6 +10270,7 @@ class HorizontalReduction {
         // If the edge is not an instruction, or it is 
diff erent from the main
         // reduction opcode or has too many uses - possible reduced value.
         if (!EdgeInst || getRdxKind(EdgeInst) != RdxKind ||
+            IsCmpSelMinMax != isCmpSelMinMax(EdgeInst) ||
             !hasRequiredNumberOfUses(IsCmpSelMinMax, EdgeInst) ||
             !isVectorizable(getRdxKind(EdgeInst), EdgeInst)) {
           PossibleReducedVals.push_back(EdgeVal);

diff  --git a/llvm/test/Transforms/SLPVectorizer/X86/reduction-min-select.ll b/llvm/test/Transforms/SLPVectorizer/X86/reduction-min-select.ll
new file mode 100644
index 0000000000000..7371b06e8c529
--- /dev/null
+++ b/llvm/test/Transforms/SLPVectorizer/X86/reduction-min-select.ll
@@ -0,0 +1,36 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
+
+define void @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 false, label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 1, 0
+; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 1, i32 0
+; CHECK-NEXT:    [[TMP0:%.*]] = call i32 @llvm.smin.i32(i32 [[SPEC_SELECT]], i32 1)
+; CHECK-NEXT:    br label [[IF_END20:%.*]]
+; CHECK:       if.else:
+; CHECK-NEXT:    br label [[IF_END20]]
+; CHECK:       if.end20:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ undef, [[IF_ELSE]] ], [ [[TMP0]], [[IF_THEN]] ]
+; CHECK-NEXT:    ret void
+;
+entry:
+  br i1 false, label %if.else, label %if.then
+
+if.then:
+  %cmp = icmp slt i32 1, 0
+  %spec.select = select i1 %cmp, i32 1, i32 0
+  %0 = call i32 @llvm.smin.i32(i32 %spec.select, i32 1)
+  br label %if.end20
+
+if.else:
+  br label %if.end20
+
+if.end20:
+  %1 = phi i32 [ undef, %if.else ], [ %0, %if.then ]
+  ret void
+}
+
+declare i32 @llvm.smin.i32(i32, i32)


        


More information about the llvm-commits mailing list