[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