Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / Transforms / InstCombine / simple_phi_condition.ll
blob5501cb707e899bdf17d143e472dfefa6b1cb5b3d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S < %s -passes=instcombine | FileCheck %s
4 define i1 @test_direct_implication(i1 %cond) {
5 ; CHECK-LABEL: @test_direct_implication(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
8 ; CHECK:       if.true:
9 ; CHECK-NEXT:    br label [[MERGE:%.*]]
10 ; CHECK:       if.false:
11 ; CHECK-NEXT:    br label [[MERGE]]
12 ; CHECK:       merge:
13 ; CHECK-NEXT:    ret i1 [[COND]]
15 entry:
16   br i1 %cond, label %if.true, label %if.false
18 if.true:
19   br label %merge
21 if.false:
22   br label %merge
24 merge:
25   %ret = phi i1 [true, %if.true], [false, %if.false]
26   ret i1 %ret
29 define i1 @test_inverted_implication(i1 %cond) {
30 ; CHECK-LABEL: @test_inverted_implication(
31 ; CHECK-NEXT:  entry:
32 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
33 ; CHECK:       if.true:
34 ; CHECK-NEXT:    br label [[MERGE:%.*]]
35 ; CHECK:       if.false:
36 ; CHECK-NEXT:    br label [[MERGE]]
37 ; CHECK:       merge:
38 ; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[COND]], true
39 ; CHECK-NEXT:    ret i1 [[RET]]
41 entry:
42   br i1 %cond, label %if.true, label %if.false
44 if.true:
45   br label %merge
47 if.false:
48   br label %merge
50 merge:
51   %ret = phi i1 [false, %if.true], [true, %if.false]
52   ret i1 %ret
55 define i1 @test_edge_dominance(i1 %cmp) {
56 ; CHECK-LABEL: @test_edge_dominance(
57 ; CHECK-NEXT:  entry:
58 ; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
59 ; CHECK:       if.then:
60 ; CHECK-NEXT:    br label [[IF_END]]
61 ; CHECK:       if.end:
62 ; CHECK-NEXT:    ret i1 [[CMP]]
64 entry:
65   br i1 %cmp, label %if.end, label %if.then
67 if.then:
68   br label %if.end
70 if.end:
71   %phi = phi i1 [ true, %entry ], [ false, %if.then ]
72   ret i1 %phi
75 define i1 @test_direct_implication_complex_cfg(i1 %cond, i32 %cnt1) {
76 ; CHECK-LABEL: @test_direct_implication_complex_cfg(
77 ; CHECK-NEXT:  entry:
78 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
79 ; CHECK:       if.true:
80 ; CHECK-NEXT:    br label [[LOOP1:%.*]]
81 ; CHECK:       loop1:
82 ; CHECK-NEXT:    [[IV1:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[IV1_NEXT:%.*]], [[LOOP1]] ]
83 ; CHECK-NEXT:    [[IV1_NEXT]] = add i32 [[IV1]], 1
84 ; CHECK-NEXT:    [[LOOP_COND_1:%.*]] = icmp slt i32 [[IV1_NEXT]], [[CNT1:%.*]]
85 ; CHECK-NEXT:    br i1 [[LOOP_COND_1]], label [[LOOP1]], label [[IF_TRUE_END:%.*]]
86 ; CHECK:       if.true.end:
87 ; CHECK-NEXT:    br label [[MERGE:%.*]]
88 ; CHECK:       if.false:
89 ; CHECK-NEXT:    br label [[MERGE]]
90 ; CHECK:       merge:
91 ; CHECK-NEXT:    ret i1 [[COND]]
93 entry:
94   br i1 %cond, label %if.true, label %if.false
96 if.true:
97   br label %loop1
99 loop1:
100   %iv1 = phi i32 [0, %if.true], [%iv1.next, %loop1]
101   %iv1.next = add i32 %iv1, 1
102   %loop.cond.1 = icmp slt i32 %iv1.next, %cnt1
103   br i1 %loop.cond.1, label %loop1, label %if.true.end
105 if.true.end:
106   br label %merge
108 if.false:
109   br label %merge
111 merge:
112   %ret = phi i1 [true, %if.true.end], [false, %if.false]
113   ret i1 %ret
116 define i1 @test_inverted_implication_complex_cfg(i1 %cond, i32 %cnt1) {
117 ; CHECK-LABEL: @test_inverted_implication_complex_cfg(
118 ; CHECK-NEXT:  entry:
119 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
120 ; CHECK:       if.true:
121 ; CHECK-NEXT:    br label [[LOOP1:%.*]]
122 ; CHECK:       loop1:
123 ; CHECK-NEXT:    [[IV1:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ [[IV1_NEXT:%.*]], [[LOOP1]] ]
124 ; CHECK-NEXT:    [[IV1_NEXT]] = add i32 [[IV1]], 1
125 ; CHECK-NEXT:    [[LOOP_COND_1:%.*]] = icmp slt i32 [[IV1_NEXT]], [[CNT1:%.*]]
126 ; CHECK-NEXT:    br i1 [[LOOP_COND_1]], label [[LOOP1]], label [[IF_TRUE_END:%.*]]
127 ; CHECK:       if.true.end:
128 ; CHECK-NEXT:    br label [[MERGE:%.*]]
129 ; CHECK:       if.false:
130 ; CHECK-NEXT:    br label [[MERGE]]
131 ; CHECK:       merge:
132 ; CHECK-NEXT:    [[RET:%.*]] = xor i1 [[COND]], true
133 ; CHECK-NEXT:    ret i1 [[RET]]
135 entry:
136   br i1 %cond, label %if.true, label %if.false
138 if.true:
139   br label %loop1
141 loop1:
142   %iv1 = phi i32 [0, %if.true], [%iv1.next, %loop1]
143   %iv1.next = add i32 %iv1, 1
144   %loop.cond.1 = icmp slt i32 %iv1.next, %cnt1
145   br i1 %loop.cond.1, label %loop1, label %if.true.end
147 if.true.end:
148   br label %merge
150 if.false:
151   br label %merge
153 merge:
154   %ret = phi i1 [false, %if.true.end], [true, %if.false]
155   ret i1 %ret
158 define i1 @test_multiple_predecessors(i1 %cond, i1 %cond2) {
159 ; CHECK-LABEL: @test_multiple_predecessors(
160 ; CHECK-NEXT:  entry:
161 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
162 ; CHECK:       if.true:
163 ; CHECK-NEXT:    br label [[MERGE:%.*]]
164 ; CHECK:       if.false:
165 ; CHECK-NEXT:    br i1 [[COND2:%.*]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
166 ; CHECK:       if2.true:
167 ; CHECK-NEXT:    br label [[MERGE]]
168 ; CHECK:       if2.false:
169 ; CHECK-NEXT:    br label [[MERGE]]
170 ; CHECK:       merge:
171 ; CHECK-NEXT:    ret i1 [[COND]]
173 entry:
174   br i1 %cond, label %if.true, label %if.false
176 if.true:
177   br label %merge
179 if.false:
180   br i1 %cond2, label %if2.true, label %if2.false
182 if2.true:
183   br label %merge
185 if2.false:
186   br label %merge
188 merge:
189   %ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
190   ret i1 %ret
193 define i1 @test_multiple_predecessors_wrong_value(i1 %cond, i1 %cond2) {
194 ; CHECK-LABEL: @test_multiple_predecessors_wrong_value(
195 ; CHECK-NEXT:  entry:
196 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
197 ; CHECK:       if.true:
198 ; CHECK-NEXT:    br label [[MERGE:%.*]]
199 ; CHECK:       if.false:
200 ; CHECK-NEXT:    br i1 [[COND2:%.*]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
201 ; CHECK:       if2.true:
202 ; CHECK-NEXT:    br label [[MERGE]]
203 ; CHECK:       if2.false:
204 ; CHECK-NEXT:    br label [[MERGE]]
205 ; CHECK:       merge:
206 ; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ true, [[IF2_TRUE]] ], [ false, [[IF2_FALSE]] ]
207 ; CHECK-NEXT:    ret i1 [[RET]]
209 entry:
210   br i1 %cond, label %if.true, label %if.false
212 if.true:
213   br label %merge
215 if.false:
216   br i1 %cond2, label %if2.true, label %if2.false
218 if2.true:
219   br label %merge
221 if2.false:
222   br label %merge
224 merge:
225   %ret = phi i1 [ true, %if.true ], [ true, %if2.true ], [ false, %if2.false ]
226   ret i1 %ret
229 define i1 @test_multiple_predecessors_no_edge_domination(i1 %cond, i1 %cond2) {
230 ; CHECK-LABEL: @test_multiple_predecessors_no_edge_domination(
231 ; CHECK-NEXT:  entry:
232 ; CHECK-NEXT:    br i1 [[COND:%.*]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
233 ; CHECK:       if.true:
234 ; CHECK-NEXT:    br i1 [[COND2:%.*]], label [[MERGE:%.*]], label [[IF_FALSE]]
235 ; CHECK:       if.false:
236 ; CHECK-NEXT:    br i1 [[COND2]], label [[IF2_TRUE:%.*]], label [[IF2_FALSE:%.*]]
237 ; CHECK:       if2.true:
238 ; CHECK-NEXT:    br label [[MERGE]]
239 ; CHECK:       if2.false:
240 ; CHECK-NEXT:    br label [[MERGE]]
241 ; CHECK:       merge:
242 ; CHECK-NEXT:    [[RET:%.*]] = phi i1 [ true, [[IF_TRUE]] ], [ false, [[IF2_TRUE]] ], [ false, [[IF2_FALSE]] ]
243 ; CHECK-NEXT:    ret i1 [[RET]]
245 entry:
246   br i1 %cond, label %if.true, label %if.false
248 if.true:
249   br i1 %cond2, label %merge, label %if.false
251 if.false:
252   br i1 %cond2, label %if2.true, label %if2.false
254 if2.true:
255   br label %merge
257 if2.false:
258   br label %merge
260 merge:
261   %ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
262   ret i1 %ret
265 define i8 @test_switch(i8 %cond) {
266 ; CHECK-LABEL: @test_switch(
267 ; CHECK-NEXT:  entry:
268 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
269 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
270 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
271 ; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
272 ; CHECK-NEXT:    ]
273 ; CHECK:       sw.1:
274 ; CHECK-NEXT:    br label [[MERGE:%.*]]
275 ; CHECK:       sw.7:
276 ; CHECK-NEXT:    br label [[MERGE]]
277 ; CHECK:       sw.19:
278 ; CHECK-NEXT:    br label [[MERGE]]
279 ; CHECK:       default:
280 ; CHECK-NEXT:    ret i8 42
281 ; CHECK:       merge:
282 ; CHECK-NEXT:    ret i8 [[COND]]
284 entry:
285   switch i8 %cond, label %default [
286   i8 1, label %sw.1
287   i8 7, label %sw.7
288   i8 19, label %sw.19
289   ]
291 sw.1:
292   br label %merge
294 sw.7:
295   br label %merge
297 sw.19:
298   br label %merge
300 default:
301   ret i8 42
303 merge:
304   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ]
305   ret i8 %ret
308 define i8 @test_switch_direct_edge(i8 %cond) {
309 ; CHECK-LABEL: @test_switch_direct_edge(
310 ; CHECK-NEXT:  entry:
311 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
312 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
313 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
314 ; CHECK-NEXT:    i8 19, label [[MERGE:%.*]]
315 ; CHECK-NEXT:    ]
316 ; CHECK:       sw.1:
317 ; CHECK-NEXT:    br label [[MERGE]]
318 ; CHECK:       sw.7:
319 ; CHECK-NEXT:    br label [[MERGE]]
320 ; CHECK:       default:
321 ; CHECK-NEXT:    ret i8 42
322 ; CHECK:       merge:
323 ; CHECK-NEXT:    ret i8 [[COND]]
325 entry:
326   switch i8 %cond, label %default [
327   i8 1, label %sw.1
328   i8 7, label %sw.7
329   i8 19, label %merge
330   ]
332 sw.1:
333   br label %merge
335 sw.7:
336   br label %merge
338 default:
339   ret i8 42
341 merge:
342   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %entry ]
343   ret i8 %ret
346 define i8 @test_switch_duplicate_direct_edge(i8 %cond) {
347 ; CHECK-LABEL: @test_switch_duplicate_direct_edge(
348 ; CHECK-NEXT:  entry:
349 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
350 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
351 ; CHECK-NEXT:    i8 7, label [[MERGE:%.*]]
352 ; CHECK-NEXT:    i8 19, label [[MERGE]]
353 ; CHECK-NEXT:    ]
354 ; CHECK:       sw.1:
355 ; CHECK-NEXT:    br label [[MERGE]]
356 ; CHECK:       default:
357 ; CHECK-NEXT:    ret i8 42
358 ; CHECK:       merge:
359 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[ENTRY:%.*]] ], [ 7, [[ENTRY]] ]
360 ; CHECK-NEXT:    ret i8 [[RET]]
362 entry:
363   switch i8 %cond, label %default [
364   i8 1, label %sw.1
365   i8 7, label %merge
366   i8 19, label %merge
367   ]
369 sw.1:
370   br label %merge
372 default:
373   ret i8 42
375 merge:
376   %ret = phi i8 [ 1, %sw.1 ], [ 7, %entry ], [ 7, %entry ]
377   ret i8 %ret
380 define i8 @test_switch_subset(i8 %cond) {
381 ; CHECK-LABEL: @test_switch_subset(
382 ; CHECK-NEXT:  entry:
383 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
384 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
385 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
386 ; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
387 ; CHECK-NEXT:    ]
388 ; CHECK:       sw.1:
389 ; CHECK-NEXT:    br label [[MERGE:%.*]]
390 ; CHECK:       sw.7:
391 ; CHECK-NEXT:    br label [[MERGE]]
392 ; CHECK:       sw.19:
393 ; CHECK-NEXT:    ret i8 24
394 ; CHECK:       default:
395 ; CHECK-NEXT:    ret i8 42
396 ; CHECK:       merge:
397 ; CHECK-NEXT:    ret i8 [[COND]]
399 entry:
400   switch i8 %cond, label %default [
401   i8 1, label %sw.1
402   i8 7, label %sw.7
403   i8 19, label %sw.19
404   ]
406 sw.1:
407   br label %merge
409 sw.7:
410   br label %merge
412 sw.19:
413   ret i8 24
415 default:
416   ret i8 42
418 merge:
419   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
420   ret i8 %ret
423 define i8 @test_switch_wrong_value(i8 %cond) {
424 ; CHECK-LABEL: @test_switch_wrong_value(
425 ; CHECK-NEXT:  entry:
426 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
427 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
428 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
429 ; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
430 ; CHECK-NEXT:    ]
431 ; CHECK:       sw.1:
432 ; CHECK-NEXT:    br label [[MERGE:%.*]]
433 ; CHECK:       sw.7:
434 ; CHECK-NEXT:    br label [[MERGE]]
435 ; CHECK:       sw.19:
436 ; CHECK-NEXT:    br label [[MERGE]]
437 ; CHECK:       default:
438 ; CHECK-NEXT:    ret i8 42
439 ; CHECK:       merge:
440 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 10, [[SW_19]] ]
441 ; CHECK-NEXT:    ret i8 [[RET]]
443 entry:
444   switch i8 %cond, label %default [
445   i8 1, label %sw.1
446   i8 7, label %sw.7
447   i8 19, label %sw.19
448   ]
450 sw.1:
451   br label %merge
453 sw.7:
454   br label %merge
456 sw.19:
457   br label %merge
459 default:
460   ret i8 42
462 merge:
463   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 10, %sw.19 ]
464   ret i8 %ret
467 define i8 @test_switch_inverted(i8 %cond) {
468 ; CHECK-LABEL: @test_switch_inverted(
469 ; CHECK-NEXT:  entry:
470 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
471 ; CHECK-NEXT:    i8 0, label [[SW_0:%.*]]
472 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
473 ; CHECK-NEXT:    i8 2, label [[SW_2:%.*]]
474 ; CHECK-NEXT:    ]
475 ; CHECK:       sw.0:
476 ; CHECK-NEXT:    br label [[MERGE:%.*]]
477 ; CHECK:       sw.1:
478 ; CHECK-NEXT:    br label [[MERGE]]
479 ; CHECK:       sw.2:
480 ; CHECK-NEXT:    br label [[MERGE]]
481 ; CHECK:       default:
482 ; CHECK-NEXT:    ret i8 42
483 ; CHECK:       merge:
484 ; CHECK-NEXT:    [[RET:%.*]] = xor i8 [[COND]], -1
485 ; CHECK-NEXT:    ret i8 [[RET]]
487 entry:
488   switch i8 %cond, label %default [
489   i8 0, label %sw.0
490   i8 1, label %sw.1
491   i8 2, label %sw.2
492   ]
494 sw.0:
495   br label %merge
497 sw.1:
498   br label %merge
500 sw.2:
501   br label %merge
503 default:
504   ret i8 42
506 merge:
507   %ret = phi i8 [ -1, %sw.0 ], [ -2, %sw.1 ], [ -3, %sw.2 ]
508   ret i8 %ret
511 define i8 @test_switch_duplicate_edge(i8 %cond) {
512 ; CHECK-LABEL: @test_switch_duplicate_edge(
513 ; CHECK-NEXT:  entry:
514 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
515 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
516 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
517 ; CHECK-NEXT:    i8 19, label [[SW_7]]
518 ; CHECK-NEXT:    ]
519 ; CHECK:       sw.1:
520 ; CHECK-NEXT:    br label [[MERGE:%.*]]
521 ; CHECK:       sw.7:
522 ; CHECK-NEXT:    br label [[MERGE]]
523 ; CHECK:       default:
524 ; CHECK-NEXT:    ret i8 42
525 ; CHECK:       merge:
526 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ]
527 ; CHECK-NEXT:    ret i8 [[RET]]
529 entry:
530   switch i8 %cond, label %default [
531   i8 1, label %sw.1
532   i8 7, label %sw.7
533   i8 19, label %sw.7
534   ]
536 sw.1:
537   br label %merge
539 sw.7:
540   br label %merge
542 default:
543   ret i8 42
545 merge:
546   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
547   ret i8 %ret
550 define i8 @test_switch_default_edge(i8 %cond) {
551 ; CHECK-LABEL: @test_switch_default_edge(
552 ; CHECK-NEXT:  entry:
553 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[MERGE:%.*]] [
554 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
555 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
556 ; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
557 ; CHECK-NEXT:    ]
558 ; CHECK:       sw.1:
559 ; CHECK-NEXT:    br label [[MERGE]]
560 ; CHECK:       sw.7:
561 ; CHECK-NEXT:    br label [[MERGE]]
562 ; CHECK:       sw.19:
563 ; CHECK-NEXT:    br label [[MERGE]]
564 ; CHECK:       merge:
565 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ], [ 42, [[ENTRY:%.*]] ]
566 ; CHECK-NEXT:    ret i8 [[RET]]
568 entry:
569   switch i8 %cond, label %merge [
570   i8 1, label %sw.1
571   i8 7, label %sw.7
572   i8 19, label %sw.19
573   ]
575 sw.1:
576   br label %merge
578 sw.7:
579   br label %merge
581 sw.19:
582   br label %merge
584 merge:
585   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ], [ 42, %entry ]
586   ret i8 %ret
589 define i8 @test_switch_default_edge_direct(i8 %cond) {
590 ; CHECK-LABEL: @test_switch_default_edge_direct(
591 ; CHECK-NEXT:  entry:
592 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[MERGE:%.*]] [
593 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
594 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
595 ; CHECK-NEXT:    i8 19, label [[MERGE]]
596 ; CHECK-NEXT:    ]
597 ; CHECK:       sw.1:
598 ; CHECK-NEXT:    br label [[MERGE]]
599 ; CHECK:       sw.7:
600 ; CHECK-NEXT:    br label [[MERGE]]
601 ; CHECK:       merge:
602 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[ENTRY:%.*]] ], [ 19, [[ENTRY]] ]
603 ; CHECK-NEXT:    ret i8 [[RET]]
605 entry:
606   switch i8 %cond, label %merge [
607   i8 1, label %sw.1
608   i8 7, label %sw.7
609   i8 19, label %merge
610   ]
611 sw.1:
612   br label %merge
613 sw.7:
614   br label %merge
615 merge:
616   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %entry ], [ 19, %entry ]
617   ret i8 %ret
620 define i8 @test_switch_default_edge_duplicate(i8 %cond) {
621 ; CHECK-LABEL: @test_switch_default_edge_duplicate(
622 ; CHECK-NEXT:  entry:
623 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[SW_19:%.*]] [
624 ; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
625 ; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
626 ; CHECK-NEXT:    i8 19, label [[SW_19]]
627 ; CHECK-NEXT:    ]
628 ; CHECK:       sw.1:
629 ; CHECK-NEXT:    br label [[MERGE:%.*]]
630 ; CHECK:       sw.7:
631 ; CHECK-NEXT:    br label [[MERGE]]
632 ; CHECK:       sw.19:
633 ; CHECK-NEXT:    br label [[MERGE]]
634 ; CHECK:       merge:
635 ; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ]
636 ; CHECK-NEXT:    ret i8 [[RET]]
638 entry:
639   switch i8 %cond, label %sw.19 [
640   i8 1, label %sw.1
641   i8 7, label %sw.7
642   i8 19, label %sw.19
643   ]
644 sw.1:
645   br label %merge
646 sw.7:
647   br label %merge
648 sw.19:
649   br label %merge
650 merge:
651   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ]
652   ret i8 %ret