[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / ConstraintElimination / dom.ll
blob1c3e120a8962d3a4970bfd35fb4c4040c267cb25
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
5 ; Test cases where both the true and false successors reach the same block,
6 ; dominated by one of them.
8 declare void @use(i1)
10 define 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
24 entry:
25   %c.1 = icmp ule i32 %x, 10
26   br i1 %c.1, label %bb1, label %bb2
28 bb1:
29   %c.2 = icmp ule i32 %x, 10
30   call void @use(i1 %c.2)
31   br label %bb2
33 bb2:
34   %c.3 = icmp ugt i32 %x, 10
35   call void @use(i1 %c.3)
36   ret i32 20
40 define 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]]
54 entry:
55   %c.1 = icmp ule i32 %x, 10
56   br i1 %c.1, label %bb2, label %bb1
58 bb1:
59   %c.2 = icmp ugt i32 %x, 10
60   call void @use(i1 %c.2)
61   ret i32 20
63 bb2:
64   %c.3 = icmp ule i32 %x, 10
65   call void @use(i1 %c.3)
66   br label %bb1
70 ; Test cases where the true/false successors are not domianted by the conditional branching block.
71 define 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
87 entry:
88   br i1 %c, label %bb.cond, label %bb1
90 bb.cond:
91   %c.1 = icmp ule i32 %x, 10
92   br i1 %c.1, label %bb1, label %bb2
94 bb1:
95   %c.2 = icmp ule i32 %x, 10
96   call void @use(i1 %c.2)
97   ret i32 10
99 bb2:
100   %c.3 = icmp ugt i32 %x, 10
101   call void @use(i1 %c.3)
102   ret i32 20
105 define 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
121 entry:
122   br i1 %c, label %bb.cond, label %bb2
124 bb.cond:
125   %c.1 = icmp ule i32 %x, 10
126   br i1 %c.1, label %bb1, label %bb2
128 bb1:
129   %c.2 = icmp ule i32 %x, 10
130   call void @use(i1 %c.2)
131   ret i32 10
133 bb2:
134   %c.3 = icmp ugt i32 %x, 10
135   call void @use(i1 %c.3)
136   ret i32 20
140 define 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
166 entry:
167   br i1 %c, label %pre, label %bb2
169 pre:
170   %c.1 = icmp ule i32 %x, 10
171   br i1 %c.1, label %loop, label %bb2
173 loop:
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)
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)
184   br i1 true, label %exit, label %loop
186 exit:
187   %c.4 = icmp ule i32 %x, 10
188   call void @use(i1 %c.4)
189   ret void
191 bb2:
192   %c.5 = icmp ugt i32 %x, 10
193   call void @use(i1 %c.5)
194   ret void
197 define 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
223 entry:
224   br i1 %c, label %pre, label %bb2
226 pre:
227   %c.1 = icmp ule i32 %x, 10
228   br i1 %c.1, label %bb2, label %loop
230 loop:
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)
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)
241   br i1 true, label %exit, label %loop
243 exit:
244   %f.2 = icmp ule i32 %x, 10
245   call void @use(i1 %f.2)
246   ret void
248 bb2:
249   %c.5 = icmp ugt i32 %x, 10
250   call void @use(i1 %c.5)
251   ret void
254 define 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
290 entry:
291   br i1 %c, label %pre, label %exit
293 exit:
294   %c.5 = icmp ugt i32 %y, 10
295   call void @use(i1 %c.5)
296   ret void
298 pre:
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
304 loop:
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)
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)
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)
325   br i1 true, label %exit, label %loop
327 exit.1:
328   %c.6 = icmp ugt i32 %y, 10
329   call void @use(i1 %c.6)
330   ret void
334 define 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
370 entry:
371   br i1 %c, label %pre, label %exit
373 exit:
374   %c.9 = icmp ugt i32 %y, 10
375   call void @use(i1 %c.9)
376   ret void
378 pre:
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
384 loop:
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)
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)
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)
405   br i1 true, label %exit, label %loop
407 exit.1:
408   %t.1 = icmp ugt i32 %y, 10
409   call void @use(i1 %t.1)
410   ret void
413 define 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
449 entry:
450   br i1 %c, label %pre, label %exit
452 exit:
453   %c.5 = icmp ugt i32 %y, 10
454   call void @use(i1 %c.5)
455   ret void
457 pre:
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
463 loop:
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)
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)
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)
484   br i1 true, label %exit, label %loop
486 exit.1:
487   %c.6 = icmp ule i32 %y, 100
488   call void @use(i1 %c.6)
489   ret void
492 define 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
528 entry:
529   br i1 %c, label %pre, label %exit
531 exit:
532   %c.9 = icmp ugt i32 %y, 10
533   call void @use(i1 %c.9)
534   ret void
536 pre:
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
542 loop:
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)
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)
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)
562   br i1 true, label %exit, label %loop
564 exit.1:
565   %t.1 = icmp ule i32 %y, 100
566   call void @use(i1 %t.1)
567   ret void