Skip to content

Commit dd0e727

Browse files
author
v01dxyz
committed
[ConstraintElim] Use SCEV inferred ranges of loop counter
When looking at the loop counter, if the min/max values of the SCEV ranges are relevant (not extremal), add this information as ConditionFacts for the Loop header. It allows icmp simplifications independently of the branch taken, such as using `i <= N` after a block `for(i=0; i<N; i+=1) { ... }`. Fixes #90417
1 parent 2b0604f commit dd0e727

9 files changed

+154
-64
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,45 @@ void State::addInfoForInductions(BasicBlock &BB) {
916916
!SE.isSCEVable(PN->getType()))
917917
return;
918918

919+
auto *AR = dyn_cast_or_null<SCEVAddRecExpr>(SE.getSCEV(PN));
920+
BasicBlock *LoopPred = L->getLoopPredecessor();
921+
if (!AR || AR->getLoop() != L || !LoopPred)
922+
return;
923+
924+
// If SCEV provides relevant range information, we push those facts
925+
// to the worklist relatively to the header node itself (and not its
926+
// successor).
927+
auto UnsignedRange = SE.getUnsignedRange(AR);
928+
auto SignedRange = SE.getSignedRange(AR);
929+
DomTreeNode *DTNHeader = DT.getNode(&BB);
930+
931+
// The range can wrap thus we take Min/Max instead of Lower/Upper
932+
auto UnsignedMin = UnsignedRange.getUnsignedMin();
933+
auto UnsignedMax = UnsignedRange.getUnsignedMax();
934+
if (!UnsignedMax.isMaxValue()) {
935+
WorkList.push_back(FactOrCheck::getConditionFact(
936+
DTNHeader, CmpInst::ICMP_ULE, PN,
937+
Constant::getIntegerValue(PN->getType(), UnsignedMax)));
938+
}
939+
if (!UnsignedMin.isMinValue()) {
940+
WorkList.push_back(FactOrCheck::getConditionFact(
941+
DTNHeader, CmpInst::ICMP_UGE, PN,
942+
Constant::getIntegerValue(PN->getType(), UnsignedMin)));
943+
}
944+
945+
auto SignedMin = SignedRange.getSignedMin();
946+
auto SignedMax = SignedRange.getSignedMax();
947+
if (!SignedMax.isMaxSignedValue()) {
948+
WorkList.push_back(FactOrCheck::getConditionFact(
949+
DTNHeader, CmpInst::ICMP_SLE, PN,
950+
Constant::getIntegerValue(PN->getType(), SignedMax)));
951+
}
952+
if (!SignedMin.isMinSignedValue()) {
953+
WorkList.push_back(FactOrCheck::getConditionFact(
954+
DTNHeader, CmpInst::ICMP_SGE, PN,
955+
Constant::getIntegerValue(PN->getType(), SignedMin)));
956+
}
957+
919958
BasicBlock *InLoopSucc = nullptr;
920959
if (Pred == CmpInst::ICMP_NE)
921960
InLoopSucc = cast<BranchInst>(BB.getTerminator())->getSuccessor(0);
@@ -927,11 +966,6 @@ void State::addInfoForInductions(BasicBlock &BB) {
927966
if (!L->contains(InLoopSucc) || !L->isLoopExiting(&BB) || InLoopSucc == &BB)
928967
return;
929968

930-
auto *AR = dyn_cast_or_null<SCEVAddRecExpr>(SE.getSCEV(PN));
931-
BasicBlock *LoopPred = L->getLoopPredecessor();
932-
if (!AR || AR->getLoop() != L || !LoopPred)
933-
return;
934-
935969
const SCEV *StartSCEV = AR->getStart();
936970
Value *StartValue = nullptr;
937971
if (auto *C = dyn_cast<SCEVConstant>(StartSCEV)) {

llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-base.ll

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@ define void @loop_iv_cond_variable_bound(i32 %n) {
1111
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
1212
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], [[N:%.*]]
1313
; CHECK-NEXT: call void @use(i1 [[T_1]])
14-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0
15-
; CHECK-NEXT: call void @use(i1 [[T_2]])
16-
; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1
17-
; CHECK-NEXT: call void @use(i1 [[T_3]])
14+
; CHECK-NEXT: call void @use(i1 true)
15+
; CHECK-NEXT: call void @use(i1 true)
1816
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], [[N]]
1917
; CHECK-NEXT: call void @use(i1 [[C_1]])
2018
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1
@@ -56,12 +54,9 @@ define void @loop_iv_cond_constant_bound() {
5654
; CHECK-NEXT: br label [[LOOP:%.*]]
5755
; CHECK: loop:
5856
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
59-
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], 2
60-
; CHECK-NEXT: call void @use(i1 [[T_1]])
61-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0
62-
; CHECK-NEXT: call void @use(i1 [[T_2]])
63-
; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1
64-
; CHECK-NEXT: call void @use(i1 [[T_3]])
57+
; CHECK-NEXT: call void @use(i1 true)
58+
; CHECK-NEXT: call void @use(i1 true)
59+
; CHECK-NEXT: call void @use(i1 true)
6560
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], 2
6661
; CHECK-NEXT: call void @use(i1 [[C_1]])
6762
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1

llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,11 @@ define void @loop_phi_pos_start_value(i32 %y, i1 %c, i32 %n) {
1414
; CHECK: loop.latch:
1515
; CHECK-NEXT: call void @use(i1 true)
1616
; CHECK-NEXT: call void @use(i1 false)
17-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[X]], 10
18-
; CHECK-NEXT: call void @use(i1 [[T_2]])
19-
; CHECK-NEXT: [[C_2:%.*]] = icmp sle i32 [[X]], 9
20-
; CHECK-NEXT: call void @use(i1 [[C_2]])
21-
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 9
22-
; CHECK-NEXT: call void @use(i1 [[C_3]])
2317
; CHECK-NEXT: call void @use(i1 true)
24-
; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 9
25-
; CHECK-NEXT: call void @use(i1 [[C_5]])
18+
; CHECK-NEXT: call void @use(i1 false)
19+
; CHECK-NEXT: call void @use(i1 true)
20+
; CHECK-NEXT: call void @use(i1 true)
21+
; CHECK-NEXT: call void @use(i1 true)
2622
; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 1
2723
; CHECK-NEXT: br label [[LOOP_HEADER]]
2824
; CHECK: exit:
@@ -75,8 +71,7 @@ define void @loop_phi_neg_start_value(i32 %y, i1 %c, i32 %n) {
7571
; CHECK: loop.latch:
7672
; CHECK-NEXT: call void @use(i1 true)
7773
; CHECK-NEXT: call void @use(i1 false)
78-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[X]], -10
79-
; CHECK-NEXT: call void @use(i1 [[T_2]])
74+
; CHECK-NEXT: call void @use(i1 true)
8075
; CHECK-NEXT: [[C_2:%.*]] = icmp sle i32 [[X]], 9
8176
; CHECK-NEXT: call void @use(i1 [[C_2]])
8277
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 9
@@ -248,12 +243,11 @@ define void @loop_latch_not_executed_constant_bound(i32 %y, i1 %c) {
248243
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
249244
; CHECK: loop.header:
250245
; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
251-
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[X]], 10
252-
; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
246+
; CHECK-NEXT: br i1 false, label [[LOOP_LATCH]], label [[EXIT]]
253247
; CHECK: loop.latch:
254-
; CHECK-NEXT: call void @use(i1 false)
255248
; CHECK-NEXT: call void @use(i1 true)
256-
; CHECK-NEXT: call void @use(i1 false)
249+
; CHECK-NEXT: call void @use(i1 true)
250+
; CHECK-NEXT: call void @use(i1 true)
257251
; CHECK-NEXT: call void @use(i1 true)
258252
; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1
259253
; CHECK-NEXT: br label [[LOOP_HEADER]]
@@ -299,10 +293,8 @@ define void @loop_iv_cond_variable_bound(i32 %n) {
299293
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
300294
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], [[N:%.*]]
301295
; CHECK-NEXT: call void @use(i1 [[T_1]])
302-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0
303-
; CHECK-NEXT: call void @use(i1 [[T_2]])
304-
; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1
305-
; CHECK-NEXT: call void @use(i1 [[T_3]])
296+
; CHECK-NEXT: call void @use(i1 true)
297+
; CHECK-NEXT: call void @use(i1 true)
306298
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], [[N]]
307299
; CHECK-NEXT: call void @use(i1 [[C_1]])
308300
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1
@@ -362,12 +354,9 @@ define void @loop_iv_cond_constant_bound() {
362354
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
363355
; CHECK: loop.header:
364356
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
365-
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[IV]], 2
366-
; CHECK-NEXT: call void @use(i1 [[T_1]])
367-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i32 [[IV]], 0
368-
; CHECK-NEXT: call void @use(i1 [[T_2]])
369-
; CHECK-NEXT: [[T_3:%.*]] = icmp sge i32 [[IV]], -1
370-
; CHECK-NEXT: call void @use(i1 [[T_3]])
357+
; CHECK-NEXT: call void @use(i1 true)
358+
; CHECK-NEXT: call void @use(i1 true)
359+
; CHECK-NEXT: call void @use(i1 true)
371360
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i32 [[IV]], 2
372361
; CHECK-NEXT: call void @use(i1 [[C_1]])
373362
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[IV]], 1

