[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