xref: /llvm-project/llvm/test/Transforms/Inline/ML/state-tracking-scc-splits.ll (revision 344230913812cec3b4509c0216cefce06f69dd4d)
1; Based on llvm/test/Other/cgscc-iterate-function-mutation.ll
2; RUN: opt -passes='default<O3>,print<inline-advisor>' -training-log=/dev/null \
3; RUN:   -S -enable-ml-inliner=development -keep-inline-advisor-for-printing < %s 2>&1 | FileCheck %s
4; REQUIRES: have_tflite
5;
6; CHECK: [MLInlineAdvisor] Nodes: 36 Edges: 0
7
8declare void @readnone() nofree nosync readnone
9declare void @unknown()
10declare void @reference_function_pointer(ptr) nofree nosync readnone
11
12; The @test1_* set of functions checks that when we mutate functions with
13; simplifycfg to delete call edges and this ends up splitting both the SCCs
14; and the RefSCCs that those functions are in, we re-run the CGSCC passes to
15; observe the refined call graph structure.
16
17define void @test1_a() {
18  call void @test1_b1()
19  call void @test1_b2()
20  call void @test1_b3()
21  call void @test1_b4()
22  ret void
23}
24
25define void @test1_b1() {
26  call void @readnone()
27  ret void
28}
29
30define void @test1_b2() {
31  call void @readnone()
32  br i1 false, label %dead, label %exit
33
34dead:
35  call void @test1_a()
36  br label %exit
37
38exit:
39  ret void
40}
41
42define void @test1_b3() {
43  call void @unknown()
44  br i1 false, label %dead, label %exit
45
46dead:
47  call void @test1_a()
48  br label %exit
49
50exit:
51  ret void
52}
53
54define void @test1_b4() {
55  call void @readnone()
56  br i1 false, label %dead, label %exit
57
58dead:
59  call void @test1_a()
60  br label %exit
61
62exit:
63  ret void
64}
65
66define void @test2_a() {
67  call void @test2_b1()
68  call void @test2_b2()
69  call void @test2_b3()
70  call void @test2_b4()
71  ret void
72}
73
74define void @test2_b1() {
75  call void @readnone()
76  ret void
77}
78
79define void @test2_b2() {
80  call void @reference_function_pointer(ptr @test2_a)
81  br i1 false, label %dead, label %exit
82
83dead:
84  call void @test2_a()
85  br label %exit
86
87exit:
88  ret void
89}
90
91define void @test2_b3() {
92  call void @reference_function_pointer(ptr @test2_a)
93  call void @unknown()
94  br i1 false, label %dead, label %exit
95
96dead:
97  call void @test2_a()
98  br label %exit
99
100exit:
101  ret void
102}
103
104define void @test2_b4() {
105  call void @reference_function_pointer(ptr @test2_a)
106  br i1 false, label %dead, label %exit
107
108dead:
109  call void @test2_a()
110  br label %exit
111
112exit:
113  ret void
114}
115
116define void @test3_a() {
117  call void @test3_b11()
118  call void @test3_b21()
119  call void @test3_b31()
120  call void @test3_b41()
121  ret void
122}
123
124define void @test3_b11() {
125  call void @test3_b12()
126  ret void
127}
128
129define void @test3_b12() {
130  call void @test3_b13()
131  ret void
132}
133
134define void @test3_b13() {
135  call void @readnone()
136  ret void
137}
138
139define void @test3_b21() {
140  call void @test3_b22()
141  ret void
142}
143
144define void @test3_b22() {
145  call void @test3_b23()
146  ret void
147}
148
149define void @test3_b23() {
150  call void @readnone()
151  br i1 false, label %dead, label %exit
152
153dead:
154  call void @test3_a()
155  br label %exit
156
157exit:
158  ret void
159}
160
161define void @test3_b31() {
162  call void @test3_b32()
163  ret void
164}
165
166define void @test3_b32() {
167  call void @test3_b33()
168  ret void
169}
170
171define void @test3_b33() {
172  call void @unknown()
173  br i1 false, label %dead, label %exit
174
175dead:
176  call void @test3_a()
177  br label %exit
178
179exit:
180  ret void
181}
182
183define void @test3_b41() {
184  call void @test3_b42()
185  ret void
186}
187
188define void @test3_b42() {
189  call void @test3_b43()
190  ret void
191}
192
193define void @test3_b43() {
194  call void @readnone()
195  br i1 false, label %dead, label %exit
196
197dead:
198  call void @test3_a()
199  br label %exit
200
201exit:
202  ret void
203}
204
205define void @test4_a() {
206  call void @test4_b11()
207  call void @test4_b21()
208  call void @test4_b31()
209  call void @test4_b41()
210  ret void
211}
212
213define void @test4_b11() {
214  call void @test4_b12()
215  ret void
216}
217
218define void @test4_b12() {
219  call void @test4_b13()
220  ret void
221}
222
223define void @test4_b13() {
224  call void @readnone()
225  ret void
226}
227
228define void @test4_b21() {
229  call void @test4_b22()
230  ret void
231}
232
233define void @test4_b22() {
234  call void @test4_b23()
235  ret void
236}
237
238define void @test4_b23() {
239  call void @reference_function_pointer(ptr @test4_a)
240  br i1 false, label %dead, label %exit
241
242dead:
243  call void @test4_a()
244  br label %exit
245
246exit:
247  ret void
248}
249
250define void @test4_b31() {
251  call void @test4_b32()
252  ret void
253}
254
255define void @test4_b32() {
256  call void @test4_b33()
257  ret void
258}
259
260define void @test4_b33() {
261  call void @reference_function_pointer(ptr @test4_a)
262  call void @unknown()
263  br i1 false, label %dead, label %exit
264
265dead:
266  call void @test4_a()
267  br label %exit
268
269exit:
270  ret void
271}
272
273define void @test4_b41() {
274  call void @test4_b42()
275  ret void
276}
277
278define void @test4_b42() {
279  call void @test4_b43()
280  ret void
281}
282
283define void @test4_b43() {
284  call void @reference_function_pointer(ptr @test4_a)
285  br i1 false, label %dead, label %exit
286
287dead:
288  call void @test4_a()
289  br label %exit
290
291exit:
292  ret void
293}
294