[llvm] 11cc8d8 - [ConstraintElim] Transfer SLE facts to unsigned (#209623)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 15 04:16:36 PDT 2026


Author: Florian Hahn
Date: 2026-07-15T11:16:31Z
New Revision: 11cc8d876e2bb696fef7079eed0a1ff574c0770f

URL: https://github.com/llvm/llvm-project/commit/11cc8d876e2bb696fef7079eed0a1ff574c0770f
DIFF: https://github.com/llvm/llvm-project/commit/11cc8d876e2bb696fef7079eed0a1ff574c0770f.diff

LOG: [ConstraintElim] Transfer SLE facts to unsigned (#209623)

Handle SLE analogous to SLT via getUnsignedPredicate.

Alive2 Proof: https://alive2.llvm.org/ce/z/yNjmL8

PR: https://github.com/llvm/llvm-project/pull/209623

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
    llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 5c0377c454dd5..b82f4669262a4 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -907,8 +907,10 @@ void ConstraintInfo::transferToOtherSystem(
     }
     break;
   case CmpInst::ICMP_SLT:
+  case CmpInst::ICMP_SLE:
     if (IsKnownNonNegative(A))
-      addFact(CmpInst::ICMP_ULT, A, B, NumIn, NumOut, DFSInStack);
+      addFact(ICmpInst::getUnsignedPredicate(Pred), A, B, NumIn, NumOut,
+              DFSInStack);
     break;
   case CmpInst::ICMP_SGT: {
     if (doesHold(CmpInst::ICMP_SGE, B, Constant::getAllOnesValue(B->getType())))

diff  --git a/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll b/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
index 945ebef67c674..dc2a441bbfad7 100644
--- a/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
+++ b/llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned.ll
@@ -738,9 +738,8 @@ define i1 @sle_a_known_pos(i8 %a, i8 %b) {
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[A_POS]])
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 [[A]], [[B:%.*]]
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]])
-; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[A]], [[B]]
 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[A]], [[B]]
-; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, [[C_1]]
 ; CHECK-NEXT:    ret i1 [[RES]]
 ;
 entry:
@@ -761,9 +760,7 @@ define i1 @sle_first_op_known_pos(i8 %idx) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i8 2, [[IDX:%.*]]
 ; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP]])
-; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 2, [[IDX]]
-; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i8 1, [[IDX]]
-; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 3, [[IDX]]
 ; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_1]]
 ; CHECK-NEXT:    ret i1 [[RES_2]]
@@ -788,8 +785,7 @@ define i1 @sle_len_known_positive_via_idx(i8 %len, i8 %idx) {
 ; CHECK-NEXT:    [[AND_1:%.*]] = and i1 [[IDX_POS]], [[IDX_SLE_LEN]]
 ; CHECK-NEXT:    br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]]
 ; CHECK:       then.1:
-; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[IDX]], [[LEN]]
-; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[T_1]], true
+; CHECK-NEXT:    [[RES:%.*]] = xor i1 true, true
 ; CHECK-NEXT:    ret i1 [[RES]]
 ; CHECK:       else:
 ; CHECK-NEXT:    ret i1 false


        


More information about the llvm-commits mailing list