1; RUN: opt < %s -loop-simplify -lcssa -verify-loop-info -verify-dom-info -S \
2; RUN:   | grep -F "indirectbr i8* %x, [label %L0, label %L1]" \
3; RUN:   | count 6
4
5; LoopSimplify should not try to transform loops when indirectbr is involved.
6
7define void @entry(i8* %x) {
8entry:
9  indirectbr i8* %x, [ label %L0, label %L1 ]
10
11L0:
12  br label %L0
13
14L1:
15  ret void
16}
17
18define void @backedge(i8* %x) {
19entry:
20  br label %L0
21
22L0:
23  br label %L1
24
25L1:
26  indirectbr i8* %x, [ label %L0, label %L1 ]
27}
28
29define i64 @exit(i8* %x) {
30entry:
31  br label %L2
32
33L2:
34  %z = bitcast i64 0 to i64
35  indirectbr i8* %x, [ label %L0, label %L1 ]
36
37L0:
38  br label %L2
39
40L1:
41  ret i64 %z
42}
43
44define i64 @criticalexit(i8* %x, i1 %a) {
45entry:
46  br i1 %a, label %L1, label %L2
47
48L2:
49  %z = bitcast i64 0 to i64
50  indirectbr i8* %x, [ label %L0, label %L1 ]
51
52L0:
53  br label %L2
54
55L1:
56  %y = phi i64 [ %z, %L2 ], [ 1, %entry ]
57  ret i64 %y
58}
59
60define i64 @exit_backedge(i8* %x) {
61entry:
62  br label %L0
63
64L0:
65  %z = bitcast i64 0 to i64
66  indirectbr i8* %x, [ label %L0, label %L1 ]
67
68L1:
69  ret i64 %z
70}
71
72define i64 @criticalexit_backedge(i8* %x, i1 %a) {
73entry:
74  br i1 %a, label %L0, label %L1
75
76L0:
77  %z = bitcast i64 0 to i64
78  indirectbr i8* %x, [ label %L0, label %L1 ]
79
80L1:
81  %y = phi i64 [ %z, %L0 ], [ 1, %entry ]
82  ret i64 %y
83}
84
85define void @pr5502() nounwind {
86entry:
87  br label %while.cond
88
89while.cond:
90  br i1 undef, label %while.body, label %while.end
91
92while.body:
93  indirectbr i8* undef, [label %end_opcode, label %end_opcode]
94
95end_opcode:
96  br i1 false, label %end_opcode, label %while.cond
97
98while.end:
99  ret void
100}
101