Skip to content

Commit 241848b

Browse files
[ConstraintElimination] Extend unsigned-to-signed fact transfer
Minor addition of transferring unsigned facts to signed comparisons. Proofs: https://alive2.llvm.org/ce/z/nqqzHb
1 parent 681315d commit 241848b

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/IR/Function.h"
2626
#include "llvm/IR/GetElementPtrTypeIterator.h"
2727
#include "llvm/IR/IRBuilder.h"
28+
#include "llvm/IR/InstrTypes.h"
2829
#include "llvm/IR/Instructions.h"
2930
#include "llvm/IR/PatternMatch.h"
3031
#include "llvm/IR/Verifier.h"
@@ -748,11 +749,23 @@ void ConstraintInfo::transferToOtherSystem(
748749
default:
749750
break;
750751
case CmpInst::ICMP_ULT:
751-
// If B is a signed positive constant, A >=s 0 and A <s B.
752+
case CmpInst::ICMP_ULE:
753+
// If B is a signed positive constant, then A >=s 0 and A <s (or <=s) B.
752754
if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0))) {
753755
addFact(CmpInst::ICMP_SGE, A, ConstantInt::get(B->getType(), 0), NumIn,
754756
NumOut, DFSInStack);
755-
addFact(CmpInst::ICMP_SLT, A, B, NumIn, NumOut, DFSInStack);
757+
addFact(CmpInst::getSignedPredicate(Pred), A, B, NumIn, NumOut,
758+
DFSInStack);
759+
}
760+
break;
761+
case CmpInst::ICMP_UGE:
762+
case CmpInst::ICMP_UGT:
763+
// If A is a signed positive constant, then B >=s 0 and A >s (or >=s) B.
764+
if (doesHold(CmpInst::ICMP_SGE, A, ConstantInt::get(B->getType(), 0))) {
765+
addFact(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0), NumIn,
766+
NumOut, DFSInStack);
767+
addFact(CmpInst::getSignedPredicate(Pred), A, B, NumIn, NumOut,
768+
DFSInStack);
756769
}
757770
break;
758771
case CmpInst::ICMP_SLT:

llvm/test/Transforms/ConstraintElimination/signed-query-unsigned-system.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ define i1 @sge_no_const_unsigned_uge(i8 %a, i16 %b) {
109109
; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGE_B]])
110110
; CHECK-NEXT: [[B_POS:%.*]] = icmp sge i16 [[B]], 0
111111
; CHECK-NEXT: call void @llvm.assume(i1 [[B_POS]])
112-
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i16 [[EXT]], [[B]]
113-
; CHECK-NEXT: ret i1 [[CMP]]
112+
; CHECK-NEXT: ret i1 true
114113
;
115114
%ext = zext i8 %a to i16
116115
%a.uge.b = icmp uge i16 %ext, %b

llvm/test/Transforms/ConstraintElimination/transfer-unsigned-facts-to-signed.ll

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,8 @@ define i1 @ule_signed_pos_constant_1(i8 %a, i8 %b) {
235235
; CHECK-NEXT: call void @llvm.assume(i1 [[B_NON_NEG]])
236236
; CHECK-NEXT: [[A_ULE_B:%.*]] = icmp ule i8 [[A:%.*]], [[B]]
237237
; CHECK-NEXT: call void @llvm.assume(i1 [[A_ULE_B]])
238-
; CHECK-NEXT: [[SLE_TEST:%.*]] = icmp sle i8 [[A]], [[B]]
239238
; CHECK-NEXT: [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]]
240-
; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 [[SLE_TEST]], [[SLT_TEST]]
239+
; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 true, [[SLT_TEST]]
241240
; CHECK-NEXT: ret i1 [[RESULT_XOR]]
242241
;
243242
%b_non_neg = icmp sge i8 %b, 0
@@ -257,11 +256,8 @@ define i1 @ule_signed_pos_constant_2(i8 %a) {
257256
; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ule i8 [[A:%.*]], 4
258257
; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]]
259258
; CHECK: then:
260-
; CHECK-NEXT: [[T_0:%.*]] = icmp sge i8 [[A]], 0
261-
; CHECK-NEXT: [[T_1:%.*]] = icmp sle i8 [[A]], 4
262-
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_0]], [[T_1]]
263-
; CHECK-NEXT: [[C_0:%.*]] = icmp sle i8 [[A]], 5
264-
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_0]]
259+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true
260+
; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true
265261
; CHECK-NEXT: ret i1 [[RES_2]]
266262
; CHECK: else:
267263
; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0
@@ -300,8 +296,7 @@ define i1 @uge_assumed_positive_values(i8 %a, i8 %b) {
300296
; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])
301297
; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp uge i8 [[A]], [[B:%.*]]
302298
; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])
303-
; CHECK-NEXT: [[RESULT:%.*]] = icmp sge i8 [[A]], [[B]]
304-
; CHECK-NEXT: ret i1 [[RESULT]]
299+
; CHECK-NEXT: ret i1 true
305300
;
306301
%a_non_neg = icmp sge i8 %a, 0
307302
call void @llvm.assume(i1 %a_non_neg)
@@ -319,8 +314,7 @@ define i1 @ugt_assumed_positive_values(i8 %a, i8 %b) {
319314
; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]])
320315
; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp ugt i8 [[A]], [[B:%.*]]
321316
; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]])
322-
; CHECK-NEXT: [[RESULT:%.*]] = icmp sgt i8 [[A]], [[B]]
323-
; CHECK-NEXT: ret i1 [[RESULT]]
317+
; CHECK-NEXT: ret i1 true
324318
;
325319
%a_non_neg = icmp sge i8 %a, 0
326320
call void @llvm.assume(i1 %a_non_neg)

0 commit comments

Comments
 (0)