llvm/test/Transforms/ConstraintElimination/loops.ll

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,12 @@ define i32 @loop_header_dom_successors_flipped(i32 %y, i1 %c) {
107107
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
108108
; CHECK: loop.header:
109109
; CHECK-NEXT: [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
110-
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10
111-
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT]], label [[LOOP_LATCH]]
110+
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP_LATCH]]
112111
; CHECK: loop.latch:
113-
; CHECK-NEXT: call void @use(i1 false)
114112
; CHECK-NEXT: call void @use(i1 true)
115-
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 11
116-
; CHECK-NEXT: call void @use(i1 [[C_2]])
117-
; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 11
118-
; CHECK-NEXT: call void @use(i1 [[C_3]])
113+
; CHECK-NEXT: call void @use(i1 true)
114+
; CHECK-NEXT: call void @use(i1 true)
115+
; CHECK-NEXT: call void @use(i1 true)
119116
; CHECK-NEXT: [[X_NEXT]] = add i32 [[X]], 1
120117
; CHECK-NEXT: br label [[LOOP_HEADER]]
121118
; CHECK: exit:

llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-decrement.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ define void @add_rec_decreasing_2_cond_true_constant(i8 noundef %len) {
197197
; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i8 [[K_0]], 0
198198
; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
199199
; CHECK: loop.latch:
200-
; CHECK-NEXT: [[CMP_NOT_I:%.*]] = icmp ult i8 [[K_0]], 5
201-
; CHECK-NEXT: call void @use(i1 [[CMP_NOT_I]])
200+
; CHECK-NEXT: call void @use(i1 true)
202201
; CHECK-NEXT: [[K_DEC]] = add i8 [[K_0]], -2
203202
; CHECK-NEXT: br label [[LOOP_HEADER]]
204203
; CHECK: exit:

llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-wrapping.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ define void @test_iv_nuw_nsw_1_uge_start(i8 %len.n, i8 %a) {
4949
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
5050
; CHECK: loop.header:
5151
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ -1, [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
52-
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[IV]], 1
53-
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
52+
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
5453
; CHECK: for.body:
5554
; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()
5655
; CHECK-NEXT: br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]
@@ -90,8 +89,7 @@ define void @test_iv_nuw_nsw_2_uge_start(i8 %len.n, i8 %a) {
9089
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
9190
; CHECK: loop.header:
9291
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[START]], [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
93-
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[IV]], 1
94-
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
92+
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
9593
; CHECK: for.body:
9694
; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()
9795
; CHECK-NEXT: br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]
@@ -131,8 +129,7 @@ define void @test_iv_nsw_nuw_1_ult_end(i8 %len.n, i8 %a) {
131129
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
132130
; CHECK: loop.header:
133131
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ -2, [[LOOP_PH:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
134-
; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[IV]], 1
135-
; CHECK-NEXT: br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
132+
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[FOR_BODY:%.*]]
136133
; CHECK: for.body:
137134
; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()
138135
; CHECK-NEXT: br i1 [[C_2]], label [[LOOP_LATCH]], label [[EXIT]]
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3+
4+
define i1 @test_ult_loop_with_ult_icmp_N_at_end(ptr %s) {
5+
; CHECK-LABEL: define i1 @test_ult_loop_with_ult_icmp_N_at_end(
6+
; CHECK-SAME: ptr [[S:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: br label [[WHILE_COND:%.*]]
9+
; CHECK: while.cond:
10+
; CHECK-NEXT: [[I_0:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[WHILE_BODY:%.*]] ]
11+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_0]], 1234
12+
; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_BODY]], label [[WHILE_END:%.*]]
13+
; CHECK: while.body:
14+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 [[I_0]]
15+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
16+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[TMP0]], -48
17+
; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i8 [[TMP1]], 10
18+
; CHECK-NEXT: [[ADD]] = add nuw nsw i64 [[I_0]], 1
19+
; CHECK-NEXT: br i1 [[OR_COND]], label [[WHILE_COND]], label [[WHILE_END]]
20+
; CHECK: while.end:
21+
; CHECK-NEXT: ret i1 true
22+
;
23+
entry:
24+
br label %while.cond
25+
26+
while.cond:
27+
%i.0 = phi i64 [ 0, %entry ], [ %add, %while.body ]
28+
%cmp = icmp ult i64 %i.0, 1234
29+
br i1 %cmp, label %while.body, label %while.end
30+
31+
while.body:
32+
%arrayidx = getelementptr inbounds i8, ptr %s, i64 %i.0
33+
%0 = load i8, ptr %arrayidx, align 1
34+
%1 = add i8 %0, -48
35+
%or.cond = icmp ult i8 %1, 10
36+
%add = add nuw nsw i64 %i.0, 1
37+
br i1 %or.cond, label %while.cond, label %while.end
38+
39+
while.end:
40+
%cmp6 = icmp ult i64 %i.0, 1235
41+
ret i1 %cmp6
42+
}
43+
44+
define i1 @test_eq_loop_with_ult_icmp_N_at_end(ptr %s) {
45+
; CHECK-LABEL: define i1 @test_eq_loop_with_ult_icmp_N_at_end(
46+
; CHECK-SAME: ptr [[S:%.*]]) {
47+
; CHECK-NEXT: entry:
48+
; CHECK-NEXT: br label [[WHILE_COND:%.*]]
49+
; CHECK: while.cond:
50+
; CHECK-NEXT: [[I_0:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[WHILE_BODY:%.*]] ]
51+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[I_0]], 1234
52+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]]
53+
; CHECK: while.body:
54+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i64 [[I_0]]
55+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
56+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[TMP0]], -48
57+
; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i8 [[TMP1]], 10
58+
; CHECK-NEXT: [[ADD]] = add nuw nsw i64 [[I_0]], 1
59+
; CHECK-NEXT: br i1 [[OR_COND]], label [[WHILE_COND]], label [[WHILE_END]]
60+
; CHECK: while.end:
61+
; CHECK-NEXT: ret i1 true
62+
;
63+
entry:
64+
br label %while.cond
65+
66+
while.cond:
67+
%i.0 = phi i64 [ 0, %entry ], [ %add, %while.body ]
68+
%exitcond.not = icmp eq i64 %i.0, 1234
69+
br i1 %exitcond.not, label %while.end, label %while.body
70+
71+
while.body:
72+
%arrayidx = getelementptr inbounds i8, ptr %s, i64 %i.0
73+
%0 = load i8, ptr %arrayidx, align 1
74+
%1 = add i8 %0, -48
75+
%or.cond = icmp ult i8 %1, 10
76+
%add = add nuw nsw i64 %i.0, 1
77+
; %add = add i64 %i.0, 1
78+
br i1 %or.cond, label %while.cond, label %while.end
79+
80+
while.end:
81+
%cmp6 = icmp ult i64 %i.0, 1235
82+
ret i1 %cmp6
83+
}

llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned-is-known-non-negative.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ define void @iv_known_non_negative_constant_trip_count_no_nsw_flag(i8 %N) {
6565
; CHECK-NEXT: call void @use(i1 [[F_1]])
6666
; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 [[N]], [[IV]]
6767
; CHECK-NEXT: call void @use(i1 [[F_2]])
68-
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
69-
; CHECK-NEXT: call void @use(i1 [[C_0]])
68+
; CHECK-NEXT: call void @use(i1 false)
7069
; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1
7170
; CHECK-NEXT: br label [[LOOP_HEADER]]
7271
; CHECK: exit.1:
@@ -153,11 +152,9 @@ define void @iv_may_signed_wrap_variable_trip_count(i8 %N) {
153152
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]
154153
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
155154
; CHECK: loop.latch:
156-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N]], [[IV]]
157-
; CHECK-NEXT: call void @use(i1 [[T_1]])
158155
; CHECK-NEXT: call void @use(i1 true)
159-
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
160-
; CHECK-NEXT: call void @use(i1 [[F_1]])
156+
; CHECK-NEXT: call void @use(i1 true)
157+
; CHECK-NEXT: call void @use(i1 false)
161158
; CHECK-NEXT: call void @use(i1 false)
162159
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
163160
; CHECK-NEXT: call void @use(i1 [[C_0]])

llvm/test/Transforms/ConstraintElimination/transfer-unsigned-facts-to-signed-is-known-non-negative.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ define void @iv_known_non_negative_iv_constant_trip_count_uge() {
99
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
1010
; CHECK: loop.header:
1111
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
12-
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[IV]], 2
13-
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
12+
; CHECK-NEXT: br i1 false, label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
1413
; CHECK: loop.latch:
1514
; CHECK-NEXT: call void @use(i1 true)
1615
; CHECK-NEXT: call void @use(i1 true)
17-
; CHECK-NEXT: call void @use(i1 false)
18-
; CHECK-NEXT: call void @use(i1 false)
16+
; CHECK-NEXT: call void @use(i1 true)
17+
; CHECK-NEXT: call void @use(i1 true)
1918
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
2019
; CHECK-NEXT: br label [[LOOP_HEADER]]
2120
; CHECK: exit.1:

0 commit comments

Comments
 (0)