[llvm] [InstSimplify] Simplify (X - (X urem Y)) u>= 1 via X u>= Y (PR #216072)
Hadong Lee via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 15 01:07:04 PDT 2026
https://github.com/ChrisLee02 updated https://github.com/llvm/llvm-project/pull/216072
>From cf89efd729925f7ed3e07cededfb79eb82a8b28f Mon Sep 17 00:00:00 2001
From: Chrislee02 <hdchris765 at snu.ac.kr>
Date: Sat, 15 Aug 2026 16:26:17 +0900
Subject: [PATCH 1/2] [InstSimplify] Add tests for simplifying nonzero
comparisons of X - (X urem Y) via X u>= Y
---
.../Transforms/InstSimplify/domcondition.ll | 304 ++++++++++++++++++
1 file changed, 304 insertions(+)
diff --git a/llvm/test/Transforms/InstSimplify/domcondition.ll b/llvm/test/Transforms/InstSimplify/domcondition.ll
index 2893bb155bbe7..ea12e94055f7c 100644
--- a/llvm/test/Transforms/InstSimplify/domcondition.ll
+++ b/llvm/test/Transforms/InstSimplify/domcondition.ll
@@ -118,6 +118,310 @@ cond.end:
ret i32 %cond
}
+; Direct isKnownNonEqual tests.
+
+; X != X urem Y is true if X u>= Y.
+define i1 @urem_not_equal_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_not_equal_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[X]], [[REM]]
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %cmp = icmp ne i64 %x, %rem
+ ret i1 %cmp
+
+exit:
+ ret i1 false
+}
+
+; X urem Y == X is false if X u>= Y.
+define i1 @urem_equal_commuted_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_equal_commuted_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[REM]], [[X]]
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 true
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %cmp = icmp eq i64 %rem, %x
+ ret i1 %cmp
+
+exit:
+ ret i1 true
+}
+
+; Equivalent comparisons against one.
+
+; (X - (X urem Y)) u>= 1 is true if X u>= Y.
+define i1 @urem_sub_uge_one_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_uge_one_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp uge i64 [[SUB]], 1
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp uge i64 %sub, 1
+ ret i1 %cmp
+
+exit:
+ ret i1 false
+}
+
+; (X - (X urem Y)) u< 1 is false if X u>= Y.
+define i1 @urem_sub_ult_one_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_ult_one_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[SUB]], 1
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 true
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ult i64 %sub, 1
+ ret i1 %cmp
+
+exit:
+ ret i1 true
+}
+
+; Equivalent unsigned comparisons against zero.
+
+; (X - (X urem Y)) u> 0 is true if X u>= Y.
+define i1 @urem_sub_ugt_zero_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_ugt_zero_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ugt i64 %sub, 0
+ ret i1 %cmp
+
+exit:
+ ret i1 false
+}
+
+; (X - (X urem Y)) u<= 0 is false if X u>= Y.
+define i1 @urem_sub_ule_zero_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_ule_zero_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 true
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ule i64 %sub, 0
+ ret i1 %cmp
+
+exit:
+ ret i1 true
+}
+
+; Equality comparisons against zero.
+
+; (X - (X urem Y)) != 0 is true if X u>= Y.
+define i1 @urem_sub_ne_zero_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_ne_zero_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ne i64 %sub, 0
+ ret i1 %cmp
+
+exit:
+ ret i1 false
+}
+
+; (X - (X urem Y)) == 0 is false if X u>= Y.
+define i1 @urem_sub_eq_zero_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_eq_zero_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 true
+;
+entry:
+ %cond = icmp uge i64 %x, %y
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp eq i64 %sub, 0
+ ret i1 %cmp
+
+exit:
+ ret i1 true
+}
+
+; Intrinsic user.
+
+declare i64 @llvm.umax.i64(i64, i64)
+
+; umax(X - (X urem Y), 1) is X - (X urem Y) if X u>= Y.
+define i64 @urem_sub_umax_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_umax_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp ult i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[EXIT:%.*]], label [[KNOWN:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[SUB]], i64 1)
+; CHECK-NEXT: ret i64 [[MAX]]
+; CHECK: exit:
+; CHECK-NEXT: ret i64 0
+;
+entry:
+ %cond = icmp ult i64 %x, %y
+ br i1 %cond, label %exit, label %known
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %max = call i64 @llvm.umax.i64(i64 %sub, i64 1)
+ ret i64 %max
+
+exit:
+ ret i64 0
+}
+
+; Negative tests.
+
+; Do not simplify (X - (X urem Y)) != 0 without a dominating condition.
+define i1 @urem_sub_nonzero_no_domcondition(i64 %x, i64 %y) {
+; CHECK-LABEL: @urem_sub_nonzero_no_domcondition(
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+;
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ne i64 %sub, 0
+ ret i1 %cmp
+}
+
+; Do not simplify using X u>= Z when the remainder divisor is Y.
+define i1 @urem_sub_nonzero_wrong_divisor_domcondition(i64 %x, i64 %y, i64 %z) {
+; CHECK-LABEL: @urem_sub_nonzero_wrong_divisor_domcondition(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Z:%.*]]
+; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
+; CHECK: known:
+; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y:%.*]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUB]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK: exit:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp uge i64 %x, %z
+ br i1 %cond, label %known, label %exit
+
+known:
+ %rem = urem i64 %x, %y
+ %sub = sub i64 %x, %rem
+ %cmp = icmp ne i64 %sub, 0
+ ret i1 %cmp
+
+exit:
+ ret i1 false
+}
+
define i32 @srem_domcondition(i32 %x, i32 %y) {
; CHECK-LABEL: @srem_domcondition(
; CHECK-NEXT: entry:
>From 95a17b5f5a63d7b944d7b2631ecf1fbb8b13eea0 Mon Sep 17 00:00:00 2001
From: Chrislee02 <hdchris765 at snu.ac.kr>
Date: Sat, 15 Aug 2026 17:06:49 +0900
Subject: [PATCH 2/2] [InstSimplify] Simplify nonzero comparisons involving X
urem Y via X u>= Y
---
llvm/lib/Analysis/ValueTracking.cpp | 19 +++++++++
.../Transforms/InstSimplify/domcondition.ll | 41 ++++---------------
2 files changed, 28 insertions(+), 32 deletions(-)
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 28d47d8f7df27..f29abbade46b1 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4116,6 +4116,21 @@ static bool isNonEqualPointersWithRecursiveGEP(const Value *A, const Value *B,
(StartOffset.sle(OffsetB) && StepOffset.isNegative()));
}
+static bool isNonEqualURemFromDomCondition(const Value *X, const Value *Rem,
+ const SimplifyQuery &Q) {
+ // Match Rem as a urem of X and Y.
+ const Value *Y;
+ if (!match(Rem, m_URem(m_Specific(X), m_Value(Y))))
+ return false;
+
+ // For a defined urem, X != X urem Y exactly when X u>= Y.
+ // Check whether a dominating branch condition implies that relationship
+ // between X and Y.
+ std::optional<bool> Implied =
+ isImpliedByDomCondition(ICmpInst::ICMP_UGE, X, Y, Q.CxtI, Q.DL);
+ return Implied && *Implied;
+}
+
static bool isKnownNonEqualFromContext(const Value *V1, const Value *V2,
const SimplifyQuery &Q, unsigned Depth) {
if (!Q.CxtI)
@@ -4244,6 +4259,10 @@ static bool isKnownNonEqual(const Value *V1, const Value *V2,
match(V2, m_PtrToIntSameSize(Q.DL, m_Value(B))))
return isKnownNonEqual(A, B, DemandedElts, Q, Depth + 1);
+ if (isNonEqualURemFromDomCondition(V1, V2, Q) ||
+ isNonEqualURemFromDomCondition(V2, V1, Q))
+ return true;
+
if (isKnownNonEqualFromContext(V1, V2, Q, Depth))
return true;
diff --git a/llvm/test/Transforms/InstSimplify/domcondition.ll b/llvm/test/Transforms/InstSimplify/domcondition.ll
index ea12e94055f7c..babeb4f0db499 100644
--- a/llvm/test/Transforms/InstSimplify/domcondition.ll
+++ b/llvm/test/Transforms/InstSimplify/domcondition.ll
@@ -127,9 +127,7 @@ define i1 @urem_not_equal_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[X]], [[REM]]
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 true
; CHECK: exit:
; CHECK-NEXT: ret i1 false
;
@@ -153,9 +151,7 @@ define i1 @urem_equal_commuted_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[REM]], [[X]]
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 false
; CHECK: exit:
; CHECK-NEXT: ret i1 true
;
@@ -181,10 +177,7 @@ define i1 @urem_sub_uge_one_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp uge i64 [[SUB]], 1
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 true
; CHECK: exit:
; CHECK-NEXT: ret i1 false
;
@@ -209,10 +202,7 @@ define i1 @urem_sub_ult_one_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[SUB]], 1
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 false
; CHECK: exit:
; CHECK-NEXT: ret i1 true
;
@@ -239,10 +229,7 @@ define i1 @urem_sub_ugt_zero_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SUB]], 0
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 true
; CHECK: exit:
; CHECK-NEXT: ret i1 false
;
@@ -267,10 +254,7 @@ define i1 @urem_sub_ule_zero_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SUB]], 0
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 false
; CHECK: exit:
; CHECK-NEXT: ret i1 true
;
@@ -297,10 +281,7 @@ define i1 @urem_sub_ne_zero_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[SUB]], 0
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 true
; CHECK: exit:
; CHECK-NEXT: ret i1 false
;
@@ -325,10 +306,7 @@ define i1 @urem_sub_eq_zero_domcondition(i64 %x, i64 %y) {
; CHECK-NEXT: [[COND:%.*]] = icmp uge i64 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: br i1 [[COND]], label [[KNOWN:%.*]], label [[EXIT:%.*]]
; CHECK: known:
-; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
-; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[SUB]], 0
-; CHECK-NEXT: ret i1 [[CMP]]
+; CHECK-NEXT: ret i1 false
; CHECK: exit:
; CHECK-NEXT: ret i1 true
;
@@ -359,8 +337,7 @@ define i64 @urem_sub_umax_domcondition(i64 %x, i64 %y) {
; CHECK: known:
; CHECK-NEXT: [[REM:%.*]] = urem i64 [[X]], [[Y]]
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[REM]]
-; CHECK-NEXT: [[MAX:%.*]] = call i64 @llvm.umax.i64(i64 [[SUB]], i64 1)
-; CHECK-NEXT: ret i64 [[MAX]]
+; CHECK-NEXT: ret i64 [[SUB]]
; CHECK: exit:
; CHECK-NEXT: ret i64 0
;
More information about the llvm-commits
mailing list