[llvm] [InstSimplify] Canonicalize `X uge 1` to `X ne 0` and `X sle -1` to `X slt 0` in `simplifyICmpInst` (PR #151642)
Iris Shi via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 31 22:26:50 PDT 2025
https://github.com/el-ev created https://github.com/llvm/llvm-project/pull/151642
Mentioned in https://github.com/llvm/llvm-project/pull/145204/files#r2160245896.
>From dbbdf3efe56adcc0b11aa152945e508e08e0d85f Mon Sep 17 00:00:00 2001
From: Iris Shi <0.0 at owo.li>
Date: Fri, 1 Aug 2025 13:23:51 +0800
Subject: [PATCH] [InstSimplify] Canonicalize `X uge 1` to `X ne 0` and `X sle
-1` to `X slt 0` in `simplifyICmpInst`
---
llvm/lib/Analysis/InstructionSimplify.cpp | 14 +++++++++++---
llvm/test/Transforms/InstSimplify/select-icmp.ll | 6 +-----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 5907e21065331..3e54fce46b8da 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,17 @@ 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))) {
+ if (Pred == ICmpInst::ICMP_UGE && C->isOne()) {
+ Pred = ICmpInst::ICMP_NE;
+ RHS = ConstantInt::get(RHS->getType(), 0);
+ } else if (Pred == ICmpInst::ICMP_SLE && C->isAllOnes()) {
+ Pred = ICmpInst::ICMP_SLT;
+ RHS = ConstantInt::get(RHS->getType(), 0);
+ }
+ }
+
// 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/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
;
More information about the llvm-commits
mailing list