xref: /llvm-project/llvm/test/CodeGen/AArch64/machine-outliner.mir (revision d9a00ed3668803d11675b103fe9b6ed077ddc4c1)
1# RUN: llc -mtriple=aarch64--- -run-pass=prologepilog -run-pass=machine-outliner -verify-machineinstrs -frame-pointer=non-leaf -outliner-leaf-descendants=false %s -o - | FileCheck %s
2--- |
3
4  @x = common global i32 0, align 4
5
6  define void @baz() #0 {
7    ret void
8  }
9
10  define i32 @main() #0 {
11    ret i32 0
12  }
13
14  define void @bar(i32 %a) #0 {
15    ret void
16  }
17
18  attributes #0 = { noinline noredzone }
19...
20---
21# This test ensures that we
22# - Create outlined functions
23# - Don't outline anything to do with LR or W30
24# - Save LR when it's not available
25# - Functions whose addresses are taken can still be outlined
26#
27# CHECK-LABEL: main
28# CHECK-LABEL: bb.1:
29# CHECK-DAG: BL @OUTLINED_FUNCTION_[[F0:[0-9]+]]
30# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG:[0-9]+]], 0
31# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1
32# CHECK-NEXT: $lr = ORRXri $xzr, 1
33
34# CHECK-DAG: bb.2
35# CHECK: BL @OUTLINED_FUNCTION_[[F0]]
36# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG]], 0
37# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1
38# CHECK-NEXT: $lr = ORRXri $xzr, 1
39
40# CHECK-DAG: bb.3
41# CHECK: BL @OUTLINED_FUNCTION_[[F0]]
42# CHECK-NEXT: $lr = ORRXrs $xzr, $x[[REG]], 0
43# CHECK-NEXT: STRHHroW $w12, $x9, $w30, 1, 1
44# CHECK-NEXT: $lr = ORRXri $xzr, 1
45name:            main
46tracksRegLiveness: true
47body:             |
48  bb.0:
49  liveins: $lr
50    $sp = frame-setup SUBXri $sp, 16, 0
51    renamable $x9 = ADRP target-flags(aarch64-page) @bar
52    $x9 = ORRXri $xzr, 1
53    $w12 = ORRWri $wzr, 1
54    $w30 = ORRWri $wzr, 1
55    $lr = ORRXri $xzr, 1
56  bb.1:
57  liveins: $lr
58    $x20, $x19 = LDPXi $sp, 10
59    $w12 = ORRWri $wzr, 1
60    $w12 = ORRWri $wzr, 1
61    $w12 = ORRWri $wzr, 1
62    $w12 = ORRWri $wzr, 1
63    $w12 = ORRWri $wzr, 1
64    $w12 = ORRWri $wzr, 1
65    renamable $x9 = ADRP target-flags(aarch64-page) @x
66    $x12 = ADDXri $sp, 48, 0;
67    STRHHroW $w12, $x9, $w30, 1, 1
68    $lr = ORRXri $xzr, 1
69  bb.2:
70  liveins: $lr
71    $x20, $x19 = LDPXi $sp, 10
72    $w12 = ORRWri $wzr, 1
73    $w12 = ORRWri $wzr, 1
74    $w12 = ORRWri $wzr, 1
75    $w12 = ORRWri $wzr, 1
76    $w12 = ORRWri $wzr, 1
77    $w12 = ORRWri $wzr, 1
78    renamable $x9 = ADRP target-flags(aarch64-page) @x
79    $x12 = ADDXri $sp, 48, 0;
80    STRHHroW $w12, $x9, $w30, 1, 1
81    $lr = ORRXri $xzr, 1
82  bb.3:
83  liveins: $lr
84    $x20, $x19 = LDPXi $sp, 10
85    $w12 = ORRWri $wzr, 1
86    $w12 = ORRWri $wzr, 1
87    $w12 = ORRWri $wzr, 1
88    $w12 = ORRWri $wzr, 1
89    $w12 = ORRWri $wzr, 1
90    $w12 = ORRWri $wzr, 1
91    renamable $x9 = ADRP target-flags(aarch64-page) @x
92    $x12 = ADDXri $sp, 48, 0;
93    STRHHroW $w12, $x9, $w30, 1, 1
94    $lr = ORRXri $xzr, 1
95    $sp = ADDXri $sp, 16, 0
96  bb.4:
97  liveins: $lr
98    RET undef $lr
99
100...
101---
102# This test ensures that we can avoid saving LR when it's available.
103# It also makes sure that KILL instructions don't impact outlining.
104# CHECK-LABEL: bb.1:
105# CHECK-NOT: BL @baz, implicit-def dead $lr, implicit $sp
106# CHECK: BL @OUTLINED_FUNCTION_[[F1:[0-9]+]], implicit-def $lr, implicit $sp
107# CHECK-NEXT: $w11 = ORRWri $wzr, 2
108# CHECK-NEXT: BL @OUTLINED_FUNCTION_[[F1]], implicit-def $lr, implicit $sp
109# CHECK-NEXT: $w8 = ORRWri $wzr, 0
110# CHECK-NOT: $w11 = KILL renamable $w11, implicit killed $w11
111name:            bar
112tracksRegLiveness: true
113body:             |
114  bb.0:
115    liveins: $w0, $lr, $w8
116    $sp = frame-setup SUBXri $sp, 32, 0
117    $fp = frame-setup ADDXri $sp, 16, 0
118
119  bb.1:
120    BL @baz, implicit-def dead $lr, implicit $sp
121    $w11 = ORRWri $wzr, 1
122    $w11 = ORRWri $wzr, 1
123    $w11 = KILL renamable $w11, implicit killed $w11
124    $w11 = ORRWri $wzr, 1
125    $w11 = ORRWri $wzr, 1
126    BL @baz, implicit-def dead $lr, implicit $sp
127    $w11 = ORRWri $wzr, 1
128    $w11 = ORRWri $wzr, 1
129    $w11 = ORRWri $wzr, 2
130    BL @baz, implicit-def dead $lr, implicit $sp
131    $w11 = ORRWri $wzr, 1
132    $w11 = ORRWri $wzr, 1
133    $w11 = ORRWri $wzr, 1
134    $w11 = ORRWri $wzr, 1
135    BL @baz, implicit-def dead $lr, implicit $sp
136    $w11 = ORRWri $wzr, 1
137    $w11 = ORRWri $wzr, 1
138    $w8 = ORRWri $wzr, 0
139
140  bb.2:
141    $w15 = ORRWri $wzr, 1
142    $w15 = ORRWri $wzr, 1
143    $w15 = ORRWri $wzr, 1
144    $w15 = ORRWri $wzr, 1
145    $x15 = ADDXri $sp, 48, 0;
146    $w9 = ORRWri $wzr, 0
147    $w15 = ORRWri $wzr, 1
148    $w15 = ORRWri $wzr, 1
149    $w15 = ORRWri $wzr, 1
150    $w15 = ORRWri $wzr, 1
151    $x15 = ADDXri $sp, 48, 0;
152    $w8 = ORRWri $wzr, 0
153
154  bb.3:
155    $fp, $lr = LDPXi $sp, 2
156    $sp = ADDXri $sp, 32, 0
157    RET undef $lr
158
159...
160---
161name:            baz
162tracksRegLiveness: true
163body:             |
164  bb.0:
165    liveins: $w0, $lr, $w8
166    RET undef $lr
167
168# CHECK-LABEL: name:            OUTLINED_FUNCTION_{{[0-9]}}
169# CHECK=LABEL: name:            OUTLINED_FUNCTION_{{[1-9]}}
170