1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -constraint-elimination -S %s | FileCheck %s
3; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
4
5; Test cases where both the true and false successors reach the same block,
6; dominated by one of them.
7
8declare void @use(i1)
9
10define i32 @test1(i32 %x) {
11; CHECK-LABEL: @test1(
12; CHECK-NEXT:  entry:
13; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
14; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
15; CHECK:       bb1:
16; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 10
17; CHECK-NEXT:    call void @use(i1 true)
18; CHECK-NEXT:    br label [[BB2]]
19; CHECK:       bb2:
20; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 10
21; CHECK-NEXT:    call void @use(i1 [[C_3]])
22; CHECK-NEXT:    ret i32 20
23;
24entry:
25  %c.1 = icmp ule i32 %x, 10
26  br i1 %c.1, label %bb1, label %bb2
27
28bb1:
29  %c.2 = icmp ule i32 %x, 10
30  call void @use(i1 %c.2)
31  br label %bb2
32
33bb2:
34  %c.3 = icmp ugt i32 %x, 10
35  call void @use(i1 %c.3)
36  ret i32 20
37}
38
39
40define i32 @test2(i32 %x) {
41; CHECK-LABEL: @test2(
42; CHECK-NEXT:  entry:
43; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
44; CHECK-NEXT:    br i1 [[C_1]], label [[BB2:%.*]], label [[BB1:%.*]]
45; CHECK:       bb1:
46; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
47; CHECK-NEXT:    call void @use(i1 [[C_2]])
48; CHECK-NEXT:    ret i32 20
49; CHECK:       bb2:
50; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 10
51; CHECK-NEXT:    call void @use(i1 true)
52; CHECK-NEXT:    br label [[BB1]]
53;
54entry:
55  %c.1 = icmp ule i32 %x, 10
56  br i1 %c.1, label %bb2, label %bb1
57
58bb1:
59  %c.2 = icmp ugt i32 %x, 10
60  call void @use(i1 %c.2)
61  ret i32 20
62
63bb2:
64  %c.3 = icmp ule i32 %x, 10
65  call void @use(i1 %c.3)
66  br label %bb1
67}
68
69
70; Test cases where the true/false successors are not domianted by the conditional branching block.
71define i32 @test3(i32 %x, i1 %c) {
72; CHECK-LABEL: @test3(
73; CHECK-NEXT:  entry:
74; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB1:%.*]]
75; CHECK:       bb.cond:
76; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
77; CHECK-NEXT:    br i1 [[C_1]], label [[BB1]], label [[BB2:%.*]]
78; CHECK:       bb1:
79; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 10
80; CHECK-NEXT:    call void @use(i1 [[C_2]])
81; CHECK-NEXT:    ret i32 10
82; CHECK:       bb2:
83; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 10
84; CHECK-NEXT:    call void @use(i1 true)
85; CHECK-NEXT:    ret i32 20
86;
87entry:
88  br i1 %c, label %bb.cond, label %bb1
89
90bb.cond:
91  %c.1 = icmp ule i32 %x, 10
92  br i1 %c.1, label %bb1, label %bb2
93
94bb1:
95  %c.2 = icmp ule i32 %x, 10
96  call void @use(i1 %c.2)
97  ret i32 10
98
99bb2:
100  %c.3 = icmp ugt i32 %x, 10
101  call void @use(i1 %c.3)
102  ret i32 20
103}
104
105define i32 @test4(i32 %x, i1 %c) {
106; CHECK-LABEL: @test4(
107; CHECK-NEXT:  entry:
108; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB2:%.*]]
109; CHECK:       bb.cond:
110; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
111; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2]]
112; CHECK:       bb1:
113; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 10
114; CHECK-NEXT:    call void @use(i1 true)
115; CHECK-NEXT:    ret i32 10
116; CHECK:       bb2:
117; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 10
118; CHECK-NEXT:    call void @use(i1 [[C_3]])
119; CHECK-NEXT:    ret i32 20
120;
121entry:
122  br i1 %c, label %bb.cond, label %bb2
123
124bb.cond:
125  %c.1 = icmp ule i32 %x, 10
126  br i1 %c.1, label %bb1, label %bb2
127
128bb1:
129  %c.2 = icmp ule i32 %x, 10
130  call void @use(i1 %c.2)
131  ret i32 10
132
133bb2:
134  %c.3 = icmp ugt i32 %x, 10
135  call void @use(i1 %c.3)
136  ret i32 20
137}
138
139
140define void @test_cond_from_preheader(i32 %x, i1 %c) {
141; CHECK-LABEL: @test_cond_from_preheader(
142; CHECK-NEXT:  entry:
143; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
144; CHECK:       pre:
145; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
146; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP:%.*]], label [[BB2]]
147; CHECK:       loop:
148; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[X]], 10
149; CHECK-NEXT:    call void @use(i1 true)
150; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i32 [[X]], 10
151; CHECK-NEXT:    call void @use(i1 false)
152; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 9
153; CHECK-NEXT:    call void @use(i1 [[C_2]])
154; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 9
155; CHECK-NEXT:    call void @use(i1 [[C_3]])
156; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
157; CHECK:       exit:
158; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i32 [[X]], 10
159; CHECK-NEXT:    call void @use(i1 true)
160; CHECK-NEXT:    ret void
161; CHECK:       bb2:
162; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[X]], 10
163; CHECK-NEXT:    call void @use(i1 [[C_5]])
164; CHECK-NEXT:    ret void
165;
166entry:
167  br i1 %c, label %pre, label %bb2
168
169pre:
170  %c.1 = icmp ule i32 %x, 10
171  br i1 %c.1, label %loop, label %bb2
172
173loop:
174  %t.1 = icmp ule i32 %x, 10
175  call void @use(i1 %t.1)
176  %f.1 = icmp ugt i32 %x, 10
177  call void @use(i1 %f.1)
178
179  %c.2 = icmp ule i32 %x, 9
180  call void @use(i1 %c.2)
181  %c.3 = icmp ugt i32 %x, 9
182  call void @use(i1 %c.3)
183
184  br i1 true, label %exit, label %loop
185
186exit:
187  %c.4 = icmp ule i32 %x, 10
188  call void @use(i1 %c.4)
189  ret void
190
191bb2:
192  %c.5 = icmp ugt i32 %x, 10
193  call void @use(i1 %c.5)
194  ret void
195}
196
197define void @test_cond_from_preheader_successors_flipped(i32 %x, i1 %c) {
198; CHECK-LABEL: @test_cond_from_preheader_successors_flipped(
199; CHECK-NEXT:  entry:
200; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
201; CHECK:       pre:
202; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10
203; CHECK-NEXT:    br i1 [[C_1]], label [[BB2]], label [[LOOP:%.*]]
204; CHECK:       loop:
205; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i32 [[X]], 10
206; CHECK-NEXT:    call void @use(i1 false)
207; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[X]], 10
208; CHECK-NEXT:    call void @use(i1 true)
209; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 11
210; CHECK-NEXT:    call void @use(i1 [[C_2]])
211; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[X]], 11
212; CHECK-NEXT:    call void @use(i1 [[C_3]])
213; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
214; CHECK:       exit:
215; CHECK-NEXT:    [[F_2:%.*]] = icmp ule i32 [[X]], 10
216; CHECK-NEXT:    call void @use(i1 false)
217; CHECK-NEXT:    ret void
218; CHECK:       bb2:
219; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[X]], 10
220; CHECK-NEXT:    call void @use(i1 [[C_5]])
221; CHECK-NEXT:    ret void
222;
223entry:
224  br i1 %c, label %pre, label %bb2
225
226pre:
227  %c.1 = icmp ule i32 %x, 10
228  br i1 %c.1, label %bb2, label %loop
229
230loop:
231  %f.1 = icmp ule i32 %x, 10
232  call void @use(i1 %f.1)
233  %t.1 = icmp ugt i32 %x, 10
234  call void @use(i1 %t.1)
235
236  %c.2 = icmp ule i32 %x, 11
237  call void @use(i1 %c.2)
238  %c.3 = icmp ugt i32 %x, 11
239  call void @use(i1 %c.3)
240
241  br i1 true, label %exit, label %loop
242
243exit:
244  %f.2 = icmp ule i32 %x, 10
245  call void @use(i1 %f.2)
246  ret void
247
248bb2:
249  %c.5 = icmp ugt i32 %x, 10
250  call void @use(i1 %c.5)
251  ret void
252}
253
254define void @test_cond_from_preheader_and(i32 %x, i32 %y, i1 %c) {
255; CHECK-LABEL: @test_cond_from_preheader_and(
256; CHECK-NEXT:  entry:
257; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
258; CHECK:       exit:
259; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10
260; CHECK-NEXT:    call void @use(i1 [[C_5]])
261; CHECK-NEXT:    ret void
262; CHECK:       pre:
263; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10
264; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
265; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
266; CHECK-NEXT:    br i1 [[AND]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
267; CHECK:       loop:
268; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[X]], 10
269; CHECK-NEXT:    call void @use(i1 true)
270; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i32 [[X]], 10
271; CHECK-NEXT:    call void @use(i1 false)
272; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 9
273; CHECK-NEXT:    call void @use(i1 [[C_1]])
274; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 9
275; CHECK-NEXT:    call void @use(i1 [[C_2]])
276; CHECK-NEXT:    [[T_2:%.*]] = icmp ugt i32 [[Y]], 99
277; CHECK-NEXT:    call void @use(i1 true)
278; CHECK-NEXT:    [[F_2:%.*]] = icmp ule i32 [[Y]], 99
279; CHECK-NEXT:    call void @use(i1 false)
280; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[Y]], 100
281; CHECK-NEXT:    call void @use(i1 [[C_3]])
282; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[Y]], 100
283; CHECK-NEXT:    call void @use(i1 [[C_4]])
284; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
285; CHECK:       exit.1:
286; CHECK-NEXT:    [[C_6:%.*]] = icmp ugt i32 [[Y]], 10
287; CHECK-NEXT:    call void @use(i1 [[C_6]])
288; CHECK-NEXT:    ret void
289;
290entry:
291  br i1 %c, label %pre, label %exit
292
293exit:
294  %c.5 = icmp ugt i32 %y, 10
295  call void @use(i1 %c.5)
296  ret void
297
298pre:
299  %x.1 = icmp ule i32 %x, 10
300  %y.1 = icmp ugt i32 %y, 99
301  %and = and i1 %x.1, %y.1
302  br i1 %and, label %loop, label %exit.1
303
304loop:
305  %t.1 = icmp ule i32 %x, 10
306  call void @use(i1 %t.1)
307  %f.1 = icmp ugt i32 %x, 10
308  call void @use(i1 %f.1)
309  %c.1 = icmp ule i32 %x, 9
310  call void @use(i1 %c.1)
311  %c.2 = icmp ugt i32 %x, 9
312  call void @use(i1 %c.2)
313
314
315  %t.2 = icmp ugt i32 %y, 99
316  call void @use(i1 %t.2)
317  %f.2 = icmp ule i32 %y, 99
318  call void @use(i1 %f.2)
319
320  %c.3 = icmp ugt i32 %y, 100
321  call void @use(i1 %c.3)
322  %c.4 = icmp ugt i32 %y, 100
323  call void @use(i1 %c.4)
324
325  br i1 true, label %exit, label %loop
326
327exit.1:
328  %c.6 = icmp ugt i32 %y, 10
329  call void @use(i1 %c.6)
330  ret void
331}
332
333
334define void @test_cond_from_preheader_and_successors_flipped(i32 %x, i32 %y, i1 %c) {
335; CHECK-LABEL: @test_cond_from_preheader_and_successors_flipped(
336; CHECK-NEXT:  entry:
337; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
338; CHECK:       exit:
339; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10
340; CHECK-NEXT:    call void @use(i1 [[C_9]])
341; CHECK-NEXT:    ret void
342; CHECK:       pre:
343; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10
344; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
345; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
346; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
347; CHECK:       loop:
348; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
349; CHECK-NEXT:    call void @use(i1 [[C_1]])
350; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
351; CHECK-NEXT:    call void @use(i1 [[C_2]])
352; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
353; CHECK-NEXT:    call void @use(i1 [[C_3]])
354; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
355; CHECK-NEXT:    call void @use(i1 [[C_4]])
356; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
357; CHECK-NEXT:    call void @use(i1 [[C_5]])
358; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
359; CHECK-NEXT:    call void @use(i1 [[C_6]])
360; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
361; CHECK-NEXT:    call void @use(i1 [[C_7]])
362; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
363; CHECK-NEXT:    call void @use(i1 [[C_8]])
364; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
365; CHECK:       exit.1:
366; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[Y]], 10
367; CHECK-NEXT:    call void @use(i1 true)
368; CHECK-NEXT:    ret void
369;
370entry:
371  br i1 %c, label %pre, label %exit
372
373exit:
374  %c.9 = icmp ugt i32 %y, 10
375  call void @use(i1 %c.9)
376  ret void
377
378pre:
379  %x.1 = icmp ule i32 %x, 10
380  %y.1 = icmp ugt i32 %y, 99
381  %and = and i1 %x.1, %y.1
382  br i1 %and, label %exit.1, label %loop
383
384loop:
385  %c.1 = icmp ule i32 %x, 10
386  call void @use(i1 %c.1)
387  %c.2 = icmp ugt i32 %x, 10
388  call void @use(i1 %c.2)
389  %c.3 = icmp ule i32 %x, 9
390  call void @use(i1 %c.3)
391  %c.4 = icmp ugt i32 %x, 9
392  call void @use(i1 %c.4)
393
394
395  %c.5 = icmp ugt i32 %y, 99
396  call void @use(i1 %c.5)
397  %c.6 = icmp ule i32 %y, 99
398  call void @use(i1 %c.6)
399
400  %c.7 = icmp ugt i32 %y, 100
401  call void @use(i1 %c.7)
402  %c.8 = icmp ugt i32 %y, 100
403  call void @use(i1 %c.8)
404
405  br i1 true, label %exit, label %loop
406
407exit.1:
408  %t.1 = icmp ugt i32 %y, 10
409  call void @use(i1 %t.1)
410  ret void
411}
412
413define void @test_cond_from_preheader_or(i32 %x, i32 %y, i1 %c) {
414; CHECK-LABEL: @test_cond_from_preheader_or(
415; CHECK-NEXT:  entry:
416; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
417; CHECK:       exit:
418; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10
419; CHECK-NEXT:    call void @use(i1 [[C_5]])
420; CHECK-NEXT:    ret void
421; CHECK:       pre:
422; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10
423; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
424; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
425; CHECK-NEXT:    br i1 [[OR]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
426; CHECK:       loop:
427; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[X]], 10
428; CHECK-NEXT:    call void @use(i1 true)
429; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i32 [[X]], 10
430; CHECK-NEXT:    call void @use(i1 false)
431; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[X]], 11
432; CHECK-NEXT:    call void @use(i1 [[C_1]])
433; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i32 [[X]], 11
434; CHECK-NEXT:    call void @use(i1 [[C_2]])
435; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i32 [[Y]], 99
436; CHECK-NEXT:    call void @use(i1 true)
437; CHECK-NEXT:    [[F_2:%.*]] = icmp ugt i32 [[Y]], 99
438; CHECK-NEXT:    call void @use(i1 false)
439; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[Y]], 98
440; CHECK-NEXT:    call void @use(i1 [[C_3]])
441; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i32 [[Y]], 98
442; CHECK-NEXT:    call void @use(i1 [[C_4]])
443; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
444; CHECK:       exit.1:
445; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 100
446; CHECK-NEXT:    call void @use(i1 [[C_6]])
447; CHECK-NEXT:    ret void
448;
449entry:
450  br i1 %c, label %pre, label %exit
451
452exit:
453  %c.5 = icmp ugt i32 %y, 10
454  call void @use(i1 %c.5)
455  ret void
456
457pre:
458  %x.1 = icmp ule i32 %x, 10
459  %y.1 = icmp ugt i32 %y, 99
460  %or = or i1 %x.1, %y.1
461  br i1 %or, label %exit.1, label %loop
462
463loop:
464  %t.1 = icmp ugt i32 %x, 10
465  call void @use(i1 %t.1)
466  %f.1 = icmp ule i32 %x, 10
467  call void @use(i1 %f.1)
468  %c.1 = icmp ugt i32 %x, 11
469  call void @use(i1 %c.1)
470  %c.2 = icmp ule i32 %x, 11
471  call void @use(i1 %c.2)
472
473
474  %t.2 = icmp ule i32 %y, 99
475  call void @use(i1 %t.2)
476  %f.2 = icmp ugt i32 %y, 99
477  call void @use(i1 %f.2)
478
479  %c.3 = icmp ule i32 %y, 98
480  call void @use(i1 %c.3)
481  %c.4 = icmp ule i32 %y, 98
482  call void @use(i1 %c.4)
483
484  br i1 true, label %exit, label %loop
485
486exit.1:
487  %c.6 = icmp ule i32 %y, 100
488  call void @use(i1 %c.6)
489  ret void
490}
491
492define void @test_cond_from_preheader_or_successor_flipped(i32 %x, i32 %y, i1 %c) {
493; CHECK-LABEL: @test_cond_from_preheader_or_successor_flipped(
494; CHECK-NEXT:  entry:
495; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
496; CHECK:       exit:
497; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10
498; CHECK-NEXT:    call void @use(i1 [[C_9]])
499; CHECK-NEXT:    ret void
500; CHECK:       pre:
501; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10
502; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99
503; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
504; CHECK-NEXT:    br i1 [[OR]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
505; CHECK:       loop:
506; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i32 [[X]], 10
507; CHECK-NEXT:    call void @use(i1 [[C_1]])
508; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[X]], 10
509; CHECK-NEXT:    call void @use(i1 [[C_2]])
510; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i32 [[X]], 9
511; CHECK-NEXT:    call void @use(i1 [[C_3]])
512; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[X]], 9
513; CHECK-NEXT:    call void @use(i1 [[C_4]])
514; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[Y]], 99
515; CHECK-NEXT:    call void @use(i1 [[C_5]])
516; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i32 [[Y]], 99
517; CHECK-NEXT:    call void @use(i1 [[C_6]])
518; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i32 [[Y]], 100
519; CHECK-NEXT:    call void @use(i1 [[C_7]])
520; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i32 [[Y]], 100
521; CHECK-NEXT:    call void @use(i1 [[C_8]])
522; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
523; CHECK:       exit.1:
524; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[Y]], 100
525; CHECK-NEXT:    call void @use(i1 true)
526; CHECK-NEXT:    ret void
527;
528entry:
529  br i1 %c, label %pre, label %exit
530
531exit:
532  %c.9 = icmp ugt i32 %y, 10
533  call void @use(i1 %c.9)
534  ret void
535
536pre:
537  %x.1 = icmp ule i32 %x, 10
538  %y.1 = icmp ugt i32 %y, 99
539  %or = or i1 %x.1, %y.1
540  br i1 %or, label %loop, label %exit.1
541
542loop:
543  %c.1 = icmp ule i32 %x, 10
544  call void @use(i1 %c.1)
545  %c.2 = icmp ugt i32 %x, 10
546  call void @use(i1 %c.2)
547  %c.3 = icmp ule i32 %x, 9
548  call void @use(i1 %c.3)
549  %c.4 = icmp ugt i32 %x, 9
550  call void @use(i1 %c.4)
551
552  %c.5 = icmp ugt i32 %y, 99
553  call void @use(i1 %c.5)
554  %c.6 = icmp ule i32 %y, 99
555  call void @use(i1 %c.6)
556
557  %c.7 = icmp ugt i32 %y, 100
558  call void @use(i1 %c.7)
559  %c.8 = icmp ugt i32 %y, 100
560  call void @use(i1 %c.8)
561
562  br i1 true, label %exit, label %loop
563
564exit.1:
565  %t.1 = icmp ule i32 %y, 100
566  call void @use(i1 %t.1)
567  ret void
568}
569