Skip to content

Commit 87f1cf0

Browse files
committed
[ConstraintElim] Add tests for int phi with non-one step (NFC)
1 parent dd4dc21 commit 87f1cf0

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -passes=constraint-elimination < %s | FileCheck %s
3+
4+
define void @multiple_pow2(i64 %count) {
5+
; CHECK-LABEL: define void @multiple_pow2(
6+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[END:%.*]] = shl i64 [[COUNT]], 2
9+
; CHECK-NEXT: br label [[LOOP:%.*]]
10+
; CHECK: loop:
11+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
12+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
13+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
14+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
15+
; CHECK: loop.latch:
16+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
17+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
18+
; CHECK: exit:
19+
; CHECK-NEXT: ret void
20+
;
21+
entry:
22+
%end = shl i64 %count, 2
23+
br label %loop
24+
25+
loop:
26+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
27+
%iv.next = add i64 %iv, 4
28+
%cmp.i.not = icmp eq i64 %iv, %end
29+
br i1 %cmp.i.not, label %exit, label %loop.latch
30+
31+
loop.latch:
32+
%cmp2.i.i = icmp ult i64 %iv, %end
33+
br i1 %cmp2.i.i, label %loop, label %exit
34+
35+
exit:
36+
ret void
37+
}
38+
39+
define void @multiple_pow2_larger_than_needed(i64 %count) {
40+
; CHECK-LABEL: define void @multiple_pow2_larger_than_needed(
41+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
42+
; CHECK-NEXT: entry:
43+
; CHECK-NEXT: [[END:%.*]] = shl i64 [[COUNT]], 3
44+
; CHECK-NEXT: br label [[LOOP:%.*]]
45+
; CHECK: loop:
46+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
47+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
48+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
49+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
50+
; CHECK: loop.latch:
51+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
52+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
53+
; CHECK: exit:
54+
; CHECK-NEXT: ret void
55+
;
56+
entry:
57+
%end = shl i64 %count, 3
58+
br label %loop
59+
60+
loop:
61+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
62+
%iv.next = add i64 %iv, 4
63+
%cmp.i.not = icmp eq i64 %iv, %end
64+
br i1 %cmp.i.not, label %exit, label %loop.latch
65+
66+
loop.latch:
67+
%cmp2.i.i = icmp ult i64 %iv, %end
68+
br i1 %cmp2.i.i, label %loop, label %exit
69+
70+
exit:
71+
ret void
72+
}
73+
74+
define void @multiple_pow2_too_small(i64 %count) {
75+
; CHECK-LABEL: define void @multiple_pow2_too_small(
76+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
77+
; CHECK-NEXT: entry:
78+
; CHECK-NEXT: [[END:%.*]] = shl i64 [[COUNT]], 1
79+
; CHECK-NEXT: br label [[LOOP:%.*]]
80+
; CHECK: loop:
81+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
82+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
83+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
84+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
85+
; CHECK: loop.latch:
86+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
87+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
88+
; CHECK: exit:
89+
; CHECK-NEXT: ret void
90+
;
91+
entry:
92+
%end = shl i64 %count, 1
93+
br label %loop
94+
95+
loop:
96+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
97+
%iv.next = add i64 %iv, 4
98+
%cmp.i.not = icmp eq i64 %iv, %end
99+
br i1 %cmp.i.not, label %exit, label %loop.latch
100+
101+
loop.latch:
102+
%cmp2.i.i = icmp ult i64 %iv, %end
103+
br i1 %cmp2.i.i, label %loop, label %exit
104+
105+
exit:
106+
ret void
107+
}
108+
109+
define void @multiple_pow2_start_offset(i64 %count) {
110+
; CHECK-LABEL: define void @multiple_pow2_start_offset(
111+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
112+
; CHECK-NEXT: entry:
113+
; CHECK-NEXT: [[END:%.*]] = shl i64 [[COUNT]], 2
114+
; CHECK-NEXT: [[PRECOND:%.*]] = icmp ugt i64 [[END]], 4
115+
; CHECK-NEXT: br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
116+
; CHECK: loop:
117+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 4, [[ENTRY:%.*]] ]
118+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
119+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
120+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
121+
; CHECK: loop.latch:
122+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
123+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
124+
; CHECK: exit:
125+
; CHECK-NEXT: ret void
126+
;
127+
entry:
128+
%end = shl i64 %count, 2
129+
%precond = icmp ugt i64 %end, 4
130+
br i1 %precond, label %loop, label %exit
131+
132+
loop:
133+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 4, %entry ]
134+
%iv.next = add i64 %iv, 4
135+
%cmp.i.not = icmp eq i64 %iv, %end
136+
br i1 %cmp.i.not, label %exit, label %loop.latch
137+
138+
loop.latch:
139+
%cmp2.i.i = icmp ult i64 %iv, %end
140+
br i1 %cmp2.i.i, label %loop, label %exit
141+
142+
exit:
143+
ret void
144+
}
145+
146+
define void @multiple_pow2_wrong_start_offset(i64 %count) {
147+
; CHECK-LABEL: define void @multiple_pow2_wrong_start_offset(
148+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
149+
; CHECK-NEXT: entry:
150+
; CHECK-NEXT: [[END:%.*]] = shl i64 [[COUNT]], 2
151+
; CHECK-NEXT: [[PRECOND:%.*]] = icmp ugt i64 [[END]], 1
152+
; CHECK-NEXT: br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
153+
; CHECK: loop:
154+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 1, [[ENTRY:%.*]] ]
155+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
156+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
157+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
158+
; CHECK: loop.latch:
159+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
160+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
161+
; CHECK: exit:
162+
; CHECK-NEXT: ret void
163+
;
164+
entry:
165+
%end = shl i64 %count, 2
166+
%precond = icmp ugt i64 %end, 1
167+
br i1 %precond, label %loop, label %exit
168+
169+
loop:
170+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 1, %entry ]
171+
%iv.next = add i64 %iv, 4
172+
%cmp.i.not = icmp eq i64 %iv, %end
173+
br i1 %cmp.i.not, label %exit, label %loop.latch
174+
175+
loop.latch:
176+
%cmp2.i.i = icmp ult i64 %iv, %end
177+
br i1 %cmp2.i.i, label %loop, label %exit
178+
179+
exit:
180+
ret void
181+
}
182+
183+
define void @multiple_pow2_start_offset_dynamic(i64 %count) {
184+
; CHECK-LABEL: define void @multiple_pow2_start_offset_dynamic(
185+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
186+
; CHECK-NEXT: entry:
187+
; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[COUNT]], 2
188+
; CHECK-NEXT: [[END:%.*]] = add i64 [[SHL]], 1
189+
; CHECK-NEXT: [[PRECOND:%.*]] = icmp ne i64 [[END]], 0
190+
; CHECK-NEXT: br i1 [[PRECOND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
191+
; CHECK: loop:
192+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 1, [[ENTRY:%.*]] ]
193+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 4
194+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
195+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT]], label [[LOOP_LATCH]]
196+
; CHECK: loop.latch:
197+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
198+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
199+
; CHECK: exit:
200+
; CHECK-NEXT: ret void
201+
;
202+
entry:
203+
%shl = shl i64 %count, 2
204+
%end = add i64 %shl, 1
205+
%precond = icmp ne i64 %end, 0
206+
br i1 %precond, label %loop, label %exit
207+
208+
loop:
209+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 1, %entry ]
210+
%iv.next = add i64 %iv, 4
211+
%cmp.i.not = icmp eq i64 %iv, %end
212+
br i1 %cmp.i.not, label %exit, label %loop.latch
213+
214+
loop.latch:
215+
%cmp2.i.i = icmp ult i64 %iv, %end
216+
br i1 %cmp2.i.i, label %loop, label %exit
217+
218+
exit:
219+
ret void
220+
}
221+
222+
define void @multiple_non_pow2_nuw(i64 %count) {
223+
; CHECK-LABEL: define void @multiple_non_pow2_nuw(
224+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
225+
; CHECK-NEXT: entry:
226+
; CHECK-NEXT: [[END:%.*]] = mul nuw i64 [[COUNT]], 3
227+
; CHECK-NEXT: br label [[LOOP:%.*]]
228+
; CHECK: loop:
229+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
230+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 3
231+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
232+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
233+
; CHECK: loop.latch:
234+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
235+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
236+
; CHECK: exit:
237+
; CHECK-NEXT: ret void
238+
;
239+
entry:
240+
%end = mul nuw i64 %count, 3
241+
br label %loop
242+
243+
loop:
244+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
245+
%iv.next = add i64 %iv, 3
246+
%cmp.i.not = icmp eq i64 %iv, %end
247+
br i1 %cmp.i.not, label %exit, label %loop.latch
248+
249+
loop.latch:
250+
%cmp2.i.i = icmp ult i64 %iv, %end
251+
br i1 %cmp2.i.i, label %loop, label %exit
252+
253+
exit:
254+
ret void
255+
}
256+
257+
define void @multiple_non_pow2_missing_nuw(i64 %count) {
258+
; CHECK-LABEL: define void @multiple_non_pow2_missing_nuw(
259+
; CHECK-SAME: i64 [[COUNT:%.*]]) {
260+
; CHECK-NEXT: entry:
261+
; CHECK-NEXT: [[END:%.*]] = mul i64 [[COUNT]], 3
262+
; CHECK-NEXT: br label [[LOOP:%.*]]
263+
; CHECK: loop:
264+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]
265+
; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV]], 3
266+
; CHECK-NEXT: [[CMP_I_NOT:%.*]] = icmp eq i64 [[IV]], [[END]]
267+
; CHECK-NEXT: br i1 [[CMP_I_NOT]], label [[EXIT:%.*]], label [[LOOP_LATCH]]
268+
; CHECK: loop.latch:
269+
; CHECK-NEXT: [[CMP2_I_I:%.*]] = icmp ult i64 [[IV]], [[END]]
270+
; CHECK-NEXT: br i1 [[CMP2_I_I]], label [[LOOP]], label [[EXIT]]
271+
; CHECK: exit:
272+
; CHECK-NEXT: ret void
273+
;
274+
entry:
275+
%end = mul i64 %count, 3
276+
br label %loop
277+
278+
loop:
279+
%iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %entry ]
280+
%iv.next = add i64 %iv, 3
281+
%cmp.i.not = icmp eq i64 %iv, %end
282+
br i1 %cmp.i.not, label %exit, label %loop.latch
283+
284+
loop.latch:
285+
%cmp2.i.i = icmp ult i64 %iv, %end
286+
br i1 %cmp2.i.i, label %loop, label %exit
287+
288+
exit:
289+
ret void
290+
}

0 commit comments

Comments
 (0)