mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[InstCombine] Handle scalable splat in getFlippedStrictnessPredicateAndConstant
(cherry picked from commit d51fcd4ed86ac6075c8a25b053c2b66051feaf62)
This commit is contained in:
parent
78859f118a
commit
55193c2ba5
@ -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;
|
||||
|
15
llvm/test/Transforms/InstCombine/pr83931.ll
Normal file
15
llvm/test/Transforms/InstCombine/pr83931.ll
Normal file
@ -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
|
||||
}
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user