Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / Inline / AArch64 / sme-pstateza-attrs.ll
blob5e638103a2b0637153456ff59009a5227388aeb0
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -mtriple=aarch64-unknown-linux-gnu -mattr=+sme -S -passes=inline < %s | FileCheck %s
4 declare void @inlined_body()
7 ; Define some functions that will be called by the functions below.
8 ; These just call a '...body()' function. If we see the call to one of
9 ; these functions being replaced by '...body()', then we know it has been
10 ; inlined.
13 define void @nonza_callee() {
14 ; CHECK-LABEL: define void @nonza_callee
15 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
16 ; CHECK-NEXT:  entry:
17 ; CHECK-NEXT:    call void @inlined_body()
18 ; CHECK-NEXT:    ret void
20 entry:
21   call void @inlined_body()
22   ret void
25 define void @shared_za_callee() "aarch64_inout_za" {
26 ; CHECK-LABEL: define void @shared_za_callee
27 ; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
28 ; CHECK-NEXT:  entry:
29 ; CHECK-NEXT:    call void @inlined_body()
30 ; CHECK-NEXT:    ret void
32 entry:
33   call void @inlined_body()
34   ret void
37 define void @new_za_callee() "aarch64_new_za" {
38 ; CHECK-LABEL: define void @new_za_callee
39 ; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
40 ; CHECK-NEXT:    call void @inlined_body()
41 ; CHECK-NEXT:    ret void
43   call void @inlined_body()
44   ret void
48 ; Now test that inlining only happens when no lazy-save is needed.
49 ; Test for a number of combinations, where:
50 ; N   Not using ZA.
51 ; S   Shared ZA interface
52 ; Z   New ZA interface
54 ; [x] N -> N
55 ; [ ] N -> S (This combination is invalid)
56 ; [ ] N -> Z
57 define void @nonza_caller_nonza_callee_inline() {
58 ; CHECK-LABEL: define void @nonza_caller_nonza_callee_inline
59 ; CHECK-SAME: () #[[ATTR0]] {
60 ; CHECK-NEXT:  entry:
61 ; CHECK-NEXT:    call void @inlined_body()
62 ; CHECK-NEXT:    ret void
64 entry:
65   call void @nonza_callee()
66   ret void
69 ; [ ] N -> N
70 ; [ ] N -> S (This combination is invalid)
71 ; [x] N -> Z
72 define void @nonza_caller_new_za_callee_dont_inline() {
73 ; CHECK-LABEL: define void @nonza_caller_new_za_callee_dont_inline
74 ; CHECK-SAME: () #[[ATTR0]] {
75 ; CHECK-NEXT:  entry:
76 ; CHECK-NEXT:    call void @new_za_callee()
77 ; CHECK-NEXT:    ret void
79 entry:
80   call void @new_za_callee()
81   ret void
84 ; [x] Z -> N
85 ; [ ] Z -> S
86 ; [ ] Z -> Z
87 define void @new_za_caller_nonza_callee_inline() "aarch64_new_za" {
88 ; CHECK-LABEL: define void @new_za_caller_nonza_callee_inline
89 ; CHECK-SAME: () #[[ATTR2]] {
90 ; CHECK-NEXT:  entry:
91 ; CHECK-NEXT:    call void @inlined_body()
92 ; CHECK-NEXT:    ret void
94 entry:
95   call void @nonza_callee()
96   ret void
99 ; [ ] Z -> N
100 ; [x] Z -> S
101 ; [ ] Z -> Z
102 define void @new_za_caller_shared_za_callee_inline() "aarch64_new_za" {
103 ; CHECK-LABEL: define void @new_za_caller_shared_za_callee_inline
104 ; CHECK-SAME: () #[[ATTR2]] {
105 ; CHECK-NEXT:  entry:
106 ; CHECK-NEXT:    call void @inlined_body()
107 ; CHECK-NEXT:    ret void
109 entry:
110   call void @shared_za_callee()
111   ret void
114 ; [ ] Z -> N
115 ; [ ] Z -> S
116 ; [x] Z -> Z
117 define void @new_za_caller_new_za_callee_dont_inline() "aarch64_new_za" {
118 ; CHECK-LABEL: define void @new_za_caller_new_za_callee_dont_inline
119 ; CHECK-SAME: () #[[ATTR2]] {
120 ; CHECK-NEXT:  entry:
121 ; CHECK-NEXT:    call void @new_za_callee()
122 ; CHECK-NEXT:    ret void
124 entry:
125   call void @new_za_callee()
126   ret void
129 ; [x] Z -> N
130 ; [ ] Z -> S
131 ; [ ] Z -> Z
132 define void @shared_za_caller_nonza_callee_inline() "aarch64_inout_za" {
133 ; CHECK-LABEL: define void @shared_za_caller_nonza_callee_inline
134 ; CHECK-SAME: () #[[ATTR1]] {
135 ; CHECK-NEXT:  entry:
136 ; CHECK-NEXT:    call void @inlined_body()
137 ; CHECK-NEXT:    ret void
139 entry:
140   call void @nonza_callee()
141   ret void
144 ; [ ] S -> N
145 ; [x] S -> Z
146 ; [ ] S -> S
147 define void @shared_za_caller_new_za_callee_dont_inline() "aarch64_inout_za" {
148 ; CHECK-LABEL: define void @shared_za_caller_new_za_callee_dont_inline
149 ; CHECK-SAME: () #[[ATTR1]] {
150 ; CHECK-NEXT:  entry:
151 ; CHECK-NEXT:    call void @new_za_callee()
152 ; CHECK-NEXT:    ret void
154 entry:
155   call void @new_za_callee()
156   ret void
159 ; [ ] S -> N
160 ; [ ] S -> Z
161 ; [x] S -> S
162 define void @shared_za_caller_shared_za_callee_inline() "aarch64_inout_za" {
163 ; CHECK-LABEL: define void @shared_za_caller_shared_za_callee_inline
164 ; CHECK-SAME: () #[[ATTR1]] {
165 ; CHECK-NEXT:  entry:
166 ; CHECK-NEXT:    call void @inlined_body()
167 ; CHECK-NEXT:    ret void
169 entry:
170   call void @shared_za_callee()
171   ret void
174 define void @private_za_callee_call_za_disable() {
175 ; CHECK-LABEL: define void @private_za_callee_call_za_disable
176 ; CHECK-SAME: () #[[ATTR0]] {
177 ; CHECK-NEXT:    call void @__arm_za_disable()
178 ; CHECK-NEXT:    ret void
180   call void @__arm_za_disable()
181   ret void
184 define void @shared_za_caller_private_za_callee_call_za_disable() "aarch64_inout_za" {
185 ; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_za_disable
186 ; CHECK-SAME: () #[[ATTR1]] {
187 ; CHECK-NEXT:    call void @private_za_callee_call_za_disable()
188 ; CHECK-NEXT:    ret void
190   call void @private_za_callee_call_za_disable()
191   ret void
194 define void @private_za_callee_call_tpidr2_save() {
195 ; CHECK-LABEL: define void @private_za_callee_call_tpidr2_save
196 ; CHECK-SAME: () #[[ATTR0]] {
197 ; CHECK-NEXT:    call void @__arm_tpidr2_save()
198 ; CHECK-NEXT:    ret void
200   call void @__arm_tpidr2_save()
201   ret void
204 define void @shared_za_caller_private_za_callee_call_tpidr2_save_dont_inline() "aarch64_inout_za" {
205 ; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_tpidr2_save_dont_inline
206 ; CHECK-SAME: () #[[ATTR1]] {
207 ; CHECK-NEXT:    call void @private_za_callee_call_tpidr2_save()
208 ; CHECK-NEXT:    ret void
210   call void @private_za_callee_call_tpidr2_save()
211   ret void
214 define void @private_za_callee_call_tpidr2_restore(ptr %ptr) {
215 ; CHECK-LABEL: define void @private_za_callee_call_tpidr2_restore
216 ; CHECK-SAME: (ptr [[PTR:%.*]]) #[[ATTR0]] {
217 ; CHECK-NEXT:    call void @__arm_tpidr2_restore(ptr [[PTR]])
218 ; CHECK-NEXT:    ret void
220   call void @__arm_tpidr2_restore(ptr %ptr)
221   ret void
224 define void @shared_za_caller_private_za_callee_call_tpidr2_restore_dont_inline(ptr %ptr) "aarch64_inout_za" {
225 ; CHECK-LABEL: define void @shared_za_caller_private_za_callee_call_tpidr2_restore_dont_inline
226 ; CHECK-SAME: (ptr [[PTR:%.*]]) #[[ATTR1]] {
227 ; CHECK-NEXT:    call void @private_za_callee_call_tpidr2_restore(ptr [[PTR]])
228 ; CHECK-NEXT:    ret void
230   call void @private_za_callee_call_tpidr2_restore(ptr %ptr)
231   ret void
234 define void @nonzt0_callee() {
235 ; CHECK-LABEL: define void @nonzt0_callee
236 ; CHECK-SAME: () #[[ATTR0]] {
237 ; CHECK-NEXT:    call void asm sideeffect "
238 ; CHECK-NEXT:    call void @inlined_body()
239 ; CHECK-NEXT:    ret void
241   call void asm sideeffect "; inlineasm", ""()
242   call void @inlined_body()
243   ret void
246 define void @shared_zt0_caller_nonzt0_callee_dont_inline() "aarch64_inout_zt0" {
247 ; CHECK-LABEL: define void @shared_zt0_caller_nonzt0_callee_dont_inline
248 ; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
249 ; CHECK-NEXT:    call void @nonzt0_callee()
250 ; CHECK-NEXT:    ret void
252   call void @nonzt0_callee()
253   ret void
256 define void @shared_zt0_callee() "aarch64_inout_zt0" {
257 ; CHECK-LABEL: define void @shared_zt0_callee
258 ; CHECK-SAME: () #[[ATTR3]] {
259 ; CHECK-NEXT:    call void asm sideeffect "
260 ; CHECK-NEXT:    call void @inlined_body()
261 ; CHECK-NEXT:    ret void
263   call void asm sideeffect "; inlineasm", ""()
264   call void @inlined_body()
265   ret void
268 define void @shared_zt0_caller_shared_zt0_callee_inline() "aarch64_inout_zt0" {
269 ; CHECK-LABEL: define void @shared_zt0_caller_shared_zt0_callee_inline
270 ; CHECK-SAME: () #[[ATTR3]] {
271 ; CHECK-NEXT:    call void asm sideeffect "
272 ; CHECK-NEXT:    call void @inlined_body()
273 ; CHECK-NEXT:    ret void
275   call void @shared_zt0_callee()
276   ret void
279 declare void @__arm_za_disable()
280 declare void @__arm_tpidr2_save()
281 declare void @__arm_tpidr2_restore(ptr)