[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