xref: /llvm-project/llvm/test/Transforms/InstCombine/dependent-ivs.ll (revision 462cb3cd6cecd0511ecaf0e3ebcaba455ece587d)
1dc5da485SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2dc5da485SNikita Popov; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3dc5da485SNikita Popov
4dc5da485SNikita Popovdefine void @int_iv_nuw(i64 %base, i64 %end) {
5dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_nuw(
6dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
7dc5da485SNikita Popov; CHECK-NEXT:  entry:
8dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
9dc5da485SNikita Popov; CHECK:       loop:
107ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
117ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add nuw i64 [[IV]], [[BASE]]
12dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
13dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
14dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
15dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
16dc5da485SNikita Popov; CHECK:       exit:
17dc5da485SNikita Popov; CHECK-NEXT:    ret void
18dc5da485SNikita Popov;
19dc5da485SNikita Popoventry:
20dc5da485SNikita Popov  br label %loop
21dc5da485SNikita Popov
22dc5da485SNikita Popovloop:
23dc5da485SNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
24dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
25dc5da485SNikita Popov  call void @use.i64(i64 %iv2)
26dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
27dc5da485SNikita Popov  %iv2.next = add nuw i64 %iv.next, %base
28dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
29dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
30dc5da485SNikita Popov
31dc5da485SNikita Popovexit:
32dc5da485SNikita Popov  ret void
33dc5da485SNikita Popov}
34dc5da485SNikita Popov
35dc5da485SNikita Popovdefine void @int_iv_nsw(i64 %base, i64 %end) {
36dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_nsw(
37dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
38dc5da485SNikita Popov; CHECK-NEXT:  entry:
39dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
40dc5da485SNikita Popov; CHECK:       loop:
417ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
427ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add nsw i64 [[IV]], [[BASE]]
43dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
44dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
45dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
46dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
47dc5da485SNikita Popov; CHECK:       exit:
48dc5da485SNikita Popov; CHECK-NEXT:    ret void
49dc5da485SNikita Popov;
50dc5da485SNikita Popoventry:
51dc5da485SNikita Popov  br label %loop
52dc5da485SNikita Popov
53dc5da485SNikita Popovloop:
54dc5da485SNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
55dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
56dc5da485SNikita Popov  call void @use.i64(i64 %iv2)
57dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
58dc5da485SNikita Popov  %iv2.next = add nsw i64 %iv.next, %base
59dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
60dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
61dc5da485SNikita Popov
62dc5da485SNikita Popovexit:
63dc5da485SNikita Popov  ret void
64dc5da485SNikita Popov}
65dc5da485SNikita Popov
661789dc2fSNikita Popovdefine void @int_iv_commuted_add(i64 %base, i64 %end) {
671789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_add(
68dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
69dc5da485SNikita Popov; CHECK-NEXT:  entry:
70dc5da485SNikita Popov; CHECK-NEXT:    [[BASE2:%.*]] = mul i64 [[BASE]], 42
71dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
72dc5da485SNikita Popov; CHECK:       loop:
737ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
747ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add i64 [[IV]], [[BASE2]]
75dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
76dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
77dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
78dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
79dc5da485SNikita Popov; CHECK:       exit:
80dc5da485SNikita Popov; CHECK-NEXT:    ret void
81dc5da485SNikita Popov;
82dc5da485SNikita Popoventry:
83dc5da485SNikita Popov  %base2 = mul i64 %base, 42 ; thwart complexity-based canonicalization
84dc5da485SNikita Popov  br label %loop
85dc5da485SNikita Popov
86dc5da485SNikita Popovloop:
87dc5da485SNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base2, %entry ]
88dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
89dc5da485SNikita Popov  call void @use.i64(i64 %iv2)
90dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
91dc5da485SNikita Popov  %iv2.next = add i64 %base2, %iv.next
92dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
93dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
94dc5da485SNikita Popov
95dc5da485SNikita Popovexit:
96dc5da485SNikita Popov  ret void
97dc5da485SNikita Popov}
98dc5da485SNikita Popov
991789dc2fSNikita Popovdefine void @int_iv_commuted_phi1(i64 %base, i64 %end) {
1001789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_phi1(
1011789dc2fSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
1021789dc2fSNikita Popov; CHECK-NEXT:  entry:
1031789dc2fSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
1041789dc2fSNikita Popov; CHECK:       loop:
1057ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
1067ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add i64 [[IV]], [[BASE]]
1071789dc2fSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
1081789dc2fSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
1091789dc2fSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
1101789dc2fSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
1111789dc2fSNikita Popov; CHECK:       exit:
1121789dc2fSNikita Popov; CHECK-NEXT:    ret void
1131789dc2fSNikita Popov;
1141789dc2fSNikita Popoventry:
1151789dc2fSNikita Popov  br label %loop
1161789dc2fSNikita Popov
1171789dc2fSNikita Popovloop:
1181789dc2fSNikita Popov  %iv2 = phi i64 [ %base, %entry ], [ %iv2.next, %loop ]
1191789dc2fSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
1201789dc2fSNikita Popov  call void @use.i64(i64 %iv2)
1211789dc2fSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
1221789dc2fSNikita Popov  %iv2.next = add i64 %iv.next, %base
1231789dc2fSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
1241789dc2fSNikita Popov  br i1 %cmp, label %exit, label %loop
1251789dc2fSNikita Popov
1261789dc2fSNikita Popovexit:
1271789dc2fSNikita Popov  ret void
1281789dc2fSNikita Popov}
1291789dc2fSNikita Popov
1301789dc2fSNikita Popovdefine void @int_iv_commuted_phi2(i64 %base, i64 %end) {
1311789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_phi2(
1321789dc2fSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
1331789dc2fSNikita Popov; CHECK-NEXT:  entry:
1341789dc2fSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
1351789dc2fSNikita Popov; CHECK:       loop:
1367ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
1377ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add i64 [[IV]], [[BASE]]
1381789dc2fSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
1391789dc2fSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
1401789dc2fSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
1411789dc2fSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
1421789dc2fSNikita Popov; CHECK:       exit:
1431789dc2fSNikita Popov; CHECK-NEXT:    ret void
1441789dc2fSNikita Popov;
1451789dc2fSNikita Popoventry:
1461789dc2fSNikita Popov  br label %loop
1471789dc2fSNikita Popov
1481789dc2fSNikita Popovloop:
1491789dc2fSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
1501789dc2fSNikita Popov  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
1511789dc2fSNikita Popov  call void @use.i64(i64 %iv2)
1521789dc2fSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
1531789dc2fSNikita Popov  %iv2.next = add i64 %iv.next, %base
1541789dc2fSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
1551789dc2fSNikita Popov  br i1 %cmp, label %exit, label %loop
1561789dc2fSNikita Popov
1571789dc2fSNikita Popovexit:
1581789dc2fSNikita Popov  ret void
1591789dc2fSNikita Popov}
1601789dc2fSNikita Popov
161dc5da485SNikita Popovdefine void @int_iv_vector(<2 x i64> %base) {
162dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_vector(
163dc5da485SNikita Popov; CHECK-SAME: <2 x i64> [[BASE:%.*]]) {
164dc5da485SNikita Popov; CHECK-NEXT:  entry:
165dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
166dc5da485SNikita Popov; CHECK:       loop:
1677ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ zeroinitializer, [[ENTRY:%.*]] ]
1687ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add <2 x i64> [[IV]], [[BASE]]
169dc5da485SNikita Popov; CHECK-NEXT:    call void @use.v2i64(<2 x i64> [[IV2]])
17038fffa63SPaul Walker; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4)
171dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = call i1 @get.i1()
172dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
173dc5da485SNikita Popov; CHECK:       exit:
174dc5da485SNikita Popov; CHECK-NEXT:    ret void
175dc5da485SNikita Popov;
176dc5da485SNikita Popoventry:
177dc5da485SNikita Popov  br label %loop
178dc5da485SNikita Popov
179dc5da485SNikita Popovloop:
180dc5da485SNikita Popov  %iv2 = phi <2 x i64> [ %iv2.next, %loop ], [ %base, %entry ]
181dc5da485SNikita Popov  %iv = phi <2 x i64> [ %iv.next, %loop ], [ zeroinitializer, %entry ]
182dc5da485SNikita Popov  call void @use.v2i64(<2 x i64> %iv2)
183dc5da485SNikita Popov  %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4>
184dc5da485SNikita Popov  %iv2.next = add <2 x i64> %iv.next, %base
185dc5da485SNikita Popov  %cmp = call i1 @get.i1()
186dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
187dc5da485SNikita Popov
188dc5da485SNikita Popovexit:
189dc5da485SNikita Popov  ret void
190dc5da485SNikita Popov}
191dc5da485SNikita Popov
192c7799fadSNikita Popovdefine void @int_iv_vector_poison_invalid(<2 x i64> %base) {
193c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_vector_poison_invalid(
194c7799fadSNikita Popov; CHECK-SAME: <2 x i64> [[BASE:%.*]]) {
195c7799fadSNikita Popov; CHECK-NEXT:  entry:
196c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
197c7799fadSNikita Popov; CHECK:       loop:
198c7799fadSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi <2 x i64> [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
199c7799fadSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ <i64 0, i64 poison>, [[ENTRY]] ]
200c7799fadSNikita Popov; CHECK-NEXT:    call void @use.v2i64(<2 x i64> [[IV2]])
20138fffa63SPaul Walker; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4)
202c7799fadSNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = add <2 x i64> [[IV_NEXT]], [[BASE]]
203c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = call i1 @get.i1()
204c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
205c7799fadSNikita Popov; CHECK:       exit:
206c7799fadSNikita Popov; CHECK-NEXT:    ret void
207c7799fadSNikita Popov;
208c7799fadSNikita Popoventry:
209c7799fadSNikita Popov  br label %loop
210c7799fadSNikita Popov
211c7799fadSNikita Popovloop:
212c7799fadSNikita Popov  %iv2 = phi <2 x i64> [ %iv2.next, %loop ], [ %base, %entry ]
213c7799fadSNikita Popov  %iv = phi <2 x i64> [ %iv.next, %loop ], [ <i64 0, i64 poison>, %entry ]
214c7799fadSNikita Popov  call void @use.v2i64(<2 x i64> %iv2)
215c7799fadSNikita Popov  %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4>
216c7799fadSNikita Popov  %iv2.next = add <2 x i64> %iv.next, %base
217c7799fadSNikita Popov  %cmp = call i1 @get.i1()
218c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
219c7799fadSNikita Popov
220c7799fadSNikita Popovexit:
221c7799fadSNikita Popov  ret void
222c7799fadSNikita Popov}
223c7799fadSNikita Popov
224dc5da485SNikita Popovdefine void @int_iv_loop_variant_step(i64 %base, i64 %end) {
225dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_loop_variant_step(
226dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
227dc5da485SNikita Popov; CHECK-NEXT:  entry:
228dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
229dc5da485SNikita Popov; CHECK:       loop:
2307ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
2317ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = add nuw i64 [[IV]], [[BASE]]
232dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
233dc5da485SNikita Popov; CHECK-NEXT:    [[STEP:%.*]] = call i64 @get.i64()
234dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[STEP]]
235dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
236dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
237dc5da485SNikita Popov; CHECK:       exit:
238dc5da485SNikita Popov; CHECK-NEXT:    ret void
239dc5da485SNikita Popov;
240dc5da485SNikita Popoventry:
241dc5da485SNikita Popov  br label %loop
242dc5da485SNikita Popov
243dc5da485SNikita Popovloop:
244dc5da485SNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
245dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
246dc5da485SNikita Popov  call void @use.i64(i64 %iv2)
247dc5da485SNikita Popov  %step = call i64 @get.i64()
248dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, %step
249dc5da485SNikita Popov  %iv2.next = add nuw i64 %iv.next, %base
250dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
251dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
252dc5da485SNikita Popov
253dc5da485SNikita Popovexit:
254dc5da485SNikita Popov  ret void
255dc5da485SNikita Popov}
256dc5da485SNikita Popov
257c7799fadSNikita Popovdefine void @int_iv_xor(i64 %base, i64 %end) {
258c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_xor(
259c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
260c7799fadSNikita Popov; CHECK-NEXT:  entry:
261c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
262c7799fadSNikita Popov; CHECK:       loop:
2637ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
2647ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = xor i64 [[IV]], [[BASE]]
265c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
266c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
267c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
268c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
269c7799fadSNikita Popov; CHECK:       exit:
270c7799fadSNikita Popov; CHECK-NEXT:    ret void
271c7799fadSNikita Popov;
272c7799fadSNikita Popoventry:
273c7799fadSNikita Popov  br label %loop
274c7799fadSNikita Popov
275c7799fadSNikita Popovloop:
276c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
277c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
278c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
279c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
280c7799fadSNikita Popov  %iv2.next = xor i64 %iv.next, %base
281c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
282c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
283c7799fadSNikita Popov
284c7799fadSNikita Popovexit:
285c7799fadSNikita Popov  ret void
286c7799fadSNikita Popov}
287c7799fadSNikita Popov
288c7799fadSNikita Popovdefine void @int_iv_or(i64 %base, i64 %end) {
289c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_or(
290c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
291c7799fadSNikita Popov; CHECK-NEXT:  entry:
292c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
293c7799fadSNikita Popov; CHECK:       loop:
2947ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
2957ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = or i64 [[IV]], [[BASE]]
296c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
297c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
298c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
299c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
300c7799fadSNikita Popov; CHECK:       exit:
301c7799fadSNikita Popov; CHECK-NEXT:    ret void
302c7799fadSNikita Popov;
303c7799fadSNikita Popoventry:
304c7799fadSNikita Popov  br label %loop
305c7799fadSNikita Popov
306c7799fadSNikita Popovloop:
307c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
308c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
309c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
310c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
311c7799fadSNikita Popov  %iv2.next = or i64 %iv.next, %base
312c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
313c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
314c7799fadSNikita Popov
315c7799fadSNikita Popovexit:
316c7799fadSNikita Popov  ret void
317c7799fadSNikita Popov}
318c7799fadSNikita Popov
319c7799fadSNikita Popovdefine void @int_iv_or_disjoint(i64 %base, i64 %end) {
320c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_or_disjoint(
321c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
322c7799fadSNikita Popov; CHECK-NEXT:  entry:
323c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
324c7799fadSNikita Popov; CHECK:       loop:
3257ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
3267ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = or disjoint i64 [[IV]], [[BASE]]
327c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
328c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
329c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
330c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
331c7799fadSNikita Popov; CHECK:       exit:
332c7799fadSNikita Popov; CHECK-NEXT:    ret void
333c7799fadSNikita Popov;
334c7799fadSNikita Popoventry:
335c7799fadSNikita Popov  br label %loop
336c7799fadSNikita Popov
337c7799fadSNikita Popovloop:
338c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
339c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
340c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
341c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
342c7799fadSNikita Popov  %iv2.next = or disjoint i64 %iv.next, %base
343c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
344c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
345c7799fadSNikita Popov
346c7799fadSNikita Popovexit:
347c7799fadSNikita Popov  ret void
348c7799fadSNikita Popov}
349c7799fadSNikita Popov
350c7799fadSNikita Popovdefine void @int_iv_and(i64 %base, i64 %end) {
351c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_and(
352c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
353c7799fadSNikita Popov; CHECK-NEXT:  entry:
354c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
355c7799fadSNikita Popov; CHECK:       loop:
3567ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ -1, [[ENTRY:%.*]] ]
3577ce1a11fSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = and i64 [[IV]], [[BASE]]
358c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
359c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
360c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
361c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
362c7799fadSNikita Popov; CHECK:       exit:
363c7799fadSNikita Popov; CHECK-NEXT:    ret void
364c7799fadSNikita Popov;
365c7799fadSNikita Popoventry:
366c7799fadSNikita Popov  br label %loop
367c7799fadSNikita Popov
368c7799fadSNikita Popovloop:
369c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
370c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ -1, %entry ]
371c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
372c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
373c7799fadSNikita Popov  %iv2.next = and i64 %iv.next, %base
374c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
375c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
376c7799fadSNikita Popov
377c7799fadSNikita Popovexit:
378c7799fadSNikita Popov  ret void
379c7799fadSNikita Popov}
380c7799fadSNikita Popov
381c7799fadSNikita Popovdefine void @int_iv_sub(i64 %base, i64 %end) {
382c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_sub(
383c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
384c7799fadSNikita Popov; CHECK-NEXT:  entry:
385c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
386c7799fadSNikita Popov; CHECK:       loop:
387c7799fadSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
388c7799fadSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
389c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
390c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
391c7799fadSNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = sub i64 [[BASE]], [[IV_NEXT]]
392c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
393c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
394c7799fadSNikita Popov; CHECK:       exit:
395c7799fadSNikita Popov; CHECK-NEXT:    ret void
396c7799fadSNikita Popov;
397c7799fadSNikita Popoventry:
398c7799fadSNikita Popov  br label %loop
399c7799fadSNikita Popov
400c7799fadSNikita Popovloop:
401c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
402c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
403c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
404c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
405c7799fadSNikita Popov  %iv2.next = sub i64 %base, %iv.next
406c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
407c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
408c7799fadSNikita Popov
409c7799fadSNikita Popovexit:
410c7799fadSNikita Popov  ret void
411c7799fadSNikita Popov}
412c7799fadSNikita Popov
413c7799fadSNikita Popovdefine void @int_iv_sub_invalid_order(i64 %base, i64 %end) {
414c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_sub_invalid_order(
415c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
416c7799fadSNikita Popov; CHECK-NEXT:  entry:
417c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
418c7799fadSNikita Popov; CHECK:       loop:
419c7799fadSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
420c7799fadSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
421c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
422c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
423c7799fadSNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = sub i64 [[IV_NEXT]], [[BASE]]
424c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
425c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
426c7799fadSNikita Popov; CHECK:       exit:
427c7799fadSNikita Popov; CHECK-NEXT:    ret void
428c7799fadSNikita Popov;
429c7799fadSNikita Popoventry:
430c7799fadSNikita Popov  br label %loop
431c7799fadSNikita Popov
432c7799fadSNikita Popovloop:
433c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
434c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
435c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
436c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
437c7799fadSNikita Popov  %iv2.next = sub i64 %iv.next, %base
438c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
439c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
440c7799fadSNikita Popov
441c7799fadSNikita Popovexit:
442c7799fadSNikita Popov  ret void
443c7799fadSNikita Popov}
444c7799fadSNikita Popov
445c7799fadSNikita Popovdefine void @int_iv_add_wrong_start(i64 %base, i64 %end) {
446c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_add_wrong_start(
447c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
448c7799fadSNikita Popov; CHECK-NEXT:  entry:
449c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
450c7799fadSNikita Popov; CHECK:       loop:
451c7799fadSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
452c7799fadSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 1, [[ENTRY]] ]
453c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
454c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
455a1058776SNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = add i64 [[BASE]], [[IV_NEXT]]
456c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
457c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
458c7799fadSNikita Popov; CHECK:       exit:
459c7799fadSNikita Popov; CHECK-NEXT:    ret void
460c7799fadSNikita Popov;
461c7799fadSNikita Popoventry:
462c7799fadSNikita Popov  br label %loop
463c7799fadSNikita Popov
464c7799fadSNikita Popovloop:
465c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
466c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 1, %entry ]
467c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
468c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
469c7799fadSNikita Popov  %iv2.next = add i64 %base, %iv.next
470c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
471c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
472c7799fadSNikita Popov
473c7799fadSNikita Popovexit:
474c7799fadSNikita Popov  ret void
475c7799fadSNikita Popov}
476c7799fadSNikita Popov
477c7799fadSNikita Popovdefine void @int_iv_and_wrong_start(i64 %base, i64 %end) {
478c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_and_wrong_start(
479c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) {
480c7799fadSNikita Popov; CHECK-NEXT:  entry:
481c7799fadSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
482c7799fadSNikita Popov; CHECK:       loop:
483c7799fadSNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ]
484c7799fadSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ]
485c7799fadSNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
486c7799fadSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
487c7799fadSNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = and i64 [[IV_NEXT]], [[BASE]]
488c7799fadSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
489c7799fadSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
490c7799fadSNikita Popov; CHECK:       exit:
491c7799fadSNikita Popov; CHECK-NEXT:    ret void
492c7799fadSNikita Popov;
493c7799fadSNikita Popoventry:
494c7799fadSNikita Popov  br label %loop
495c7799fadSNikita Popov
496c7799fadSNikita Popovloop:
497c7799fadSNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ]
498c7799fadSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
499c7799fadSNikita Popov  call void @use.i64(i64 %iv2)
500c7799fadSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
501c7799fadSNikita Popov  %iv2.next = and i64 %iv.next, %base
502c7799fadSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
503c7799fadSNikita Popov  br i1 %cmp, label %exit, label %loop
504c7799fadSNikita Popov
505c7799fadSNikita Popovexit:
506c7799fadSNikita Popov  ret void
507c7799fadSNikita Popov}
508c7799fadSNikita Popov
509dc5da485SNikita Popovdefine void @ptr_iv_inbounds(ptr %base, i64 %end) {
510dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_inbounds(
511dc5da485SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) {
512dc5da485SNikita Popov; CHECK-NEXT:  entry:
513dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
514dc5da485SNikita Popov; CHECK:       loop:
5157ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
516*462cb3cdSNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 [[IV]]
517dc5da485SNikita Popov; CHECK-NEXT:    call void @use.p0(ptr [[IV_PTR]])
518dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
519dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
520dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
521dc5da485SNikita Popov; CHECK:       exit:
522dc5da485SNikita Popov; CHECK-NEXT:    ret void
523dc5da485SNikita Popov;
524dc5da485SNikita Popoventry:
525dc5da485SNikita Popov  br label %loop
526dc5da485SNikita Popov
527dc5da485SNikita Popovloop:
528dc5da485SNikita Popov  %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ]
529dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
530dc5da485SNikita Popov  call void @use.p0(ptr %iv.ptr)
531dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
532dc5da485SNikita Popov  %iv.ptr.next = getelementptr inbounds i8, ptr %base, i64 %iv.next
533dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
534dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
535dc5da485SNikita Popov
536dc5da485SNikita Popovexit:
537dc5da485SNikita Popov  ret void
538dc5da485SNikita Popov}
539dc5da485SNikita Popov
5406efba061SNikita Popovdefine void @ptr_iv_nuw(ptr %base, i64 %end) {
5416efba061SNikita Popov; CHECK-LABEL: define void @ptr_iv_nuw(
5426efba061SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) {
5436efba061SNikita Popov; CHECK-NEXT:  entry:
5446efba061SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
5456efba061SNikita Popov; CHECK:       loop:
5466efba061SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
5476efba061SNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 [[IV]]
5486efba061SNikita Popov; CHECK-NEXT:    call void @use.p0(ptr [[IV_PTR]])
5496efba061SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
5506efba061SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
5516efba061SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
5526efba061SNikita Popov; CHECK:       exit:
5536efba061SNikita Popov; CHECK-NEXT:    ret void
5546efba061SNikita Popov;
5556efba061SNikita Popoventry:
5566efba061SNikita Popov  br label %loop
5576efba061SNikita Popov
5586efba061SNikita Popovloop:
5596efba061SNikita Popov  %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ]
5606efba061SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
5616efba061SNikita Popov  call void @use.p0(ptr %iv.ptr)
5626efba061SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
5636efba061SNikita Popov  %iv.ptr.next = getelementptr nuw i8, ptr %base, i64 %iv.next
5646efba061SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
5656efba061SNikita Popov  br i1 %cmp, label %exit, label %loop
5666efba061SNikita Popov
5676efba061SNikita Popovexit:
5686efba061SNikita Popov  ret void
5696efba061SNikita Popov}
5706efba061SNikita Popov
5716efba061SNikita Popovdefine void @ptr_iv_no_flags(ptr %base, i64 %end) {
5726efba061SNikita Popov; CHECK-LABEL: define void @ptr_iv_no_flags(
573dc5da485SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) {
574dc5da485SNikita Popov; CHECK-NEXT:  entry:
575dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
576dc5da485SNikita Popov; CHECK:       loop:
5777ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
5787ce1a11fSNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[IV]]
579dc5da485SNikita Popov; CHECK-NEXT:    call void @use.p0(ptr [[IV_PTR]])
580dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
581dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
582dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
583dc5da485SNikita Popov; CHECK:       exit:
584dc5da485SNikita Popov; CHECK-NEXT:    ret void
585dc5da485SNikita Popov;
586dc5da485SNikita Popoventry:
587dc5da485SNikita Popov  br label %loop
588dc5da485SNikita Popov
589dc5da485SNikita Popovloop:
590dc5da485SNikita Popov  %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ]
591dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
592dc5da485SNikita Popov  call void @use.p0(ptr %iv.ptr)
593dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
594dc5da485SNikita Popov  %iv.ptr.next = getelementptr i8, ptr %base, i64 %iv.next
595dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
596dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
597dc5da485SNikita Popov
598dc5da485SNikita Popovexit:
599dc5da485SNikita Popov  ret void
600dc5da485SNikita Popov}
601dc5da485SNikita Popov
6021789dc2fSNikita Popovdefine void @ptr_iv_non_i8_type(ptr %base, i64 %end) {
6031789dc2fSNikita Popov; CHECK-LABEL: define void @ptr_iv_non_i8_type(
6041789dc2fSNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) {
6051789dc2fSNikita Popov; CHECK-NEXT:  entry:
6061789dc2fSNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
6071789dc2fSNikita Popov; CHECK:       loop:
6087ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
6097ce1a11fSNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[IV]]
6101789dc2fSNikita Popov; CHECK-NEXT:    call void @use.p0(ptr [[IV_PTR]])
6111789dc2fSNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
6121789dc2fSNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
6131789dc2fSNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
6141789dc2fSNikita Popov; CHECK:       exit:
6151789dc2fSNikita Popov; CHECK-NEXT:    ret void
6161789dc2fSNikita Popov;
6171789dc2fSNikita Popoventry:
6181789dc2fSNikita Popov  br label %loop
6191789dc2fSNikita Popov
6201789dc2fSNikita Popovloop:
6211789dc2fSNikita Popov  %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ]
6221789dc2fSNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
6231789dc2fSNikita Popov  call void @use.p0(ptr %iv.ptr)
6241789dc2fSNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
6251789dc2fSNikita Popov  %iv.ptr.next = getelementptr i32, ptr %base, i64 %iv.next
6261789dc2fSNikita Popov  %cmp = icmp eq i64 %iv.next, %end
6271789dc2fSNikita Popov  br i1 %cmp, label %exit, label %loop
6281789dc2fSNikita Popov
6291789dc2fSNikita Popovexit:
6301789dc2fSNikita Popov  ret void
6311789dc2fSNikita Popov}
6321789dc2fSNikita Popov
633dc5da485SNikita Popovdefine void @ptr_iv_vector(<2 x ptr> %base, i64 %end) {
634dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_vector(
635dc5da485SNikita Popov; CHECK-SAME: <2 x ptr> [[BASE:%.*]], i64 [[END:%.*]]) {
636dc5da485SNikita Popov; CHECK-NEXT:  entry:
637dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
638dc5da485SNikita Popov; CHECK:       loop:
6397ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
6407ce1a11fSNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr inbounds i8, <2 x ptr> [[BASE]], i64 [[IV]]
641dc5da485SNikita Popov; CHECK-NEXT:    call void @use.v2p0(<2 x ptr> [[IV_PTR]])
642dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
643dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]]
644dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
645dc5da485SNikita Popov; CHECK:       exit:
646dc5da485SNikita Popov; CHECK-NEXT:    ret void
647dc5da485SNikita Popov;
648dc5da485SNikita Popoventry:
649dc5da485SNikita Popov  br label %loop
650dc5da485SNikita Popov
651dc5da485SNikita Popovloop:
652dc5da485SNikita Popov  %iv.ptr = phi <2 x ptr> [ %iv.ptr.next, %loop ], [ %base, %entry ]
653dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
654dc5da485SNikita Popov  call void @use.v2p0(<2 x ptr> %iv.ptr)
655dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
656dc5da485SNikita Popov  %iv.ptr.next = getelementptr inbounds i8, <2 x ptr> %base, i64 %iv.next
657dc5da485SNikita Popov  %cmp = icmp eq i64 %iv.next, %end
658dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
659dc5da485SNikita Popov
660dc5da485SNikita Popovexit:
661dc5da485SNikita Popov  ret void
662dc5da485SNikita Popov}
663dc5da485SNikita Popov
664dc5da485SNikita Popovdefine void @ptr_iv_vector2(<2 x ptr> %base) {
665dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_vector2(
666dc5da485SNikita Popov; CHECK-SAME: <2 x ptr> [[BASE:%.*]]) {
667dc5da485SNikita Popov; CHECK-NEXT:  entry:
668dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP:%.*]]
669dc5da485SNikita Popov; CHECK:       loop:
6707ce1a11fSNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ zeroinitializer, [[ENTRY:%.*]] ]
6717ce1a11fSNikita Popov; CHECK-NEXT:    [[IV_PTR:%.*]] = getelementptr i8, <2 x ptr> [[BASE]], <2 x i64> [[IV]]
672dc5da485SNikita Popov; CHECK-NEXT:    call void @use.v2p0(<2 x ptr> [[IV_PTR]])
67338fffa63SPaul Walker; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4)
674dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = call i1 @get.i1()
675dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]]
676dc5da485SNikita Popov; CHECK:       exit:
677dc5da485SNikita Popov; CHECK-NEXT:    ret void
678dc5da485SNikita Popov;
679dc5da485SNikita Popoventry:
680dc5da485SNikita Popov  br label %loop
681dc5da485SNikita Popov
682dc5da485SNikita Popovloop:
683dc5da485SNikita Popov  %iv.ptr = phi <2 x ptr> [ %iv.ptr.next, %loop ], [ %base, %entry ]
684dc5da485SNikita Popov  %iv = phi <2 x i64> [ %iv.next, %loop ], [ zeroinitializer, %entry ]
685dc5da485SNikita Popov  call void @use.v2p0(<2 x ptr> %iv.ptr)
686dc5da485SNikita Popov  %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4>
687dc5da485SNikita Popov  %iv.ptr.next = getelementptr i8, <2 x ptr> %base, <2 x i64> %iv.next
688dc5da485SNikita Popov  %cmp = call i1 @get.i1()
689dc5da485SNikita Popov  br i1 %cmp, label %exit, label %loop
690dc5da485SNikita Popov
691dc5da485SNikita Popovexit:
692dc5da485SNikita Popov  ret void
693dc5da485SNikita Popov}
694dc5da485SNikita Popov
695dc5da485SNikita Popovdefine void @different_loops(i64 %base) {
696dc5da485SNikita Popov; CHECK-LABEL: define void @different_loops(
697dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]]) {
698dc5da485SNikita Popov; CHECK-NEXT:  entry:
699dc5da485SNikita Popov; CHECK-NEXT:    br label [[LOOP1:%.*]]
700dc5da485SNikita Popov; CHECK:       loop1:
701dc5da485SNikita Popov; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP1]] ], [ 0, [[ENTRY:%.*]] ]
702dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV]])
703dc5da485SNikita Popov; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4
704dc5da485SNikita Popov; CHECK-NEXT:    [[CMP:%.*]] = call i1 @get.i1()
705dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP2:%.*]], label [[LOOP1]]
706dc5da485SNikita Popov; CHECK:       loop2:
707dc5da485SNikita Popov; CHECK-NEXT:    [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP2]] ], [ [[BASE]], [[LOOP1]] ]
708dc5da485SNikita Popov; CHECK-NEXT:    call void @use.i64(i64 [[IV2]])
709a1058776SNikita Popov; CHECK-NEXT:    [[IV2_NEXT]] = add nuw i64 [[BASE]], [[IV_NEXT]]
710dc5da485SNikita Popov; CHECK-NEXT:    [[CMP2:%.*]] = call i1 @get.i1()
711dc5da485SNikita Popov; CHECK-NEXT:    br i1 [[CMP2]], label [[EXIT:%.*]], label [[LOOP2]]
712dc5da485SNikita Popov; CHECK:       exit:
713dc5da485SNikita Popov; CHECK-NEXT:    ret void
714dc5da485SNikita Popov;
715dc5da485SNikita Popoventry:
716dc5da485SNikita Popov  br label %loop1
717dc5da485SNikita Popov
718dc5da485SNikita Popovloop1:
719dc5da485SNikita Popov  %iv = phi i64 [ %iv.next, %loop1 ], [ 0, %entry ]
720dc5da485SNikita Popov  call void @use.i64(i64 %iv)
721dc5da485SNikita Popov  %iv.next = add nuw nsw i64 %iv, 4
722dc5da485SNikita Popov  %cmp = call i1 @get.i1()
723dc5da485SNikita Popov  br i1 %cmp, label %loop2, label %loop1
724dc5da485SNikita Popov
725dc5da485SNikita Popovloop2:
726dc5da485SNikita Popov  %iv2 = phi i64 [ %iv2.next, %loop2 ], [ %base, %loop1 ]
727dc5da485SNikita Popov  call void @use.i64(i64 %iv2)
728dc5da485SNikita Popov  %iv2.next = add nuw i64 %base, %iv.next
729dc5da485SNikita Popov  %cmp2 = call i1 @get.i1()
730dc5da485SNikita Popov  br i1 %cmp2, label %exit, label %loop2
731dc5da485SNikita Popov
732dc5da485SNikita Popovexit:
733dc5da485SNikita Popov  ret void
734dc5da485SNikita Popov}
735dc5da485SNikita Popov
736dc5da485SNikita Popovdeclare void @use.p0(ptr)
737dc5da485SNikita Popovdeclare void @use.v2p0(<2 x ptr>)
738dc5da485SNikita Popovdeclare void @use.i64(i64)
739dc5da485SNikita Popovdeclare void @use.v2i64(<2 x i64>)
740dc5da485SNikita Popovdeclare i1 @get.i1()
741dc5da485SNikita Popovdeclare i64 @get.i64()
742