diff options
author | Yingwei Zheng <dtcxzyw2333@gmail.com> | 2024-03-05 17:21:16 +0800 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2024-03-12 18:19:15 -0700 |
commit | 55193c2ba53f4156481b63b5956eaadd8edb0877 (patch) | |
tree | 5c846a75c168b5b8524d7433aaa363fe8499d1ae | |
parent | 78859f118a6b4c7b06c543c7794c59befdc78924 (diff) | |
download | llvm-55193c2ba53f4156481b63b5956eaadd8edb0877.zip llvm-55193c2ba53f4156481b63b5956eaadd8edb0877.tar.gz llvm-55193c2ba53f4156481b63b5956eaadd8edb0877.tar.bz2 |
[InstCombine] Handle scalable splat in `getFlippedStrictnessPredicateAndConstant`
(cherry picked from commit d51fcd4ed86ac6075c8a25b053c2b66051feaf62)
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/pr83931.ll | 15 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/select.ll | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/vscale_cmp.ll | 2 |
4 files changed, 24 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 8c0fd66..9973a80 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -6491,6 +6491,13 @@ InstCombiner::getFlippedStrictnessPredicateAndConstant(CmpInst::Predicate Pred, if (!SafeReplacementConstant) SafeReplacementConstant = CI; } + } else if (isa<VectorType>(C->getType())) { + // Handle scalable splat + Value *SplatC = C->getSplatValue(); + auto *CI = dyn_cast_or_null<ConstantInt>(SplatC); + // Bail out if the constant can't be safely incremented/decremented. + if (!CI || !ConstantIsOk(CI)) + return std::nullopt; } else { // ConstantExpr? return std::nullopt; diff --git a/llvm/test/Transforms/InstCombine/pr83931.ll b/llvm/test/Transforms/InstCombine/pr83931.ll new file mode 100644 index 0000000..d36ac8d --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pr83931.ll @@ -0,0 +1,15 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 +; RUN: opt -S -passes=instcombine < %s | FileCheck %s + +define <vscale x 2 x i1> @dont_crash(<vscale x 2 x i64> %x) { +; CHECK-LABEL: define <vscale x 2 x i1> @dont_crash( +; CHECK-SAME: <vscale x 2 x i64> [[X:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[RET:%.*]] = icmp sgt <vscale x 2 x i64> [[X]], shufflevector (<vscale x 2 x i64> insertelement (<vscale x 2 x i64> poison, i64 -309383, i64 0), <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer) +; CHECK-NEXT: ret <vscale x 2 x i1> [[RET]] +; +entry: + %div = sdiv <vscale x 2 x i64> %x, splat (i64 309383) + %ret = icmp sge <vscale x 2 x i64> %div, zeroinitializer + ret <vscale x 2 x i1> %ret +} diff --git a/llvm/test/Transforms/InstCombine/select.ll b/llvm/test/Transforms/InstCombine/select.ll index b7e743c..888e7d2 100644 --- a/llvm/test/Transforms/InstCombine/select.ll +++ b/llvm/test/Transforms/InstCombine/select.ll @@ -3459,7 +3459,7 @@ define <vscale x 2 x i32> @scalable_sign_bits(<vscale x 2 x i8> %x) { define <vscale x 2 x i1> @scalable_non_zero(<vscale x 2 x i32> %x) { ; CHECK-LABEL: @scalable_non_zero( ; CHECK-NEXT: [[A:%.*]] = or <vscale x 2 x i32> [[X:%.*]], shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 1, i32 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer) -; CHECK-NEXT: [[CMP:%.*]] = icmp ule <vscale x 2 x i32> [[A]], shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 56, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer) +; CHECK-NEXT: [[CMP:%.*]] = icmp ult <vscale x 2 x i32> [[A]], shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 57, i64 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer) ; CHECK-NEXT: ret <vscale x 2 x i1> [[CMP]] ; %a = or <vscale x 2 x i32> %x, shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> poison, i32 1, i32 0), <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer) diff --git a/llvm/test/Transforms/InstCombine/vscale_cmp.ll b/llvm/test/Transforms/InstCombine/vscale_cmp.ll index a7f8368..b2bfc93da 100644 --- a/llvm/test/Transforms/InstCombine/vscale_cmp.ll +++ b/llvm/test/Transforms/InstCombine/vscale_cmp.ll @@ -3,7 +3,7 @@ define <vscale x 2 x i1> @sge(<vscale x 2 x i8> %x) { ; CHECK-LABEL: @sge( -; CHECK-NEXT: [[CMP:%.*]] = icmp sge <vscale x 2 x i8> [[X:%.*]], zeroinitializer +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <vscale x 2 x i8> [[X:%.*]], shufflevector (<vscale x 2 x i8> insertelement (<vscale x 2 x i8> poison, i8 -1, i64 0), <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer) ; CHECK-NEXT: ret <vscale x 2 x i1> [[CMP]] ; %cmp = icmp sge <vscale x 2 x i8> %x, zeroinitializer |