[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / ConstraintElimination / dom.ll
blob965286df5d646d2a9faf4ed0570e1c688b1a0502
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
4 ; Test cases where both the true and false successors reach the same block,
5 ; dominated by one of them.
7 declare void @use(i1)
9 define i1 @test1(i8 %x) {
10 ; CHECK-LABEL: @test1(
11 ; CHECK-NEXT:  entry:
12 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
13 ; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
14 ; CHECK:       bb1:
15 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 10
16 ; CHECK-NEXT:    call void @use(i1 true)
17 ; CHECK-NEXT:    br label [[BB2]]
18 ; CHECK:       bb2:
19 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[X]], 10
20 ; CHECK-NEXT:    ret i1 [[C_3]]
22 entry:
23   %c.1 = icmp ule i8 %x, 10
24   br i1 %c.1, label %bb1, label %bb2
26 bb1:
27   %c.2 = icmp ule i8 %x, 10
28   call void @use(i1 %c.2)
29   br label %bb2
31 bb2:
32   %c.3 = icmp ugt i8 %x, 10
33   ret i1 %c.3
37 define i1 @test2(i8 %x) {
38 ; CHECK-LABEL: @test2(
39 ; CHECK-NEXT:  entry:
40 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
41 ; CHECK-NEXT:    br i1 [[C_1]], label [[BB2:%.*]], label [[BB1:%.*]]
42 ; CHECK:       bb1:
43 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[X]], 10
44 ; CHECK-NEXT:    ret i1 [[C_2]]
45 ; CHECK:       bb2:
46 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i8 [[X]], 10
47 ; CHECK-NEXT:    call void @use(i1 true)
48 ; CHECK-NEXT:    br label [[BB1]]
50 entry:
51   %c.1 = icmp ule i8 %x, 10
52   br i1 %c.1, label %bb2, label %bb1
54 bb1:
55   %c.2 = icmp ugt i8 %x, 10
56   ret i1 %c.2
58 bb2:
59   %c.3 = icmp ule i8 %x, 10
60   call void @use(i1 %c.3)
61   br label %bb1
65 ; Test cases where the true/false successors are not domianted by the conditional branching block.
66 define i1 @test3(i8 %x, i1 %c) {
67 ; CHECK-LABEL: @test3(
68 ; CHECK-NEXT:  entry:
69 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB1:%.*]]
70 ; CHECK:       bb.cond:
71 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
72 ; CHECK-NEXT:    br i1 [[C_1]], label [[BB1]], label [[BB2:%.*]]
73 ; CHECK:       bb1:
74 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 10
75 ; CHECK-NEXT:    ret i1 [[C_2]]
76 ; CHECK:       bb2:
77 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[X]], 10
78 ; CHECK-NEXT:    ret i1 true
80 entry:
81   br i1 %c, label %bb.cond, label %bb1
83 bb.cond:
84   %c.1 = icmp ule i8 %x, 10
85   br i1 %c.1, label %bb1, label %bb2
87 bb1:
88   %c.2 = icmp ule i8 %x, 10
89   ret i1 %c.2
91 bb2:
92   %c.3 = icmp ugt i8 %x, 10
93   ret i1 %c.3
96 define i1 @test4(i8 %x, i1 %c) {
97 ; CHECK-LABEL: @test4(
98 ; CHECK-NEXT:  entry:
99 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB2:%.*]]
100 ; CHECK:       bb.cond:
101 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
102 ; CHECK-NEXT:    br i1 [[C_1]], label [[BB1:%.*]], label [[BB2]]
103 ; CHECK:       bb1:
104 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 10
105 ; CHECK-NEXT:    ret i1 true
106 ; CHECK:       bb2:
107 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[X]], 10
108 ; CHECK-NEXT:    ret i1 [[C_3]]
110 entry:
111   br i1 %c, label %bb.cond, label %bb2
113 bb.cond:
114   %c.1 = icmp ule i8 %x, 10
115   br i1 %c.1, label %bb1, label %bb2
117 bb1:
118   %c.2 = icmp ule i8 %x, 10
119   ret i1 %c.2
121 bb2:
122   %c.3 = icmp ugt i8 %x, 10
123   ret i1 %c.3
127 define i1 @test_cond_from_preheader(i8 %x, i1 %c) {
128 ; CHECK-LABEL: @test_cond_from_preheader(
129 ; CHECK-NEXT:  entry:
130 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
131 ; CHECK:       pre:
132 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
133 ; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP:%.*]], label [[BB2]]
134 ; CHECK:       loop:
135 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[X]], 10
136 ; CHECK-NEXT:    call void @use(i1 true)
137 ; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i8 [[X]], 10
138 ; CHECK-NEXT:    call void @use(i1 false)
139 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 9
140 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
141 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[X]], 9
142 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
143 ; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
144 ; CHECK:       exit:
145 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i8 [[X]], 10
146 ; CHECK-NEXT:    ret i1 true
147 ; CHECK:       bb2:
148 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[X]], 10
149 ; CHECK-NEXT:    ret i1 [[C_5]]
151 entry:
152   br i1 %c, label %pre, label %bb2
154 pre:
155   %c.1 = icmp ule i8 %x, 10
156   br i1 %c.1, label %loop, label %bb2
158 loop:
159   %t.1 = icmp ule i8 %x, 10
160   call void @use(i1 %t.1)
161   %f.1 = icmp ugt i8 %x, 10
162   call void @use(i1 %f.1)
164   %c.2 = icmp ule i8 %x, 9
165   call void @use(i1 %c.2)
166   %c.3 = icmp ugt i8 %x, 9
167   call void @use(i1 %c.3)
169   br i1 true, label %exit, label %loop
171 exit:
172   %c.4 = icmp ule i8 %x, 10
173   ret i1 %c.4
175 bb2:
176   %c.5 = icmp ugt i8 %x, 10
177   ret i1 %c.5
180 define i1 @test_cond_from_preheader_successors_flipped(i8 %x, i1 %c) {
181 ; CHECK-LABEL: @test_cond_from_preheader_successors_flipped(
182 ; CHECK-NEXT:  entry:
183 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
184 ; CHECK:       pre:
185 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
186 ; CHECK-NEXT:    br i1 [[C_1]], label [[BB2]], label [[LOOP:%.*]]
187 ; CHECK:       loop:
188 ; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[X]], 10
189 ; CHECK-NEXT:    call void @use(i1 false)
190 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 10
191 ; CHECK-NEXT:    call void @use(i1 true)
192 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 11
193 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
194 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[X]], 11
195 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
196 ; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[LOOP]]
197 ; CHECK:       exit:
198 ; CHECK-NEXT:    [[F_2:%.*]] = icmp ule i8 [[X]], 10
199 ; CHECK-NEXT:    ret i1 false
200 ; CHECK:       bb2:
201 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[X]], 10
202 ; CHECK-NEXT:    ret i1 [[C_5]]
204 entry:
205   br i1 %c, label %pre, label %bb2
207 pre:
208   %c.1 = icmp ule i8 %x, 10
209   br i1 %c.1, label %bb2, label %loop
211 loop:
212   %f.1 = icmp ule i8 %x, 10
213   call void @use(i1 %f.1)
214   %t.1 = icmp ugt i8 %x, 10
215   call void @use(i1 %t.1)
217   %c.2 = icmp ule i8 %x, 11
218   call void @use(i1 %c.2)
219   %c.3 = icmp ugt i8 %x, 11
220   call void @use(i1 %c.3)
222   br i1 true, label %exit, label %loop
224 exit:
225   %f.2 = icmp ule i8 %x, 10
226   ret i1 %f.2
228 bb2:
229   %c.5 = icmp ugt i8 %x, 10
230   ret i1 %c.5
233 define i1 @test_cond_from_preheader_and(i8 %x, i8 %y, i1 %c) {
234 ; CHECK-LABEL: @test_cond_from_preheader_and(
235 ; CHECK-NEXT:  entry:
236 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
237 ; CHECK:       exit:
238 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10
239 ; CHECK-NEXT:    ret i1 [[C_5]]
240 ; CHECK:       pre:
241 ; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
242 ; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
243 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
244 ; CHECK-NEXT:    br i1 [[AND]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
245 ; CHECK:       loop:
246 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[X]], 10
247 ; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i8 [[X]], 10
248 ; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, false
249 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X]], 9
250 ; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
251 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[X]], 9
252 ; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]
253 ; CHECK-NEXT:    [[T_2:%.*]] = icmp ugt i8 [[Y]], 99
254 ; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
255 ; CHECK-NEXT:    [[F_2:%.*]] = icmp ule i8 [[Y]], 99
256 ; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], false
257 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i8 [[Y]], 100
258 ; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]
259 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i8 [[Y]], 100
260 ; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]
261 ; CHECK-NEXT:    call void @use(i1 [[R_7]])
262 ; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
263 ; CHECK:       exit.1:
264 ; CHECK-NEXT:    [[C_6:%.*]] = icmp ugt i8 [[Y]], 10
265 ; CHECK-NEXT:    ret i1 [[C_6]]
267 entry:
268   br i1 %c, label %pre, label %exit
270 exit:
271   %c.5 = icmp ugt i8 %y, 10
272   ret i1 %c.5
274 pre:
275   %x.1 = icmp ule i8 %x, 10
276   %y.1 = icmp ugt i8 %y, 99
277   %and = and i1 %x.1, %y.1
278   br i1 %and, label %loop, label %exit.1
280 loop:
281   %t.1 = icmp ule i8 %x, 10
282   %f.1 = icmp ugt i8 %x, 10
283   %r.1 = xor i1 %t.1, %f.1
285   %c.1 = icmp ule i8 %x, 9
286   %r.2 = xor i1 %r.1, %c.1
288   %c.2 = icmp ugt i8 %x, 9
289   %r.3 = xor i1 %r.2, %c.2
291   %t.2 = icmp ugt i8 %y, 99
292   %r.4 = xor i1 %r.3, %t.2
294   %f.2 = icmp ule i8 %y, 99
295   %r.5 = xor i1 %r.4, %f.2
297   %c.3 = icmp ugt i8 %y, 100
298   %r.6 = xor i1 %r.5, %c.3
300   %c.4 = icmp ugt i8 %y, 100
301   %r.7 = xor i1 %r.6, %c.4
302   call void @use(i1 %r.7)
304   br i1 true, label %exit, label %loop
306 exit.1:
307   %c.6 = icmp ugt i8 %y, 10
308   ret i1 %c.6
312 define i1 @test_cond_from_preheader_and_successors_flipped(i8 %x, i8 %y, i1 %c) {
313 ; CHECK-LABEL: @test_cond_from_preheader_and_successors_flipped(
314 ; CHECK-NEXT:  entry:
315 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
316 ; CHECK:       exit:
317 ; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10
318 ; CHECK-NEXT:    ret i1 [[C_9]]
319 ; CHECK:       pre:
320 ; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
321 ; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
322 ; CHECK-NEXT:    [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
323 ; CHECK-NEXT:    br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
324 ; CHECK:       loop:
325 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X]], 10
326 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[X]], 10
327 ; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]
328 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i8 [[X]], 9
329 ; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
330 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i8 [[X]], 9
331 ; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
332 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[Y]], 99
333 ; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
334 ; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i8 [[Y]], 99
335 ; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
336 ; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i8 [[Y]], 100
337 ; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
338 ; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i8 [[Y]], 100
339 ; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
340 ; CHECK-NEXT:    call void @use(i1 [[R_7]])
341 ; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
342 ; CHECK:       exit.1:
343 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[Y]], 10
344 ; CHECK-NEXT:    ret i1 true
346 entry:
347   br i1 %c, label %pre, label %exit
349 exit:
350   %c.9 = icmp ugt i8 %y, 10
351   ret i1 %c.9
353 pre:
354   %x.1 = icmp ule i8 %x, 10
355   %y.1 = icmp ugt i8 %y, 99
356   %and = and i1 %x.1, %y.1
357   br i1 %and, label %exit.1, label %loop
359 loop:
360   %c.1 = icmp ule i8 %x, 10
361   %c.2 = icmp ugt i8 %x, 10
362   %r.1 = xor i1 %c.1, %c.2
363   %c.3 = icmp ule i8 %x, 9
364   %r.2 = xor i1 %r.1, %c.3
365   %c.4 = icmp ugt i8 %x, 9
366   %r.3 = xor i1 %r.2, %c.4
368   %c.5 = icmp ugt i8 %y, 99
369   %r.4 = xor i1 %r.3, %c.5
370   %c.6 = icmp ule i8 %y, 99
371   %r.5 = xor i1 %r.4, %c.6
373   %c.7 = icmp ugt i8 %y, 100
374   %r.6 = xor i1 %r.5, %c.7
375   %c.8 = icmp ugt i8 %y, 100
376   %r.7 = xor i1 %r.6, %c.8
377   call void @use(i1 %r.7)
379   br i1 true, label %exit, label %loop
381 exit.1:
382   %t.1 = icmp ugt i8 %y, 10
383   ret i1 %t.1
386 define i1 @test_cond_from_preheader_or(i8 %x, i8 %y, i1 %c) {
387 ; CHECK-LABEL: @test_cond_from_preheader_or(
388 ; CHECK-NEXT:  entry:
389 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
390 ; CHECK:       exit:
391 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10
392 ; CHECK-NEXT:    ret i1 [[C_5]]
393 ; CHECK:       pre:
394 ; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
395 ; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
396 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
397 ; CHECK-NEXT:    br i1 [[OR]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
398 ; CHECK:       loop:
399 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 10
400 ; CHECK-NEXT:    [[F_1:%.*]] = icmp ule i8 [[X]], 10
401 ; CHECK-NEXT:    [[R_1:%.*]] = xor i1 true, false
402 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X]], 11
403 ; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
404 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ule i8 [[X]], 11
405 ; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]
406 ; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i8 [[Y]], 99
407 ; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], true
408 ; CHECK-NEXT:    [[F_2:%.*]] = icmp ugt i8 [[Y]], 99
409 ; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], false
410 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i8 [[Y]], 98
411 ; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]
412 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i8 [[Y]], 98
413 ; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]
414 ; CHECK-NEXT:    call void @use(i1 [[R_7]])
415 ; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
416 ; CHECK:       exit.1:
417 ; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i8 [[Y]], 100
418 ; CHECK-NEXT:    ret i1 [[C_6]]
420 entry:
421   br i1 %c, label %pre, label %exit
423 exit:
424   %c.5 = icmp ugt i8 %y, 10
425   ret i1 %c.5
427 pre:
428   %x.1 = icmp ule i8 %x, 10
429   %y.1 = icmp ugt i8 %y, 99
430   %or = or i1 %x.1, %y.1
431   br i1 %or, label %exit.1, label %loop
433 loop:
434   %t.1 = icmp ugt i8 %x, 10
435   %f.1 = icmp ule i8 %x, 10
436   %r.1 = xor i1 %t.1, %f.1
437   %c.1 = icmp ugt i8 %x, 11
438   %r.2 = xor i1 %r.1, %c.1
439   %c.2 = icmp ule i8 %x, 11
440   %r.3 = xor i1 %r.2, %c.2
442   %t.2 = icmp ule i8 %y, 99
443   %r.4 = xor i1 %r.3, %t.2
444   %f.2 = icmp ugt i8 %y, 99
445   %r.5 = xor i1 %r.4, %f.2
447   %c.3 = icmp ule i8 %y, 98
448   %r.6 = xor i1 %r.5, %c.3
449   %c.4 = icmp ule i8 %y, 98
450   %r.7 = xor i1 %r.6, %c.4
451   call void @use(i1 %r.7)
453   br i1 true, label %exit, label %loop
455 exit.1:
456   %c.6 = icmp ule i8 %y, 100
457   ret i1 %c.6
460 define i1 @test_cond_from_preheader_or_successor_flipped(i8 %x, i8 %y, i1 %c) {
461 ; CHECK-LABEL: @test_cond_from_preheader_or_successor_flipped(
462 ; CHECK-NEXT:  entry:
463 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
464 ; CHECK:       exit:
465 ; CHECK-NEXT:    [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10
466 ; CHECK-NEXT:    ret i1 [[C_9]]
467 ; CHECK:       pre:
468 ; CHECK-NEXT:    [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
469 ; CHECK-NEXT:    [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
470 ; CHECK-NEXT:    [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
471 ; CHECK-NEXT:    br i1 [[OR]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
472 ; CHECK:       loop:
473 ; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X]], 10
474 ; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[X]], 10
475 ; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]
476 ; CHECK-NEXT:    [[C_3:%.*]] = icmp ule i8 [[X]], 9
477 ; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
478 ; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i8 [[X]], 9
479 ; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
480 ; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[Y]], 99
481 ; CHECK-NEXT:    [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
482 ; CHECK-NEXT:    [[C_6:%.*]] = icmp ule i8 [[Y]], 99
483 ; CHECK-NEXT:    [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
484 ; CHECK-NEXT:    [[C_7:%.*]] = icmp ugt i8 [[Y]], 100
485 ; CHECK-NEXT:    [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
486 ; CHECK-NEXT:    [[C_8:%.*]] = icmp ugt i8 [[Y]], 100
487 ; CHECK-NEXT:    [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
488 ; CHECK-NEXT:    call void @use(i1 [[R_7]])
489 ; CHECK-NEXT:    br i1 true, label [[EXIT]], label [[LOOP]]
490 ; CHECK:       exit.1:
491 ; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[Y]], 100
492 ; CHECK-NEXT:    ret i1 true
494 entry:
495   br i1 %c, label %pre, label %exit
497 exit:
498   %c.9 = icmp ugt i8 %y, 10
499   ret i1 %c.9
501 pre:
502   %x.1 = icmp ule i8 %x, 10
503   %y.1 = icmp ugt i8 %y, 99
504   %or = or i1 %x.1, %y.1
505   br i1 %or, label %loop, label %exit.1
507 loop:
508   %c.1 = icmp ule i8 %x, 10
509   %c.2 = icmp ugt i8 %x, 10
510   %r.1 = xor i1 %c.1, %c.2
511   %c.3 = icmp ule i8 %x, 9
512   %r.2 = xor i1 %r.1, %c.3
513   %c.4 = icmp ugt i8 %x, 9
514   %r.3 = xor i1 %r.2, %c.4
516   %c.5 = icmp ugt i8 %y, 99
517   %r.4 = xor i1 %r.3, %c.5
518   %c.6 = icmp ule i8 %y, 99
519   %r.5 = xor i1 %r.4, %c.6
521   %c.7 = icmp ugt i8 %y, 100
522   %r.6 = xor i1 %r.5, %c.7
523   %c.8 = icmp ugt i8 %y, 100
524   %r.7 = xor i1 %r.6, %c.8
525   call void @use(i1 %r.7)
527   br i1 true, label %exit, label %loop
529 exit.1:
530   %t.1 = icmp ule i8 %y, 100
531   ret i1 %t.1