xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/loops.ll (revision 13ffde316a8541d77116bd18f73efada236617f3)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4declare void @use(i1)
5
6; Make sure conditions in loops are not used to simplify themselves.
7
8define void @loop1(ptr %T, ptr %x, i32 %points, i32 %trigint) {
9; CHECK-LABEL: @loop1(
10; CHECK-NEXT:  entry:
11; CHECK-NEXT:    [[IDX_EXT:%.*]] = sext i32 [[POINTS:%.*]] to i64
12; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds float, ptr [[X:%.*]], i64 [[IDX_EXT]]
13; CHECK-NEXT:    [[ADD_PTR1:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR]], i64 -8
14; CHECK-NEXT:    [[SHR:%.*]] = ashr i32 [[POINTS]], 1
15; CHECK-NEXT:    [[IDX_EXT2:%.*]] = sext i32 [[SHR]] to i64
16; CHECK-NEXT:    [[ADD_PTR3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 [[IDX_EXT2]]
17; CHECK-NEXT:    [[ADD_PTR4:%.*]] = getelementptr inbounds float, ptr [[ADD_PTR3]], i64 -8
18; CHECK-NEXT:    br label [[DO_BODY:%.*]]
19; CHECK:       do.body:
20; CHECK-NEXT:    [[X2_0:%.*]] = phi ptr [ [[ADD_PTR4]], [[ENTRY:%.*]] ], [ [[ADD_PTR106:%.*]], [[DO_BODY]] ]
21; CHECK-NEXT:    [[X1_0:%.*]] = phi ptr [ [[ADD_PTR1]], [[ENTRY]] ], [ [[ADD_PTR105:%.*]], [[DO_BODY]] ]
22; CHECK-NEXT:    [[ADD_PTR105]] = getelementptr inbounds float, ptr [[X1_0]], i64 -8
23; CHECK-NEXT:    [[ADD_PTR106]] = getelementptr inbounds float, ptr [[X2_0]], i64 -8
24; CHECK-NEXT:    [[CMP:%.*]] = icmp uge ptr [[ADD_PTR106]], [[X]]
25; CHECK-NEXT:    br i1 [[CMP]], label [[DO_BODY]], label [[DO_END:%.*]]
26; CHECK:       do.end:
27; CHECK-NEXT:    ret void
28;
29entry:
30  %idx.ext = sext i32 %points to i64
31  %add.ptr = getelementptr inbounds float, ptr %x, i64 %idx.ext
32  %add.ptr1 = getelementptr inbounds float, ptr %add.ptr, i64 -8
33  %shr = ashr i32 %points, 1
34  %idx.ext2 = sext i32 %shr to i64
35  %add.ptr3 = getelementptr inbounds float, ptr %x, i64 %idx.ext2
36  %add.ptr4 = getelementptr inbounds float, ptr %add.ptr3, i64 -8
37  br label %do.body
38
39do.body:                                          ; preds = %do.body, %entry
40  %x2.0 = phi ptr [ %add.ptr4, %entry ], [ %add.ptr106, %do.body ]
41  %x1.0 = phi ptr [ %add.ptr1, %entry ], [ %add.ptr105, %do.body ]
42  %add.ptr105 = getelementptr inbounds float, ptr %x1.0, i64 -8
43  %add.ptr106 = getelementptr inbounds float, ptr %x2.0, i64 -8
44  %cmp = icmp uge ptr %add.ptr106, %x
45  br i1 %cmp, label %do.body, label %do.end
46
47do.end:                                           ; preds = %do.body
48  ret void
49}
50
51
52; Some tests with loops with conditions in the header.
53
54define i32 @loop_header_dom(i32 %y, i1 %c) {
55; CHECK-LABEL: @loop_header_dom(
56; CHECK-NEXT:  entry:
57; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
58; CHECK:       loop.header:
59; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
60; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
61; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]
62; CHECK:       loop.latch:
63; CHECK-NEXT:    call void @use(i1 true)
64; CHECK-NEXT:    call void @use(i1 false)
65; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 9
66; CHECK-NEXT:    call void @use(i1 [[C_2]])
67; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 9
68; CHECK-NEXT:    call void @use(i1 [[C_3]])
69; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
70; CHECK-NEXT:    br label [[LOOP_HEADER]]
71; CHECK:       exit:
72; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
73; CHECK-NEXT:    call void @use(i1 [[C_4]])
74; CHECK-NEXT:    ret i32 20
75;
76entry:
77  br i1 %c, label %loop.header, label %exit
78
79loop.header:
80  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
81  %c.1 = icmp ule i32 %x, 10
82  br i1 %c.1, label %loop.latch, label %exit
83
84loop.latch:
85  %t.1 = icmp ule i32 %x, 10
86  call void @use(i1 %t.1)
87  %f.1 = icmp ugt i32 %x, 10
88  call void @use(i1 %f.1)
89
90  %c.2 = icmp ule i32 %x, 9
91  call void @use(i1 %c.2)
92  %c.3 = icmp ugt i32 %x, 9
93  call void @use(i1 %c.3)
94
95  %x.next = add i32 %x, 1
96  br label %loop.header
97
98exit:
99  %c.4 = icmp ugt i32 %y, 10
100  call void @use(i1 %c.4)
101  ret i32 20
102}
103
104define i32 @loop_header_dom_successors_flipped(i32 %y, i1 %c) {
105; CHECK-LABEL: @loop_header_dom_successors_flipped(
106; CHECK-NEXT:  entry:
107; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
108; CHECK:       loop.header:
109; 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]]
112; CHECK:       loop.latch:
113; CHECK-NEXT:    call void @use(i1 false)
114; 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]])
119; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
120; CHECK-NEXT:    br label [[LOOP_HEADER]]
121; CHECK:       exit:
122; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y:%.*]], 10
123; CHECK-NEXT:    call void @use(i1 [[C_4]])
124; CHECK-NEXT:    ret i32 20
125;
126entry:
127  br i1 %c, label %loop.header, label %exit
128
129loop.header:
130  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
131  %c.1 = icmp ule i32 %x, 10
132  br i1 %c.1, label %exit, label %loop.latch
133
134loop.latch:
135  %f.1 = icmp ule i32 %x, 10
136  call void @use(i1 %f.1)
137  %t.1 = icmp ugt i32 %x, 10
138  call void @use(i1 %t.1)
139
140  %c.2 = icmp ugt i32 %x, 11
141  call void @use(i1 %c.2)
142  %c.3 = icmp ule i32 %x,11
143  call void @use(i1 %c.3)
144
145  %x.next = add i32 %x, 1
146  br label %loop.header
147
148exit:
149  %c.4 = icmp ugt i32 %y, 10
150  call void @use(i1 %c.4)
151  ret i32 20
152}
153
154define void @loop_header_dom_or(i32 %y, i1 %c, i32 %start) {
155; CHECK-LABEL: @loop_header_dom_or(
156; CHECK-NEXT:  entry:
157; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
158; CHECK:       loop.header:
159; CHECK-NEXT:    [[X:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
160; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
161; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99
162; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
163; CHECK-NEXT:    br i1 [[OR]], label [[EXIT]], label [[LOOP_LATCH]]
164; CHECK:       loop.latch:
165; CHECK-NEXT:    call void @use(i1 true)
166; CHECK-NEXT:    call void @use(i1 false)
167; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[X]], 11
168; CHECK-NEXT:    call void @use(i1 [[C_1]])
169; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 11
170; CHECK-NEXT:    call void @use(i1 [[C_2]])
171; CHECK-NEXT:    call void @use(i1 true)
172; CHECK-NEXT:    call void @use(i1 false)
173; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[Y]], 98
174; CHECK-NEXT:    call void @use(i1 [[C_3]])
175; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i32 [[Y]], 98
176; CHECK-NEXT:    call void @use(i1 [[C_4]])
177; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
178; CHECK-NEXT:    br label [[LOOP_HEADER]]
179; CHECK:       exit:
180; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 10
181; CHECK-NEXT:    call void @use(i1 [[C_5]])
182; CHECK-NEXT:    ret void
183;
184entry:
185  br i1 %c, label %loop.header, label %exit
186
187loop.header:
188  %x = phi i32 [ %start, %entry ], [ %x.next, %loop.latch ]
189  %x.1 = icmp ule i32 %x, 10
190  %y.1 = icmp ugt i32 %y, 99
191  %or = or i1 %x.1, %y.1
192  br i1 %or, label %exit, label %loop.latch
193
194loop.latch:
195  %t.1 = icmp ugt i32 %x, 10
196  call void @use(i1 %t.1)
197  %f.1 = icmp ule i32 %x, 10
198  call void @use(i1 %f.1)
199  %c.1 = icmp ugt i32 %x, 11
200  call void @use(i1 %c.1)
201  %c.2 = icmp ule i32 %x, 11
202  call void @use(i1 %c.2)
203
204
205  %t.2 = icmp ule i32 %y, 99
206  call void @use(i1 %t.2)
207  %f.2 = icmp ugt i32 %y, 99
208  call void @use(i1 %f.2)
209
210  %c.3 = icmp ule i32 %y, 98
211  call void @use(i1 %c.3)
212  %c.4 = icmp ule i32 %y, 98
213  call void @use(i1 %c.4)
214
215  %x.next = add i32 %x, 1
216  br label %loop.header
217
218exit:
219  %c.5 = icmp ugt i32 %y, 10
220  call void @use(i1 %c.5)
221  ret void
222}
223
224define void @loop_header_dom_or_successors_flipped(i32 %y, i1 %c) {
225; CHECK-LABEL: @loop_header_dom_or_successors_flipped(
226; CHECK-NEXT:  entry:
227; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
228; CHECK:       loop.header:
229; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
230; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
231; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y:%.*]], 99
232; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
233; CHECK-NEXT:    br i1 [[OR]], label [[LOOP_LATCH]], label [[EXIT]]
234; CHECK:       loop.latch:
235; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
236; CHECK-NEXT:    call void @use(i1 [[C_1]])
237; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
238; CHECK-NEXT:    call void @use(i1 [[C_2]])
239; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
240; CHECK-NEXT:    call void @use(i1 [[C_3]])
241; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
242; CHECK-NEXT:    call void @use(i1 [[C_4]])
243; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
244; CHECK-NEXT:    call void @use(i1 [[C_5]])
245; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
246; CHECK-NEXT:    call void @use(i1 [[C_6]])
247; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
248; CHECK-NEXT:    call void @use(i1 [[C_7]])
249; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
250; CHECK-NEXT:    call void @use(i1 [[C_8]])
251; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
252; CHECK-NEXT:    br label [[LOOP_HEADER]]
253; CHECK:       exit:
254; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[Y]], 10
255; CHECK-NEXT:    call void @use(i1 [[T_1]])
256; CHECK-NEXT:    ret void
257;
258entry:
259  br i1 %c, label %loop.header, label %exit
260
261loop.header:
262  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
263  %x.1 = icmp ule i32 %x, 10
264  %y.1 = icmp ugt i32 %y, 99
265  %or = or i1 %x.1, %y.1
266  br i1 %or, label %loop.latch, label %exit
267
268loop.latch:
269  %c.1 = icmp ule i32 %x, 10
270  call void @use(i1 %c.1)
271  %c.2 = icmp ugt i32 %x, 10
272  call void @use(i1 %c.2)
273  %c.3 = icmp ule i32 %x, 9
274  call void @use(i1 %c.3)
275  %c.4 = icmp ugt i32 %x, 9
276  call void @use(i1 %c.4)
277
278
279  %c.5 = icmp ugt i32 %y, 99
280  call void @use(i1 %c.5)
281  %c.6 = icmp ule i32 %y, 99
282  call void @use(i1 %c.6)
283
284  %c.7 = icmp ugt i32 %y, 100
285  call void @use(i1 %c.7)
286  %c.8 = icmp ugt i32 %y, 100
287  call void @use(i1 %c.8)
288
289  %x.next = add i32 %x, 1
290  br label %loop.header
291
292exit:
293  %t.1 = icmp ugt i32 %y, 10
294  call void @use(i1 %t.1)
295  ret void
296}
297
298
299define void @loop_header_dom_and(i32 %y, i1 %c) {
300; CHECK-LABEL: @loop_header_dom_and(
301; CHECK-NEXT:  entry:
302; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
303; CHECK:       exit:
304; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10
305; CHECK-NEXT:    call void @use(i1 [[C_5]])
306; CHECK-NEXT:    ret void
307; CHECK:       loop.header:
308; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
309; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
310; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
311; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
312; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
313; CHECK:       loop.latch:
314; CHECK-NEXT:    call void @use(i1 true)
315; CHECK-NEXT:    call void @use(i1 false)
316; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 9
317; CHECK-NEXT:    call void @use(i1 [[C_1]])
318; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 9
319; CHECK-NEXT:    call void @use(i1 [[C_2]])
320; CHECK-NEXT:    call void @use(i1 true)
321; CHECK-NEXT:    call void @use(i1 false)
322; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[Y]], 100
323; CHECK-NEXT:    call void @use(i1 [[C_3]])
324; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y]], 100
325; CHECK-NEXT:    call void @use(i1 [[C_4]])
326; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
327; CHECK-NEXT:    br label [[LOOP_HEADER]]
328; CHECK:       exit.1:
329; CHECK-NEXT:    [[C_6:%.*]] = icmp ugt i32 [[Y]], 10
330; CHECK-NEXT:    call void @use(i1 [[C_6]])
331; CHECK-NEXT:    ret void
332;
333entry:
334  br i1 %c, label %loop.header, label %exit
335
336exit:
337  %c.5 = icmp ugt i32 %y, 10
338  call void @use(i1 %c.5)
339  ret void
340
341loop.header:
342  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
343  %x.1 = icmp ule i32 %x, 10
344  %y.1 = icmp ugt i32 %y, 99
345  %and = and i1 %x.1, %y.1
346  br i1 %and, label %loop.latch, label %exit.1
347
348loop.latch:
349  %t.1 = icmp ule i32 %x, 10
350  call void @use(i1 %t.1)
351  %f.1 = icmp ugt i32 %x, 10
352  call void @use(i1 %f.1)
353  %c.1 = icmp ule i32 %x, 9
354  call void @use(i1 %c.1)
355  %c.2 = icmp ugt i32 %x, 9
356  call void @use(i1 %c.2)
357
358
359  %t.2 = icmp ugt i32 %y, 99
360  call void @use(i1 %t.2)
361  %f.2 = icmp ule i32 %y, 99
362  call void @use(i1 %f.2)
363
364  %c.3 = icmp ugt i32 %y, 100
365  call void @use(i1 %c.3)
366  %c.4 = icmp ugt i32 %y, 100
367  call void @use(i1 %c.4)
368
369  %x.next = add i32 %x, 1
370  br label %loop.header
371
372exit.1:
373  %c.6 = icmp ugt i32 %y, 10
374  call void @use(i1 %c.6)
375  ret void
376}
377
378define void @loop_header_dom_and_successors_flipped(i32 %y, i1 %c) {
379; CHECK-LABEL: @loop_header_dom_and_successors_flipped(
380; CHECK-NEXT:  entry:
381; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]
382; CHECK:       exit:
383; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10
384; CHECK-NEXT:    call void @use(i1 [[C_9]])
385; CHECK-NEXT:    ret void
386; CHECK:       loop.header:
387; CHECK-NEXT:    [[X:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[X_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
388; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X]], 10
389; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
390; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
391; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP_LATCH]]
392; CHECK:       loop.latch:
393; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
394; CHECK-NEXT:    call void @use(i1 [[C_1]])
395; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
396; CHECK-NEXT:    call void @use(i1 [[C_2]])
397; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
398; CHECK-NEXT:    call void @use(i1 [[C_3]])
399; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
400; CHECK-NEXT:    call void @use(i1 [[C_4]])
401; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
402; CHECK-NEXT:    call void @use(i1 [[C_5]])
403; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
404; CHECK-NEXT:    call void @use(i1 [[C_6]])
405; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
406; CHECK-NEXT:    call void @use(i1 [[C_7]])
407; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
408; CHECK-NEXT:    call void @use(i1 [[C_8]])
409; CHECK-NEXT:    [[X_NEXT]] = add i32 [[X]], 1
410; CHECK-NEXT:    br label [[LOOP_HEADER]]
411; CHECK:       exit.1:
412; CHECK-NEXT:    call void @use(i1 true)
413; CHECK-NEXT:    ret void
414;
415entry:
416  br i1 %c, label %loop.header, label %exit
417
418exit:
419  %c.9 = icmp ugt i32 %y, 10
420  call void @use(i1 %c.9)
421  ret void
422
423loop.header:
424  %x = phi i32 [ 0, %entry ], [ %x.next, %loop.latch ]
425  %x.1 = icmp ule i32 %x, 10
426  %y.1 = icmp ugt i32 %y, 99
427  %and = and i1 %x.1, %y.1
428  br i1 %and, label %exit.1, label %loop.latch
429
430loop.latch:
431  %c.1 = icmp ule i32 %x, 10
432  call void @use(i1 %c.1)
433  %c.2 = icmp ugt i32 %x, 10
434  call void @use(i1 %c.2)
435  %c.3 = icmp ule i32 %x, 9
436  call void @use(i1 %c.3)
437  %c.4 = icmp ugt i32 %x, 9
438  call void @use(i1 %c.4)
439
440
441  %c.5 = icmp ugt i32 %y, 99
442  call void @use(i1 %c.5)
443  %c.6 = icmp ule i32 %y, 99
444  call void @use(i1 %c.6)
445
446  %c.7 = icmp ugt i32 %y, 100
447  call void @use(i1 %c.7)
448  %c.8 = icmp ugt i32 %y, 100
449  call void @use(i1 %c.8)
450
451  %x.next = add i32 %x, 1
452  br label %loop.header
453
454exit.1:
455  %t.1 = icmp ugt i32 %y, 10
456  call void @use(i1 %t.1)
457  ret void
458}
459