[llvm] InstSimplify: teach simplifyICmpWithConstant about samesign (PR #125899)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 17 03:17:38 PST 2025
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/125899
>From d6dc5554e4e50d942d1a29a7c60886bc1bc22d10 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Wed, 5 Feb 2025 15:56:35 +0000
Subject: [PATCH 1/3] ValueTracking: pre-commit constrange-samesign tests
---
.../Analysis/ValueTracking/constant-ranges.ll | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/llvm/test/Analysis/ValueTracking/constant-ranges.ll b/llvm/test/Analysis/ValueTracking/constant-ranges.ll
index c440cfad889d3..7a4b9f7ed645a 100644
--- a/llvm/test/Analysis/ValueTracking/constant-ranges.ll
+++ b/llvm/test/Analysis/ValueTracking/constant-ranges.ll
@@ -160,6 +160,15 @@ define i1 @srem_posC_okay0(i8 %x) {
ret i1 %r
}
+define i1 @srem_posC_okay0_samesign(i8 %x) {
+; CHECK-LABEL: @srem_posC_okay0_samesign(
+; CHECK-NEXT: ret i1 true
+;
+ %val = srem i8 34, %x
+ %r = icmp samesign ule i8 %val, 34
+ ret i1 %r
+}
+
define i1 @srem_posC_okay1(i8 %x) {
; CHECK-LABEL: @srem_posC_okay1(
; CHECK-NEXT: ret i1 true
@@ -169,6 +178,15 @@ define i1 @srem_posC_okay1(i8 %x) {
ret i1 %r
}
+define i1 @srem_posC_okay1_samesign(i8 %x) {
+; CHECK-LABEL: @srem_posC_okay1_samesign(
+; CHECK-NEXT: ret i1 false
+;
+ %val = srem i8 34, %x
+ %r = icmp samesign uge i8 %val, -3
+ ret i1 %r
+}
+
define i1 @srem_negC_okay0(i8 %x) {
; CHECK-LABEL: @srem_negC_okay0(
; CHECK-NEXT: ret i1 true
@@ -178,6 +196,17 @@ define i1 @srem_negC_okay0(i8 %x) {
ret i1 %r
}
+define i1 @srem_negC_okay0_samesign(i8 %x) {
+; CHECK-LABEL: @srem_negC_okay0_samesign(
+; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
+; CHECK-NEXT: [[R:%.*]] = icmp samesign ule i8 [[VAL]], 0
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %val = srem i8 -34, %x
+ %r = icmp samesign ule i8 %val, 0
+ ret i1 %r
+}
+
define i1 @srem_negC_okay1(i8 %x) {
; CHECK-LABEL: @srem_negC_okay1(
; CHECK-NEXT: ret i1 true
@@ -187,6 +216,17 @@ define i1 @srem_negC_okay1(i8 %x) {
ret i1 %r
}
+define i1 @srem_negC_okay1_samesign(i8 %x) {
+; CHECK-LABEL: @srem_negC_okay1_samesign(
+; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
+; CHECK-NEXT: [[R:%.*]] = icmp samesign uge i8 [[VAL]], -34
+; CHECK-NEXT: ret i1 [[R]]
+;
+ %val = srem i8 -34, %x
+ %r = icmp samesign uge i8 %val, -34
+ ret i1 %r
+}
+
define i1 @srem_posC_fail0(i8 %x) {
; CHECK-LABEL: @srem_posC_fail0(
; CHECK-NEXT: [[VAL:%.*]] = srem i8 34, [[X:%.*]]
>From e86e62629eb39e730e0fe445df4db3897d96812a Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Fri, 14 Feb 2025 16:25:17 +0000
Subject: [PATCH 2/3] InstSimplify: teach simplifyICmpWithConstant about
samesign
---
llvm/lib/Analysis/InstructionSimplify.cpp | 37 ++++++++++++-------
.../Analysis/ValueTracking/constant-ranges.ll | 8 +---
2 files changed, 26 insertions(+), 19 deletions(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index d25c1eecaf1ca..7edb243aae0e6 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2999,21 +2999,32 @@ static Value *simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS,
return ConstantInt::getBool(ITy, !TrueIfSigned);
}
- // Rule out tautological comparisons (eg., ult 0 or uge 0).
- ConstantRange RHS_CR = ConstantRange::makeExactICmpRegion(Pred, *C);
- if (RHS_CR.isEmptySet())
- return ConstantInt::getFalse(ITy);
- if (RHS_CR.isFullSet())
- return ConstantInt::getTrue(ITy);
-
- ConstantRange LHS_CR =
+ ConstantRange LCR =
computeConstantRange(LHS, CmpInst::isSigned(Pred), IIQ.UseInstrInfo);
- if (!LHS_CR.isFullSet()) {
- if (RHS_CR.contains(LHS_CR))
- return ConstantInt::getTrue(ITy);
- if (RHS_CR.inverse().contains(LHS_CR))
+
+ auto CheckCR = [&](const ConstantRange &CR) -> Constant * {
+ // Rule out tautological comparisons (eg., ult 0 or uge 0).
+ if (CR.isEmptySet())
return ConstantInt::getFalse(ITy);
- }
+ if (CR.isFullSet())
+ return ConstantInt::getTrue(ITy);
+
+ if (!LCR.isFullSet()) {
+ if (CR.contains(LCR))
+ return ConstantInt::getTrue(ITy);
+ if (CR.inverse().contains(LCR))
+ return ConstantInt::getFalse(ITy);
+ }
+ return nullptr;
+ };
+
+ // Check unsigned and signed versions of relational predicates with samesign.
+ if (auto *K = CheckCR(ConstantRange::makeExactICmpRegion(Pred, *C)))
+ return K;
+ if (Pred.hasSameSign() && ICmpInst::isRelational(Pred))
+ if (auto *K = CheckCR(ConstantRange::makeExactICmpRegion(
+ ICmpInst::getSignedPredicate(Pred), *C)))
+ return K;
// (mul nuw/nsw X, MulC) != C --> true (if C is not a multiple of MulC)
// (mul nuw/nsw X, MulC) == C --> false (if C is not a multiple of MulC)
diff --git a/llvm/test/Analysis/ValueTracking/constant-ranges.ll b/llvm/test/Analysis/ValueTracking/constant-ranges.ll
index 7a4b9f7ed645a..714345ba3d3f7 100644
--- a/llvm/test/Analysis/ValueTracking/constant-ranges.ll
+++ b/llvm/test/Analysis/ValueTracking/constant-ranges.ll
@@ -198,9 +198,7 @@ define i1 @srem_negC_okay0(i8 %x) {
define i1 @srem_negC_okay0_samesign(i8 %x) {
; CHECK-LABEL: @srem_negC_okay0_samesign(
-; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
-; CHECK-NEXT: [[R:%.*]] = icmp samesign ule i8 [[VAL]], 0
-; CHECK-NEXT: ret i1 [[R]]
+; CHECK-NEXT: ret i1 true
;
%val = srem i8 -34, %x
%r = icmp samesign ule i8 %val, 0
@@ -218,9 +216,7 @@ define i1 @srem_negC_okay1(i8 %x) {
define i1 @srem_negC_okay1_samesign(i8 %x) {
; CHECK-LABEL: @srem_negC_okay1_samesign(
-; CHECK-NEXT: [[VAL:%.*]] = srem i8 -34, [[X:%.*]]
-; CHECK-NEXT: [[R:%.*]] = icmp samesign uge i8 [[VAL]], -34
-; CHECK-NEXT: ret i1 [[R]]
+; CHECK-NEXT: ret i1 true
;
%val = srem i8 -34, %x
%r = icmp samesign uge i8 %val, -34
>From bb06f654b4f81002307ef30774fea9e7756edefa Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Mon, 17 Feb 2025 11:16:56 +0000
Subject: [PATCH 3/3] InstSimplify: check UseInstrInfo; address review
---
llvm/lib/Analysis/InstructionSimplify.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 7edb243aae0e6..fe0e1c3c98fbd 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -3021,7 +3021,7 @@ static Value *simplifyICmpWithConstant(CmpPredicate Pred, Value *LHS,
// Check unsigned and signed versions of relational predicates with samesign.
if (auto *K = CheckCR(ConstantRange::makeExactICmpRegion(Pred, *C)))
return K;
- if (Pred.hasSameSign() && ICmpInst::isRelational(Pred))
+ if (IIQ.UseInstrInfo && Pred.hasSameSign() && ICmpInst::isRelational(Pred))
if (auto *K = CheckCR(ConstantRange::makeExactICmpRegion(
ICmpInst::getSignedPredicate(Pred), *C)))
return K;
More information about the llvm-commits
mailing list