[llvm] [InstCombine] Remove INT_MIN poison check from abs(X) u< C --> X + (C-1) u<= 2*(C-1) fold. (PR #219264)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 03:19:30 PDT 2026


https://github.com/tadeuszjt updated https://github.com/llvm/llvm-project/pull/219264

>From d3b2e451d9a1b28eac17c5d94e3da081a9cf876e Mon Sep 17 00:00:00 2001
From: Tadeusz Tomoszek <tadeuszjt at protonmail.com>
Date: Thu, 27 Aug 2026 20:33:33 +0200
Subject: [PATCH] [InstCombine] Remove INT_MIN poison check from abs(X) u< C
 --> X + (C-1) u<= 2*(C-1) fold.

---
 llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 7 ++-----
 llvm/test/Transforms/InstCombine/abs-intrinsic.ll       | 8 ++++----
 2 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index dcae505450941..6c486f2cc5e79 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -4432,8 +4432,6 @@ Instruction *InstCombinerImpl::foldICmpIntrinsicWithConstant(ICmpInst &Cmp,
       return nullptr;
 
     Value *X = II->getArgOperand(0);
-    bool IsIntMinPoison =
-        cast<ConstantInt>(II->getArgOperand(1))->getValue().isOne();
 
     // If C >= 0:
     // abs(X) u> C --> X + C u> 2 * C
@@ -4443,13 +4441,12 @@ Instruction *InstCombinerImpl::foldICmpIntrinsicWithConstant(ICmpInst &Cmp,
                           ConstantInt::get(Ty, 2 * C));
     }
 
-    // If abs(INT_MIN) is poison and C >= 1:
+    // If C >= 1:
     // abs(X) u< C --> X + (C - 1) u<= 2 * (C - 1)
-    if (IsIntMinPoison && Pred == CmpInst::ICMP_ULT && C.sge(1)) {
+    if (Pred == CmpInst::ICMP_ULT && C.sge(1))
       return new ICmpInst(ICmpInst::ICMP_ULE,
                           Builder.CreateAdd(X, ConstantInt::get(Ty, C - 1)),
                           ConstantInt::get(Ty, 2 * (C - 1)));
-    }
 
     break;
   }
diff --git a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
index f93d0b366ef11..5e063e8d4febb 100644
--- a/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
+++ b/llvm/test/Transforms/InstCombine/abs-intrinsic.ll
@@ -1010,8 +1010,8 @@ define i8 @abs_diff_sle_y_x(i8 %x, i8 %y) {
 
 define i1 @abs_cmp_ule_no_poison(i32 %x) {
 ; CHECK-LABEL: @abs_cmp_ule_no_poison(
-; CHECK-NEXT:    [[X_ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X_ABS]], 32
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 31
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[TMP1]], 63
 ; CHECK-NEXT:    ret i1 [[CMP]]
 ;
   %x.abs = call i32 @llvm.abs.i32(i32 %x, i1 false)
@@ -1058,8 +1058,8 @@ define i1 @abs_cmp_ule_poison_multiuse(i32 %x) {
 
 define i1 @abs_cmp_ult_no_poison(i32 %x) {
 ; CHECK-LABEL: @abs_cmp_ult_no_poison(
-; CHECK-NEXT:    [[X_ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)
-; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X_ABS]], 32
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[X:%.*]], 31
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[TMP1]], 63
 ; CHECK-NEXT:    ret i1 [[CMP]]
 ;
   %x.abs = call i32 @llvm.abs.i32(i32 %x, i1 false)



More information about the llvm-commits mailing list