xref: /llvm-project/llvm/test/CodeGen/ARM/machine-outliner-calls.mir (revision 3b16630c26505060a876f578e4b2ba701c780e9a)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=arm-- -run-pass=prologepilog -run-pass=machine-outliner \
3# RUN: -verify-machineinstrs %s -o - | FileCheck %s
4
5--- |
6  define void @outline_call_arm() #0 { ret void }
7  define void @outline_call_thumb() #1 { ret void }
8  define void @outline_call_tailcall_arm() #0 { ret void }
9  define void @outline_call_tailcall_thumb() #1 { ret void }
10  define void @outline_call_KO_mcount() #0 { ret void }
11  define void @bar() #0 { ret void }
12  declare void @"\01mcount"()
13
14  attributes #0 = { minsize optsize }
15  attributes #1 = { minsize optsize "target-features"="+armv7-a,+thumb-mode" }
16...
17---
18
19name:           outline_call_arm
20tracksRegLiveness: true
21body:             |
22  ; CHECK-LABEL: name: outline_call_arm
23  ; CHECK: bb.0:
24  ; CHECK:   liveins: $r4, $lr
25  ; CHECK:   $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr
26  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
27  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
28  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r4, -8
29  ; CHECK:   BL @OUTLINED_FUNCTION_2
30  ; CHECK: bb.1:
31  ; CHECK:   BL @OUTLINED_FUNCTION_2
32  ; CHECK: bb.2:
33  ; CHECK:   BL @OUTLINED_FUNCTION_2
34  ; CHECK: bb.3:
35  ; CHECK:   BL @OUTLINED_FUNCTION_2
36  ; CHECK: bb.4:
37  ; CHECK:   BL @OUTLINED_FUNCTION_2
38  ; CHECK: bb.5:
39  ; CHECK:   $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr
40  ; CHECK:   BX_RET 14 /* CC::al */, $noreg
41  bb.0:
42    BL @bar, implicit-def dead $lr, implicit $sp
43    $r0 = MOVi 1, 14, $noreg, $noreg
44    $r1 = MOVi 1, 14, $noreg, $noreg
45    $r2 = MOVi 1, 14, $noreg, $noreg
46    $r3 = MOVi 1, 14, $noreg, $noreg
47    $r4 = MOVi 1, 14, $noreg, $noreg
48  bb.1:
49    BL @bar, implicit-def dead $lr, implicit $sp
50    $r0 = MOVi 1, 14, $noreg, $noreg
51    $r1 = MOVi 1, 14, $noreg, $noreg
52    $r2 = MOVi 1, 14, $noreg, $noreg
53    $r3 = MOVi 1, 14, $noreg, $noreg
54    $r4 = MOVi 1, 14, $noreg, $noreg
55  bb.2:
56    BL @bar, implicit-def dead $lr, implicit $sp
57    $r0 = MOVi 1, 14, $noreg, $noreg
58    $r1 = MOVi 1, 14, $noreg, $noreg
59    $r2 = MOVi 1, 14, $noreg, $noreg
60    $r3 = MOVi 1, 14, $noreg, $noreg
61    $r4 = MOVi 1, 14, $noreg, $noreg
62  bb.3:
63    BL @bar, implicit-def dead $lr, implicit $sp
64    $r0 = MOVi 1, 14, $noreg, $noreg
65    $r1 = MOVi 1, 14, $noreg, $noreg
66    $r2 = MOVi 1, 14, $noreg, $noreg
67    $r3 = MOVi 1, 14, $noreg, $noreg
68    $r4 = MOVi 1, 14, $noreg, $noreg
69  bb.4:
70    BL @bar, implicit-def dead $lr, implicit $sp
71    $r0 = MOVi 1, 14, $noreg, $noreg
72    $r1 = MOVi 1, 14, $noreg, $noreg
73    $r2 = MOVi 1, 14, $noreg, $noreg
74    $r3 = MOVi 1, 14, $noreg, $noreg
75    $r4 = MOVi 1, 14, $noreg, $noreg
76  bb.5:
77    BX_RET 14, $noreg
78...
79---
80
81name:           outline_call_thumb
82tracksRegLiveness: true
83body:             |
84  ; CHECK-LABEL: name: outline_call_thumb
85  ; CHECK: bb.0:
86  ; CHECK:   liveins: $r7, $lr
87  ; CHECK:   $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r7, killed $lr
88  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
89  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
90  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r7, -8
91  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4
92  ; CHECK: bb.1:
93  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4
94  ; CHECK: bb.2:
95  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4
96  ; CHECK: bb.3:
97  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4
98  ; CHECK: bb.4:
99  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4
100  ; CHECK: bb.5:
101  ; CHECK:   $sp = frame-destroy t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r7, def $pc
102  bb.0:
103    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
104    $r0 = t2MOVi 1, 14, $noreg, $noreg
105    $r1 = t2MOVi 1, 14, $noreg, $noreg
106    $r2 = t2MOVi 1, 14, $noreg, $noreg
107  bb.1:
108    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
109    $r0 = t2MOVi 1, 14, $noreg, $noreg
110    $r1 = t2MOVi 1, 14, $noreg, $noreg
111    $r2 = t2MOVi 1, 14, $noreg, $noreg
112  bb.2:
113    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
114    $r0 = t2MOVi 1, 14, $noreg, $noreg
115    $r1 = t2MOVi 1, 14, $noreg, $noreg
116    $r2 = t2MOVi 1, 14, $noreg, $noreg
117  bb.3:
118    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
119    $r0 = t2MOVi 1, 14, $noreg, $noreg
120    $r1 = t2MOVi 1, 14, $noreg, $noreg
121    $r2 = t2MOVi 1, 14, $noreg, $noreg
122  bb.4:
123    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
124    $r0 = t2MOVi 1, 14, $noreg, $noreg
125    $r1 = t2MOVi 1, 14, $noreg, $noreg
126    $r2 = t2MOVi 1, 14, $noreg, $noreg
127  bb.5:
128    tBX_RET 14, $noreg
129...
130---
131
132name:           outline_call_tailcall_arm
133tracksRegLiveness: true
134body:             |
135  ; CHECK-LABEL: name: outline_call_tailcall_arm
136  ; CHECK: bb.0:
137  ; CHECK:   liveins: $r4, $lr
138  ; CHECK:   $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr
139  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
140  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
141  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r4, -8
142  ; CHECK:   BL @OUTLINED_FUNCTION_0
143  ; CHECK: bb.1:
144  ; CHECK:   BL @OUTLINED_FUNCTION_0
145  ; CHECK: bb.2:
146  ; CHECK:   BL @OUTLINED_FUNCTION_0
147  ; CHECK: bb.3:
148  ; CHECK:   BL @OUTLINED_FUNCTION_0
149  ; CHECK: bb.4:
150  ; CHECK:   $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr
151  ; CHECK:   BX_RET 14 /* CC::al */, $noreg
152  bb.0:
153    BL @bar, implicit-def dead $lr, implicit $sp
154    $r0 = MOVi 2, 14, $noreg, $noreg
155    $r1 = MOVi 2, 14, $noreg, $noreg
156    $r2 = MOVi 2, 14, $noreg, $noreg
157    $r3 = MOVi 2, 14, $noreg, $noreg
158    $r4 = MOVi 2, 14, $noreg, $noreg
159    BL @bar, implicit-def dead $lr, implicit $sp
160  bb.1:
161    BL @bar, implicit-def dead $lr, implicit $sp
162    $r0 = MOVi 2, 14, $noreg, $noreg
163    $r1 = MOVi 2, 14, $noreg, $noreg
164    $r2 = MOVi 2, 14, $noreg, $noreg
165    $r3 = MOVi 2, 14, $noreg, $noreg
166    $r4 = MOVi 2, 14, $noreg, $noreg
167    BL @bar, implicit-def dead $lr, implicit $sp
168  bb.2:
169    BL @bar, implicit-def dead $lr, implicit $sp
170    $r0 = MOVi 2, 14, $noreg, $noreg
171    $r1 = MOVi 2, 14, $noreg, $noreg
172    $r2 = MOVi 2, 14, $noreg, $noreg
173    $r3 = MOVi 2, 14, $noreg, $noreg
174    $r4 = MOVi 2, 14, $noreg, $noreg
175    BL @bar, implicit-def dead $lr, implicit $sp
176  bb.3:
177    BL @bar, implicit-def dead $lr, implicit $sp
178    $r0 = MOVi 2, 14, $noreg, $noreg
179    $r1 = MOVi 2, 14, $noreg, $noreg
180    $r2 = MOVi 2, 14, $noreg, $noreg
181    $r3 = MOVi 2, 14, $noreg, $noreg
182    $r4 = MOVi 2, 14, $noreg, $noreg
183    BL @bar, implicit-def dead $lr, implicit $sp
184  bb.4:
185    BX_RET 14, $noreg
186...
187---
188
189name:           outline_call_tailcall_thumb
190tracksRegLiveness: true
191body:             |
192  ; CHECK-LABEL: name: outline_call_tailcall_thumb
193  ; CHECK: bb.0:
194  ; CHECK:   liveins: $r7, $lr
195  ; CHECK:   $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r7, killed $lr
196  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
197  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
198  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r7, -8
199  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3
200  ; CHECK: bb.1:
201  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3
202  ; CHECK: bb.2:
203  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3
204  ; CHECK: bb.3:
205  ; CHECK:   tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3
206  ; CHECK: bb.4:
207  ; CHECK:   $sp = frame-destroy t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r7, def $pc
208  bb.0:
209    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
210    $r0 = t2MOVi 2, 14, $noreg, $noreg
211    $r1 = t2MOVi 2, 14, $noreg, $noreg
212    $r2 = t2MOVi 2, 14, $noreg, $noreg
213    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
214  bb.1:
215    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
216    $r0 = t2MOVi 2, 14, $noreg, $noreg
217    $r1 = t2MOVi 2, 14, $noreg, $noreg
218    $r2 = t2MOVi 2, 14, $noreg, $noreg
219    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
220  bb.2:
221    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
222    $r0 = t2MOVi 2, 14, $noreg, $noreg
223    $r1 = t2MOVi 2, 14, $noreg, $noreg
224    $r2 = t2MOVi 2, 14, $noreg, $noreg
225    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
226  bb.3:
227    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
228    $r0 = t2MOVi 2, 14, $noreg, $noreg
229    $r1 = t2MOVi 2, 14, $noreg, $noreg
230    $r2 = t2MOVi 2, 14, $noreg, $noreg
231    tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp
232  bb.4:
233    tBX_RET 14, $noreg
234...
235---
236
237name:           outline_call_KO_mcount
238tracksRegLiveness: true
239body:             |
240  ; CHECK-LABEL: name: outline_call_KO_mcount
241  ; CHECK: bb.0:
242  ; CHECK:   liveins: $r4, $lr
243  ; CHECK:   $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr
244  ; CHECK:   frame-setup CFI_INSTRUCTION def_cfa_offset 8
245  ; CHECK:   frame-setup CFI_INSTRUCTION offset $lr, -4
246  ; CHECK:   frame-setup CFI_INSTRUCTION offset $r4, -8
247  ; CHECK:   BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
248  ; CHECK:   BL @OUTLINED_FUNCTION_1
249  ; CHECK: bb.1:
250  ; CHECK:   BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
251  ; CHECK:   BL @OUTLINED_FUNCTION_1
252  ; CHECK: bb.2:
253  ; CHECK:   BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
254  ; CHECK:   BL @OUTLINED_FUNCTION_1
255  ; CHECK: bb.3:
256  ; CHECK:   BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
257  ; CHECK:   BL @OUTLINED_FUNCTION_1
258  ; CHECK: bb.4:
259  ; CHECK:   BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
260  ; CHECK:   BL @OUTLINED_FUNCTION_1
261  ; CHECK: bb.5:
262  ; CHECK:   $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr
263  ; CHECK:   BX_RET 14 /* CC::al */, $noreg
264  bb.0:
265    BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
266    $r0 = MOVi 3, 14, $noreg, $noreg
267    $r1 = MOVi 3, 14, $noreg, $noreg
268    $r2 = MOVi 3, 14, $noreg, $noreg
269    $r3 = MOVi 3, 14, $noreg, $noreg
270    $r4 = MOVi 3, 14, $noreg, $noreg
271  bb.1:
272    BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
273    $r0 = MOVi 3, 14, $noreg, $noreg
274    $r1 = MOVi 3, 14, $noreg, $noreg
275    $r2 = MOVi 3, 14, $noreg, $noreg
276    $r3 = MOVi 3, 14, $noreg, $noreg
277    $r4 = MOVi 3, 14, $noreg, $noreg
278  bb.2:
279    BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
280    $r0 = MOVi 3, 14, $noreg, $noreg
281    $r1 = MOVi 3, 14, $noreg, $noreg
282    $r2 = MOVi 3, 14, $noreg, $noreg
283    $r3 = MOVi 3, 14, $noreg, $noreg
284    $r4 = MOVi 3, 14, $noreg, $noreg
285  bb.3:
286    BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
287    $r0 = MOVi 3, 14, $noreg, $noreg
288    $r1 = MOVi 3, 14, $noreg, $noreg
289    $r2 = MOVi 3, 14, $noreg, $noreg
290    $r3 = MOVi 3, 14, $noreg, $noreg
291    $r4 = MOVi 3, 14, $noreg, $noreg
292  bb.4:
293    BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp
294    $r0 = MOVi 3, 14, $noreg, $noreg
295    $r1 = MOVi 3, 14, $noreg, $noreg
296    $r2 = MOVi 3, 14, $noreg, $noreg
297    $r3 = MOVi 3, 14, $noreg, $noreg
298    $r4 = MOVi 3, 14, $noreg, $noreg
299  bb.5:
300    BX_RET 14, $noreg
301...
302---
303
304name:           bar
305tracksRegLiveness: true
306body:             |
307  bb.0:
308    BX_RET 14, $noreg
309
310  ; CHECK-LABEL: name: OUTLINED_FUNCTION_0
311  ; CHECK: bb.0:
312  ; CHECK:   liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8
313  ; CHECK:   $r0 = MOVi 2, 14 /* CC::al */, $noreg, $noreg
314  ; CHECK:   $r1 = MOVi 2, 14 /* CC::al */, $noreg, $noreg
315  ; CHECK:   $r2 = MOVi 2, 14 /* CC::al */, $noreg, $noreg
316  ; CHECK:   $r3 = MOVi 2, 14 /* CC::al */, $noreg, $noreg
317  ; CHECK:   $r4 = MOVi 2, 14 /* CC::al */, $noreg, $noreg
318  ; CHECK:   TAILJMPd @bar, implicit $sp
319
320  ; CHECK-LABEL: name: OUTLINED_FUNCTION_1
321  ; CHECK: bb.0:
322  ; CHECK:   liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8
323  ; CHECK:   $r0 = MOVi 3, 14 /* CC::al */, $noreg, $noreg
324  ; CHECK:   $r1 = MOVi 3, 14 /* CC::al */, $noreg, $noreg
325  ; CHECK:   $r2 = MOVi 3, 14 /* CC::al */, $noreg, $noreg
326  ; CHECK:   $r3 = MOVi 3, 14 /* CC::al */, $noreg, $noreg
327  ; CHECK:   $r4 = MOVi 3, 14 /* CC::al */, $noreg, $noreg
328  ; CHECK:   MOVPCLR 14 /* CC::al */, $noreg
329
330  ; CHECK-LABEL: name: OUTLINED_FUNCTION_2
331  ; CHECK: bb.0:
332  ; CHECK:   liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8
333  ; CHECK:   $r0 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
334  ; CHECK:   $r1 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
335  ; CHECK:   $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
336  ; CHECK:   $r3 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
337  ; CHECK:   $r4 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
338  ; CHECK:   MOVPCLR 14 /* CC::al */, $noreg
339
340  ; CHECK-LABEL: name: OUTLINED_FUNCTION_3
341  ; CHECK: bb.0:
342  ; CHECK:   liveins: $r11, $r10, $r9, $r8, $r6, $r5, $r4, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8
343  ; CHECK:   $r0 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg
344  ; CHECK:   $r1 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg
345  ; CHECK:   $r2 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg
346  ; CHECK:   tTAILJMPdND @bar, 14 /* CC::al */, $noreg, implicit $sp
347
348  ; CHECK-LABEL: name: OUTLINED_FUNCTION_4
349  ; CHECK: bb.0:
350  ; CHECK:   liveins: $r11, $r10, $r9, $r8, $r6, $r5, $r4, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8
351  ; CHECK:   $r0 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
352  ; CHECK:   $r1 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
353  ; CHECK:   $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
354  ; CHECK:   tBX_RET 14 /* CC::al */, $noreg
355