diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 5907e21065331..d76c6dbfb494f 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -3025,9 +3025,6 @@ static Value *simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS, *MulC != 0 && C->srem(*MulC) != 0))) return ConstantInt::get(ITy, Pred == ICmpInst::ICMP_NE); - if (Pred == ICmpInst::ICMP_UGE && C->isOne() && isKnownNonZero(LHS, Q)) - return ConstantInt::getTrue(ITy); - return nullptr; } @@ -3774,6 +3771,16 @@ static Value *simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, if (Value *V = simplifyICmpOfBools(Pred, LHS, RHS, Q)) return V; + const APInt *C; + if (match(RHS, m_APIntAllowPoison(C)) && + ICmpInst::isNonStrictPredicate(Pred) && !C->isZero()) { + if (auto Flipped = getFlippedStrictnessPredicateAndConstant( + Pred, ConstantInt::get(LHS->getType(), *C))) { + Pred = Flipped->first; + RHS = Flipped->second; + } + } + // TODO: Sink/common this with other potentially expensive calls that use // ValueTracking? See comment below for isKnownNonEqual(). if (Value *V = simplifyICmpWithZero(Pred, LHS, RHS, Q)) diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll index 97ac8f2ea47ea..2f827f2a8ad23 100644 --- a/llvm/test/Transforms/InstSimplify/compare.ll +++ b/llvm/test/Transforms/InstSimplify/compare.ll @@ -1895,7 +1895,9 @@ define <2 x i1> @icmp_shl_1_ule_signmask_poison(<2 x i8> %V) { define <2 x i1> @icmp_shl_1_ule_signmask_poison2(<2 x i8> %V) { ; CHECK-LABEL: @icmp_shl_1_ule_signmask_poison2( -; CHECK-NEXT: ret <2 x i1> splat (i1 true) +; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i8> , [[V:%.*]] +; CHECK-NEXT: [[CMP:%.*]] = icmp ule <2 x i8> [[SHL]], +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %shl = shl <2 x i8> , %V %cmp = icmp ule <2 x i8> %shl, diff --git a/llvm/test/Transforms/InstSimplify/select-icmp.ll b/llvm/test/Transforms/InstSimplify/select-icmp.ll index 64c0d1d7553fe..0f29998e3fd19 100755 --- a/llvm/test/Transforms/InstSimplify/select-icmp.ll +++ b/llvm/test/Transforms/InstSimplify/select-icmp.ll @@ -1,7 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s -; TODO: https://alive2.llvm.org/ce/z/3ybZRl define i32 @pr54735_slt(i32 %x, i32 %y) { ; CHECK-LABEL: @pr54735_slt( ; CHECK-NEXT: entry: @@ -9,11 +8,8 @@ define i32 @pr54735_slt(i32 %x, i32 %y) { ; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]] ; CHECK: cond.true: ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]] -; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[SUB]], 1 ; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[SUB]], -1 -; CHECK-NEXT: [[ABSCOND:%.*]] = icmp sle i32 [[SUB]], -1 -; CHECK-NEXT: [[ABS:%.*]] = select i1 [[ABSCOND]], i32 [[NEG]], i32 [[ADD]] -; CHECK-NEXT: ret i32 [[ABS]] +; CHECK-NEXT: ret i32 [[NEG]] ; CHECK: cond.end: ; CHECK-NEXT: ret i32 0 ;