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