Skip to content

Commit b7b8d02

Browse files
committed
[ConstraintElim] Add induction tests with different start values.
Extra tests for #94610.
1 parent 505cd12 commit b7b8d02

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -p constraint-elimination -S %s | FileCheck %s
33

4+
declare void @llvm.assume(i1)
5+
46
define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known(ptr %s) {
57
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known(
68
; CHECK-SAME: ptr [[S:%.*]]) {
@@ -40,6 +42,170 @@ exit:
4042
ret i1 %t
4143
}
4244

45+
define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value(ptr %s) {
46+
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value(
47+
; CHECK-SAME: ptr [[S:%.*]]) {
48+
; CHECK-NEXT: [[ENTRY:.*]]:
49+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
50+
; CHECK: [[LOOP_HEADER]]:
51+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1235, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
52+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234
53+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
54+
; CHECK: [[LOOP_LATCH]]:
55+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]
56+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
57+
; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10
58+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
59+
; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]
60+
; CHECK: [[EXIT]]:
61+
; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1235
62+
; CHECK-NEXT: ret i1 [[T]]
63+
;
64+
entry:
65+
br label %loop.header
66+
67+
loop.header:
68+
%iv = phi i32 [ 1235, %entry ], [ %iv.next, %loop.latch ]
69+
%exitcond.not = icmp eq i32 %iv, 1234
70+
br i1 %exitcond.not, label %exit, label %loop.latch
71+
72+
loop.latch:
73+
%arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv
74+
%0 = load i8, ptr %arrayidx, align 1
75+
%latch.c = icmp ult i8 %0, 10
76+
%iv.next = add i32 %iv, 1
77+
br i1 %latch.c, label %loop.header, label %exit
78+
79+
exit:
80+
%t = icmp ult i32 %iv, 1235
81+
ret i1 %t
82+
}
83+
84+
define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value(ptr %s, i32 %start) {
85+
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value(
86+
; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {
87+
; CHECK-NEXT: [[ENTRY:.*]]:
88+
; CHECK-NEXT: [[PRE_C:%.*]] = icmp ule i32 [[START]], 1234
89+
; CHECK-NEXT: call void @llvm.assume(i1 [[PRE_C]])
90+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
91+
; CHECK: [[LOOP_HEADER]]:
92+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
93+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234
94+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
95+
; CHECK: [[LOOP_LATCH]]:
96+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]
97+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
98+
; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10
99+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
100+
; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]
101+
; CHECK: [[EXIT]]:
102+
; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1235
103+
; CHECK-NEXT: ret i1 [[T]]
104+
;
105+
entry:
106+
%pre.c = icmp ule i32 %start, 1234
107+
call void @llvm.assume(i1 %pre.c)
108+
br label %loop.header
109+
110+
loop.header:
111+
%iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]
112+
%exitcond.not = icmp eq i32 %iv, 1234
113+
br i1 %exitcond.not, label %exit, label %loop.latch
114+
115+
loop.latch:
116+
%arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv
117+
%0 = load i8, ptr %arrayidx, align 1
118+
%latch.c = icmp ult i8 %0, 10
119+
%iv.next = add i32 %iv, 1
120+
br i1 %latch.c, label %loop.header, label %exit
121+
122+
exit:
123+
%t = icmp ult i32 %iv, 1235
124+
ret i1 %t
125+
}
126+
127+
define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value(ptr %s, i32 %start) {
128+
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value(
129+
; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {
130+
; CHECK-NEXT: [[ENTRY:.*]]:
131+
; CHECK-NEXT: [[PRE_C:%.*]] = icmp ule i32 [[START]], 1236
132+
; CHECK-NEXT: call void @llvm.assume(i1 [[PRE_C]])
133+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
134+
; CHECK: [[LOOP_HEADER]]:
135+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
136+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234
137+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
138+
; CHECK: [[LOOP_LATCH]]:
139+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]
140+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
141+
; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10
142+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
143+
; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]
144+
; CHECK: [[EXIT]]:
145+
; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1236
146+
; CHECK-NEXT: ret i1 [[T]]
147+
;
148+
entry:
149+
%pre.c = icmp ule i32 %start, 1236
150+
call void @llvm.assume(i1 %pre.c)
151+
br label %loop.header
152+
153+
loop.header:
154+
%iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]
155+
%exitcond.not = icmp eq i32 %iv, 1234
156+
br i1 %exitcond.not, label %exit, label %loop.latch
157+
158+
loop.latch:
159+
%arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv
160+
%0 = load i8, ptr %arrayidx, align 1
161+
%latch.c = icmp ult i8 %0, 10
162+
%iv.next = add i32 %iv, 1
163+
br i1 %latch.c, label %loop.header, label %exit
164+
165+
exit:
166+
%t = icmp ult i32 %iv, 1236
167+
ret i1 %t
168+
}
169+
170+
define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond(ptr %s, i32 %start) {
171+
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond(
172+
; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {
173+
; CHECK-NEXT: [[ENTRY:.*]]:
174+
; CHECK-NEXT: br label %[[LOOP_HEADER:.*]]
175+
; CHECK: [[LOOP_HEADER]]:
176+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]
177+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234
178+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]
179+
; CHECK: [[LOOP_LATCH]]:
180+
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]
181+
; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
182+
; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10
183+
; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
184+
; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]
185+
; CHECK: [[EXIT]]:
186+
; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1236
187+
; CHECK-NEXT: ret i1 [[T]]
188+
;
189+
entry:
190+
br label %loop.header
191+
192+
loop.header:
193+
%iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]
194+
%exitcond.not = icmp eq i32 %iv, 1234
195+
br i1 %exitcond.not, label %exit, label %loop.latch
196+
197+
loop.latch:
198+
%arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv
199+
%0 = load i8, ptr %arrayidx, align 1
200+
%latch.c = icmp ult i8 %0, 10
201+
%iv.next = add i32 %iv, 1
202+
br i1 %latch.c, label %loop.header, label %exit
203+
204+
exit:
205+
%t = icmp ult i32 %iv, 1236
206+
ret i1 %t
207+
}
208+
43209
define i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known(ptr %s, i1 %pre.c, i32 %x) {
44210
; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known(
45211
; CHECK-SAME: ptr [[S:%.*]], i1 [[PRE_C:%.*]], i32 [[X:%.*]]) {

0 commit comments

Comments
 (0)