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.
9 define i1 @test1(i8 %x) {
10 ; CHECK-LABEL: @test1(
12 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
13 ; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]]
15 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10
16 ; CHECK-NEXT: call void @use(i1 true)
17 ; CHECK-NEXT: br label [[BB2]]
19 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10
20 ; CHECK-NEXT: ret i1 [[C_3]]
23 %c.1 = icmp ule i8 %x, 10
24 br i1 %c.1, label %bb1, label %bb2
27 %c.2 = icmp ule i8 %x, 10
28 call void @use(i1 %c.2)
32 %c.3 = icmp ugt i8 %x, 10
36 define i1 @test_chain_1(i8 %x) {
37 ; CHECK-LABEL: @test_chain_1(
39 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
40 ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
42 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10
43 ; CHECK-NEXT: call void @use(i1 true)
44 ; CHECK-NEXT: br label [[EXIT:%.*]]
46 ; CHECK-NEXT: br label [[EXIT]]
48 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10
49 ; CHECK-NEXT: ret i1 [[C_3]]
52 %c.1 = icmp ule i8 %x, 10
53 br i1 %c.1, label %then, label %else
56 %c.2 = icmp ule i8 %x, 10
57 call void @use(i1 %c.2)
64 %c.3 = icmp ugt i8 %x, 10
68 define i1 @test_chain_2(i8 %x) {
69 ; CHECK-LABEL: @test_chain_2(
71 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
72 ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
74 ; CHECK-NEXT: br label [[EXIT:%.*]]
76 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10
77 ; CHECK-NEXT: call void @use(i1 false)
78 ; CHECK-NEXT: br label [[EXIT]]
80 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10
81 ; CHECK-NEXT: ret i1 [[C_3]]
84 %c.1 = icmp ule i8 %x, 10
85 br i1 %c.1, label %then, label %else
91 %c.2 = icmp ule i8 %x, 10
92 call void @use(i1 %c.2)
96 %c.3 = icmp ugt i8 %x, 10
100 define i1 @test2(i8 %x) {
101 ; CHECK-LABEL: @test2(
103 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
104 ; CHECK-NEXT: br i1 [[C_1]], label [[BB2:%.*]], label [[BB1:%.*]]
106 ; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10
107 ; CHECK-NEXT: ret i1 [[C_2]]
109 ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], 10
110 ; CHECK-NEXT: call void @use(i1 true)
111 ; CHECK-NEXT: br label [[BB1]]
114 %c.1 = icmp ule i8 %x, 10
115 br i1 %c.1, label %bb2, label %bb1
118 %c.2 = icmp ugt i8 %x, 10
122 %c.3 = icmp ule i8 %x, 10
123 call void @use(i1 %c.3)
127 ; Test cases where the true/false successors are not domianted by the conditional branching block.
128 define i1 @test3(i8 %x, i1 %c) {
129 ; CHECK-LABEL: @test3(
131 ; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB1:%.*]]
133 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
134 ; CHECK-NEXT: br i1 [[C_1]], label [[BB1]], label [[BB2:%.*]]
136 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10
137 ; CHECK-NEXT: ret i1 [[C_2]]
139 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10
140 ; CHECK-NEXT: ret i1 true
143 br i1 %c, label %bb.cond, label %bb1
146 %c.1 = icmp ule i8 %x, 10
147 br i1 %c.1, label %bb1, label %bb2
150 %c.2 = icmp ule i8 %x, 10
154 %c.3 = icmp ugt i8 %x, 10
158 define i1 @test4(i8 %x, i1 %c) {
159 ; CHECK-LABEL: @test4(
161 ; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB2:%.*]]
163 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
164 ; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2]]
166 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 10
167 ; CHECK-NEXT: ret i1 true
169 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 10
170 ; CHECK-NEXT: ret i1 [[C_3]]
173 br i1 %c, label %bb.cond, label %bb2
176 %c.1 = icmp ule i8 %x, 10
177 br i1 %c.1, label %bb1, label %bb2
180 %c.2 = icmp ule i8 %x, 10
184 %c.3 = icmp ugt i8 %x, 10
189 define i1 @test_cond_from_preheader(i8 %x, i1 %c) {
190 ; CHECK-LABEL: @test_cond_from_preheader(
192 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
194 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
195 ; CHECK-NEXT: br i1 [[C_1]], label [[LOOP:%.*]], label [[BB2]]
197 ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], 10
198 ; CHECK-NEXT: call void @use(i1 true)
199 ; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[X]], 10
200 ; CHECK-NEXT: call void @use(i1 false)
201 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 9
202 ; CHECK-NEXT: call void @use(i1 [[C_2]])
203 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 9
204 ; CHECK-NEXT: call void @use(i1 [[C_3]])
205 ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
207 ; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 [[X]], 10
208 ; CHECK-NEXT: ret i1 true
210 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[X]], 10
211 ; CHECK-NEXT: ret i1 [[C_5]]
214 br i1 %c, label %pre, label %bb2
217 %c.1 = icmp ule i8 %x, 10
218 br i1 %c.1, label %loop, label %bb2
221 %t.1 = icmp ule i8 %x, 10
222 call void @use(i1 %t.1)
223 %f.1 = icmp ugt i8 %x, 10
224 call void @use(i1 %f.1)
226 %c.2 = icmp ule i8 %x, 9
227 call void @use(i1 %c.2)
228 %c.3 = icmp ugt i8 %x, 9
229 call void @use(i1 %c.3)
231 br i1 true, label %exit, label %loop
234 %c.4 = icmp ule i8 %x, 10
238 %c.5 = icmp ugt i8 %x, 10
242 define i1 @test_cond_from_preheader_successors_flipped(i8 %x, i1 %c) {
243 ; CHECK-LABEL: @test_cond_from_preheader_successors_flipped(
245 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]]
247 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
248 ; CHECK-NEXT: br i1 [[C_1]], label [[BB2]], label [[LOOP:%.*]]
250 ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[X]], 10
251 ; CHECK-NEXT: call void @use(i1 false)
252 ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 10
253 ; CHECK-NEXT: call void @use(i1 true)
254 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 11
255 ; CHECK-NEXT: call void @use(i1 [[C_2]])
256 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[X]], 11
257 ; CHECK-NEXT: call void @use(i1 [[C_3]])
258 ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
260 ; CHECK-NEXT: [[F_2:%.*]] = icmp ule i8 [[X]], 10
261 ; CHECK-NEXT: ret i1 false
263 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[X]], 10
264 ; CHECK-NEXT: ret i1 [[C_5]]
267 br i1 %c, label %pre, label %bb2
270 %c.1 = icmp ule i8 %x, 10
271 br i1 %c.1, label %bb2, label %loop
274 %f.1 = icmp ule i8 %x, 10
275 call void @use(i1 %f.1)
276 %t.1 = icmp ugt i8 %x, 10
277 call void @use(i1 %t.1)
279 %c.2 = icmp ule i8 %x, 11
280 call void @use(i1 %c.2)
281 %c.3 = icmp ugt i8 %x, 11
282 call void @use(i1 %c.3)
284 br i1 true, label %exit, label %loop
287 %f.2 = icmp ule i8 %x, 10
291 %c.5 = icmp ugt i8 %x, 10
295 define i1 @test_cond_from_preheader_and(i8 %x, i8 %y, i1 %c) {
296 ; CHECK-LABEL: @test_cond_from_preheader_and(
298 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
300 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10
301 ; CHECK-NEXT: ret i1 [[C_5]]
303 ; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
304 ; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
305 ; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
306 ; CHECK-NEXT: br i1 [[AND]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
308 ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], 10
309 ; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[X]], 10
310 ; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, false
311 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 9
312 ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
313 ; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 9
314 ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]
315 ; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i8 [[Y]], 99
316 ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], true
317 ; CHECK-NEXT: [[F_2:%.*]] = icmp ule i8 [[Y]], 99
318 ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], false
319 ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[Y]], 100
320 ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]
321 ; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[Y]], 100
322 ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]
323 ; CHECK-NEXT: call void @use(i1 [[R_7]])
324 ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]
326 ; CHECK-NEXT: [[C_6:%.*]] = icmp ugt i8 [[Y]], 10
327 ; CHECK-NEXT: ret i1 [[C_6]]
330 br i1 %c, label %pre, label %exit
333 %c.5 = icmp ugt i8 %y, 10
337 %x.1 = icmp ule i8 %x, 10
338 %y.1 = icmp ugt i8 %y, 99
339 %and = and i1 %x.1, %y.1
340 br i1 %and, label %loop, label %exit.1
343 %t.1 = icmp ule i8 %x, 10
344 %f.1 = icmp ugt i8 %x, 10
345 %r.1 = xor i1 %t.1, %f.1
347 %c.1 = icmp ule i8 %x, 9
348 %r.2 = xor i1 %r.1, %c.1
350 %c.2 = icmp ugt i8 %x, 9
351 %r.3 = xor i1 %r.2, %c.2
353 %t.2 = icmp ugt i8 %y, 99
354 %r.4 = xor i1 %r.3, %t.2
356 %f.2 = icmp ule i8 %y, 99
357 %r.5 = xor i1 %r.4, %f.2
359 %c.3 = icmp ugt i8 %y, 100
360 %r.6 = xor i1 %r.5, %c.3
362 %c.4 = icmp ugt i8 %y, 100
363 %r.7 = xor i1 %r.6, %c.4
364 call void @use(i1 %r.7)
366 br i1 true, label %exit, label %loop
369 %c.6 = icmp ugt i8 %y, 10
374 define i1 @test_cond_from_preheader_and_successors_flipped(i8 %x, i8 %y, i1 %c) {
375 ; CHECK-LABEL: @test_cond_from_preheader_and_successors_flipped(
377 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
379 ; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10
380 ; CHECK-NEXT: ret i1 [[C_9]]
382 ; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
383 ; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
384 ; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]]
385 ; CHECK-NEXT: br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
387 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 10
388 ; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10
389 ; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]
390 ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], 9
391 ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
392 ; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[X]], 9
393 ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
394 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y]], 99
395 ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
396 ; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 99
397 ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
398 ; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[Y]], 100
399 ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
400 ; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i8 [[Y]], 100
401 ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
402 ; CHECK-NEXT: call void @use(i1 [[R_7]])
403 ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]
405 ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[Y]], 10
406 ; CHECK-NEXT: ret i1 true
409 br i1 %c, label %pre, label %exit
412 %c.9 = icmp ugt i8 %y, 10
416 %x.1 = icmp ule i8 %x, 10
417 %y.1 = icmp ugt i8 %y, 99
418 %and = and i1 %x.1, %y.1
419 br i1 %and, label %exit.1, label %loop
422 %c.1 = icmp ule i8 %x, 10
423 %c.2 = icmp ugt i8 %x, 10
424 %r.1 = xor i1 %c.1, %c.2
425 %c.3 = icmp ule i8 %x, 9
426 %r.2 = xor i1 %r.1, %c.3
427 %c.4 = icmp ugt i8 %x, 9
428 %r.3 = xor i1 %r.2, %c.4
430 %c.5 = icmp ugt i8 %y, 99
431 %r.4 = xor i1 %r.3, %c.5
432 %c.6 = icmp ule i8 %y, 99
433 %r.5 = xor i1 %r.4, %c.6
435 %c.7 = icmp ugt i8 %y, 100
436 %r.6 = xor i1 %r.5, %c.7
437 %c.8 = icmp ugt i8 %y, 100
438 %r.7 = xor i1 %r.6, %c.8
439 call void @use(i1 %r.7)
441 br i1 true, label %exit, label %loop
444 %t.1 = icmp ugt i8 %y, 10
448 define i1 @test_cond_from_preheader_or(i8 %x, i8 %y, i1 %c) {
449 ; CHECK-LABEL: @test_cond_from_preheader_or(
451 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
453 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y:%.*]], 10
454 ; CHECK-NEXT: ret i1 [[C_5]]
456 ; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
457 ; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
458 ; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
459 ; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[LOOP:%.*]]
461 ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 10
462 ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[X]], 10
463 ; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, false
464 ; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], 11
465 ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]]
466 ; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[X]], 11
467 ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_2]]
468 ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[Y]], 99
469 ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], true
470 ; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[Y]], 99
471 ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], false
472 ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[Y]], 98
473 ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_3]]
474 ; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 [[Y]], 98
475 ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_4]]
476 ; CHECK-NEXT: call void @use(i1 [[R_7]])
477 ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]
479 ; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 100
480 ; CHECK-NEXT: ret i1 [[C_6]]
483 br i1 %c, label %pre, label %exit
486 %c.5 = icmp ugt i8 %y, 10
490 %x.1 = icmp ule i8 %x, 10
491 %y.1 = icmp ugt i8 %y, 99
492 %or = or i1 %x.1, %y.1
493 br i1 %or, label %exit.1, label %loop
496 %t.1 = icmp ugt i8 %x, 10
497 %f.1 = icmp ule i8 %x, 10
498 %r.1 = xor i1 %t.1, %f.1
499 %c.1 = icmp ugt i8 %x, 11
500 %r.2 = xor i1 %r.1, %c.1
501 %c.2 = icmp ule i8 %x, 11
502 %r.3 = xor i1 %r.2, %c.2
504 %t.2 = icmp ule i8 %y, 99
505 %r.4 = xor i1 %r.3, %t.2
506 %f.2 = icmp ugt i8 %y, 99
507 %r.5 = xor i1 %r.4, %f.2
509 %c.3 = icmp ule i8 %y, 98
510 %r.6 = xor i1 %r.5, %c.3
511 %c.4 = icmp ule i8 %y, 98
512 %r.7 = xor i1 %r.6, %c.4
513 call void @use(i1 %r.7)
515 br i1 true, label %exit, label %loop
518 %c.6 = icmp ule i8 %y, 100
522 define i1 @test_cond_from_preheader_or_successor_flipped(i8 %x, i8 %y, i1 %c) {
523 ; CHECK-LABEL: @test_cond_from_preheader_or_successor_flipped(
525 ; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]]
527 ; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i8 [[Y:%.*]], 10
528 ; CHECK-NEXT: ret i1 [[C_9]]
530 ; CHECK-NEXT: [[X_1:%.*]] = icmp ule i8 [[X:%.*]], 10
531 ; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i8 [[Y]], 99
532 ; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]]
533 ; CHECK-NEXT: br i1 [[OR]], label [[LOOP:%.*]], label [[EXIT_1:%.*]]
535 ; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X]], 10
536 ; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 10
537 ; CHECK-NEXT: [[R_1:%.*]] = xor i1 [[C_1]], [[C_2]]
538 ; CHECK-NEXT: [[C_3:%.*]] = icmp ule i8 [[X]], 9
539 ; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]]
540 ; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[X]], 9
541 ; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]]
542 ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[Y]], 99
543 ; CHECK-NEXT: [[R_4:%.*]] = xor i1 [[R_3]], [[C_5]]
544 ; CHECK-NEXT: [[C_6:%.*]] = icmp ule i8 [[Y]], 99
545 ; CHECK-NEXT: [[R_5:%.*]] = xor i1 [[R_4]], [[C_6]]
546 ; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i8 [[Y]], 100
547 ; CHECK-NEXT: [[R_6:%.*]] = xor i1 [[R_5]], [[C_7]]
548 ; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i8 [[Y]], 100
549 ; CHECK-NEXT: [[R_7:%.*]] = xor i1 [[R_6]], [[C_8]]
550 ; CHECK-NEXT: call void @use(i1 [[R_7]])
551 ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]]
553 ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[Y]], 100
554 ; CHECK-NEXT: ret i1 true
557 br i1 %c, label %pre, label %exit
560 %c.9 = icmp ugt i8 %y, 10
564 %x.1 = icmp ule i8 %x, 10
565 %y.1 = icmp ugt i8 %y, 99
566 %or = or i1 %x.1, %y.1
567 br i1 %or, label %loop, label %exit.1
570 %c.1 = icmp ule i8 %x, 10
571 %c.2 = icmp ugt i8 %x, 10
572 %r.1 = xor i1 %c.1, %c.2
573 %c.3 = icmp ule i8 %x, 9
574 %r.2 = xor i1 %r.1, %c.3
575 %c.4 = icmp ugt i8 %x, 9
576 %r.3 = xor i1 %r.2, %c.4
578 %c.5 = icmp ugt i8 %y, 99
579 %r.4 = xor i1 %r.3, %c.5
580 %c.6 = icmp ule i8 %y, 99
581 %r.5 = xor i1 %r.4, %c.6
583 %c.7 = icmp ugt i8 %y, 100
584 %r.6 = xor i1 %r.5, %c.7
585 %c.8 = icmp ugt i8 %y, 100
586 %r.7 = xor i1 %r.6, %c.8
587 call void @use(i1 %r.7)
589 br i1 true, label %exit, label %loop
592 %t.1 = icmp ule i8 %y, 100
596 ; Test case from PR49819.
597 define i1 @both_branch_to_same_block(i4 %x) {
598 ; CHECK-LABEL: @both_branch_to_same_block(
600 ; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0
601 ; CHECK-NEXT: br i1 [[C_1]], label [[EXIT:%.*]], label [[EXIT]]
603 ; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[X]], 0
604 ; CHECK-NEXT: [[C_3:%.*]] = icmp eq i4 [[X]], 0
605 ; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_2]], [[C_3]]
606 ; CHECK-NEXT: ret i1 [[RES]]
609 %c.1 = icmp ne i4 %x, 0
610 br i1 %c.1, label %exit, label %exit
613 %c.2 = icmp ne i4 %x, 0
614 %c.3 = icmp eq i4 %x, 0
615 %res = xor i1 %c.2, %c.3
619 define i1 @both_branch_to_same_block_and(i4 %x, i4 %y) {
620 ; CHECK-LABEL: @both_branch_to_same_block_and(
622 ; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0
623 ; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[Y:%.*]], -6
624 ; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]]
625 ; CHECK-NEXT: br i1 [[AND]], label [[EXIT:%.*]], label [[EXIT]]
627 ; CHECK-NEXT: [[C_3:%.*]] = icmp ne i4 [[X]], 0
628 ; CHECK-NEXT: [[C_4:%.*]] = icmp eq i4 [[X]], 0
629 ; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_3]], [[C_4]]
630 ; CHECK-NEXT: ret i1 [[RES]]
633 %c.1 = icmp ne i4 %x, 0
634 %c.2 = icmp ne i4 %y, 10
635 %and = and i1 %c.1, %c.2
636 br i1 %and, label %exit, label %exit
639 %c.3 = icmp ne i4 %x, 0
640 %c.4 = icmp eq i4 %x, 0
641 %res = xor i1 %c.3, %c.4
646 define i1 @both_branch_to_same_block_or(i4 %x, i4 %y) {
647 ; CHECK-LABEL: @both_branch_to_same_block_or(
649 ; CHECK-NEXT: [[C_1:%.*]] = icmp ne i4 [[X:%.*]], 0
650 ; CHECK-NEXT: [[C_2:%.*]] = icmp ne i4 [[Y:%.*]], -6
651 ; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_1]], [[C_2]]
652 ; CHECK-NEXT: br i1 [[OR]], label [[EXIT:%.*]], label [[EXIT]]
654 ; CHECK-NEXT: [[C_3:%.*]] = icmp ne i4 [[X]], 0
655 ; CHECK-NEXT: [[C_4:%.*]] = icmp eq i4 [[X]], 0
656 ; CHECK-NEXT: [[RES:%.*]] = xor i1 [[C_3]], [[C_4]]
657 ; CHECK-NEXT: ret i1 [[RES]]
660 %c.1 = icmp ne i4 %x, 0
661 %c.2 = icmp ne i4 %y, 10
662 %or = or i1 %c.1, %c.2
663 br i1 %or, label %exit, label %exit
666 %c.3 = icmp ne i4 %x, 0
667 %c.4 = icmp eq i4 %x, 0
668 %res = xor i1 %c.3, %c.4