1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s
3
4define void @callbr_duplicate_dest() {
5; CHECK-LABEL: @callbr_duplicate_dest(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    callbr void asm sideeffect "", "!i"()
8; CHECK-NEXT:    to label [[BB:%.*]] [label %bb]
9; CHECK:       bb:
10; CHECK-NEXT:    ret void
11;
12entry:
13  callbr void asm sideeffect "", "!i"()
14  to label %bb [label %bb]
15
16bb:
17  ret void
18}
19
20; TODO: Can fold to a duplicate callbr destination.
21define void @callbr_can_fold_to_duplicate_dest1() {
22; CHECK-LABEL: @callbr_can_fold_to_duplicate_dest1(
23; CHECK-NEXT:  entry:
24; CHECK-NEXT:    callbr void asm sideeffect "", "!i"()
25; CHECK-NEXT:    to label [[BB2:%.*]] [label %common.ret]
26; CHECK:       common.ret:
27; CHECK-NEXT:    ret void
28; CHECK:       bb2:
29; CHECK-NEXT:    br label [[COMMON_RET:%.*]]
30;
31entry:
32  callbr void asm sideeffect "", "!i"()
33  to label %bb2 [label %bb1]
34
35bb1:
36  ret void
37
38bb2:
39  ret void
40}
41
42; TODO: Can fold to a duplicate callbr destination.
43define void @callbr_can_fold_to_duplicate_dest2() {
44; CHECK-LABEL: @callbr_can_fold_to_duplicate_dest2(
45; CHECK-NEXT:  entry:
46; CHECK-NEXT:    callbr void asm sideeffect "", "!i,!i"()
47; CHECK-NEXT:    to label [[COMMON_RET:%.*]] [label [[BB2:%.*]], label %bb3]
48; CHECK:       common.ret:
49; CHECK-NEXT:    ret void
50; CHECK:       bb2:
51; CHECK-NEXT:    br label [[COMMON_RET]]
52; CHECK:       bb3:
53; CHECK-NEXT:    br label [[COMMON_RET]]
54;
55entry:
56  callbr void asm sideeffect "", "!i,!i"()
57  to label %bb1 [label %bb2, label %bb3]
58
59bb1:
60  ret void
61
62bb2:
63  ret void
64
65bb3:
66  ret void
67}
68