@@ -50,16 +50,30 @@ define void @new_za_callee() "aarch64_new_za" {
5050 ret void
5151}
5252
53+ define void @agnostic_za_callee () "aarch64_za_state_agnostic" {
54+ ; CHECK-LABEL: define void @agnostic_za_callee
55+ ; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
56+ ; CHECK-NEXT: call void asm sideeffect "
57+ ; CHECK-NEXT: call void @inlined_body()
58+ ; CHECK-NEXT: ret void
59+ ;
60+ call void asm sideeffect "; inlineasm" , "" ()
61+ call void @inlined_body ()
62+ ret void
63+ }
64+
5365;
5466; Now test that inlining only happens when no lazy-save is needed.
5567; Test for a number of combinations, where:
5668; N Not using ZA.
5769; S Shared ZA interface
5870; Z New ZA with Private-ZA interface
71+ ; A Agnostic ZA interface
5972
6073; [x] N -> N
6174; [ ] N -> S (This combination is invalid)
6275; [ ] N -> Z
76+ ; [ ] N -> A
6377define void @nonza_caller_nonza_callee_inline () {
6478; CHECK-LABEL: define void @nonza_caller_nonza_callee_inline
6579; CHECK-SAME: () #[[ATTR0]] {
7690; [ ] N -> N
7791; [ ] N -> S (This combination is invalid)
7892; [x] N -> Z
93+ ; [ ] N -> A
7994define void @nonza_caller_new_za_callee_dont_inline () {
8095; CHECK-LABEL: define void @nonza_caller_new_za_callee_dont_inline
8196; CHECK-SAME: () #[[ATTR0]] {
@@ -88,9 +103,27 @@ entry:
88103 ret void
89104}
90105
106+ ; [ ] N -> N
107+ ; [ ] N -> S (This combination is invalid)
108+ ; [ ] N -> Z
109+ ; [x] N -> A
110+ define void @nonza_caller_agnostic_za_callee_inline () {
111+ ; CHECK-LABEL: define void @nonza_caller_agnostic_za_callee_inline
112+ ; CHECK-SAME: () #[[ATTR0]] {
113+ ; CHECK-NEXT: entry:
114+ ; CHECK-NEXT: call void asm sideeffect "
115+ ; CHECK-NEXT: call void @inlined_body()
116+ ; CHECK-NEXT: ret void
117+ ;
118+ entry:
119+ call void @agnostic_za_callee ()
120+ ret void
121+ }
122+
91123; [x] Z -> N
92124; [ ] Z -> S
93125; [ ] Z -> Z
126+ ; [ ] Z -> A
94127define void @new_za_caller_nonza_callee_dont_inline () "aarch64_new_za" {
95128; CHECK-LABEL: define void @new_za_caller_nonza_callee_dont_inline
96129; CHECK-SAME: () #[[ATTR2]] {
@@ -106,6 +139,7 @@ entry:
106139; [ ] Z -> N
107140; [x] Z -> S
108141; [ ] Z -> Z
142+ ; [ ] Z -> A
109143define void @new_za_caller_shared_za_callee_inline () "aarch64_new_za" {
110144; CHECK-LABEL: define void @new_za_caller_shared_za_callee_inline
111145; CHECK-SAME: () #[[ATTR2]] {
@@ -122,6 +156,7 @@ entry:
122156; [ ] Z -> N
123157; [ ] Z -> S
124158; [x] Z -> Z
159+ ; [ ] Z -> A
125160define void @new_za_caller_new_za_callee_dont_inline () "aarch64_new_za" {
126161; CHECK-LABEL: define void @new_za_caller_new_za_callee_dont_inline
127162; CHECK-SAME: () #[[ATTR2]] {
@@ -134,9 +169,27 @@ entry:
134169 ret void
135170}
136171
172+ ; [ ] Z -> N
173+ ; [ ] Z -> S
174+ ; [ ] Z -> Z
175+ ; [x] Z -> A
176+ define void @new_za_caller_agnostic_za_callee_inline () "aarch64_new_za" {
177+ ; CHECK-LABEL: define void @new_za_caller_agnostic_za_callee_inline
178+ ; CHECK-SAME: () #[[ATTR2]] {
179+ ; CHECK-NEXT: entry:
180+ ; CHECK-NEXT: call void asm sideeffect "
181+ ; CHECK-NEXT: call void @inlined_body()
182+ ; CHECK-NEXT: ret void
183+ ;
184+ entry:
185+ call void @agnostic_za_callee ()
186+ ret void
187+ }
188+
137189; [x] S -> N
138190; [ ] S -> S
139191; [ ] S -> Z
192+ ; [ ] S -> A
140193define void @shared_za_caller_nonza_callee_dont_inline () "aarch64_inout_za" {
141194; CHECK-LABEL: define void @shared_za_caller_nonza_callee_dont_inline
142195; CHECK-SAME: () #[[ATTR1]] {
@@ -152,6 +205,7 @@ entry:
152205; [ ] S -> N
153206; [x] S -> Z
154207; [ ] S -> S
208+ ; [ ] S -> A
155209define void @shared_za_caller_new_za_callee_dont_inline () "aarch64_inout_za" {
156210; CHECK-LABEL: define void @shared_za_caller_new_za_callee_dont_inline
157211; CHECK-SAME: () #[[ATTR1]] {
@@ -167,6 +221,7 @@ entry:
167221; [ ] S -> N
168222; [ ] S -> Z
169223; [x] S -> S
224+ ; [ ] S -> A
170225define void @shared_za_caller_shared_za_callee_inline () "aarch64_inout_za" {
171226; CHECK-LABEL: define void @shared_za_caller_shared_za_callee_inline
172227; CHECK-SAME: () #[[ATTR1]] {
@@ -180,6 +235,90 @@ entry:
180235 ret void
181236}
182237
238+ ; [ ] S -> N
239+ ; [ ] S -> Z
240+ ; [ ] S -> S
241+ ; [x] S -> A
242+ define void @shared_za_caller_agnostic_za_callee_inline () "aarch64_inout_za" {
243+ ; CHECK-LABEL: define void @shared_za_caller_agnostic_za_callee_inline
244+ ; CHECK-SAME: () #[[ATTR1]] {
245+ ; CHECK-NEXT: entry:
246+ ; CHECK-NEXT: call void asm sideeffect "
247+ ; CHECK-NEXT: call void @inlined_body()
248+ ; CHECK-NEXT: ret void
249+ ;
250+ entry:
251+ call void @agnostic_za_callee ()
252+ ret void
253+ }
254+
255+ ; [x] A -> N
256+ ; [ ] A -> Z
257+ ; [ ] A -> S
258+ ; [ ] A -> A
259+ define void @agnostic_za_caller_nonza_callee_dont_inline () "aarch64_za_state_agnostic" {
260+ ; CHECK-LABEL: define void @agnostic_za_caller_nonza_callee_dont_inline
261+ ; CHECK-SAME: () #[[ATTR3]] {
262+ ; CHECK-NEXT: entry:
263+ ; CHECK-NEXT: call void @nonza_callee()
264+ ; CHECK-NEXT: ret void
265+ ;
266+ entry:
267+ call void @nonza_callee ()
268+ ret void
269+ }
270+
271+ ; [ ] A -> N
272+ ; [x] A -> Z
273+ ; [ ] A -> S
274+ ; [ ] A -> A
275+ define void @agnostic_za_caller_now_za_callee_dont_inline () "aarch64_za_state_agnostic" {
276+ ; CHECK-LABEL: define void @agnostic_za_caller_now_za_callee_dont_inline
277+ ; CHECK-SAME: () #[[ATTR3]] {
278+ ; CHECK-NEXT: entry:
279+ ; CHECK-NEXT: call void @new_za_callee()
280+ ; CHECK-NEXT: ret void
281+ ;
282+ entry:
283+ call void @new_za_callee ()
284+ ret void
285+ }
286+
287+ ; [ ] A -> N
288+ ; [ ] A -> Z
289+ ; [x] A -> S (invalid)
290+ ; [ ] A -> A
291+ define void @agnostic_za_caller_shared_za_callee_dont_inline () "aarch64_za_state_agnostic" {
292+ ; CHECK-LABEL: define void @agnostic_za_caller_shared_za_callee_dont_inline
293+ ; CHECK-SAME: () #[[ATTR3]] {
294+ ; CHECK-NEXT: entry:
295+ ; CHECK-NEXT: call void @shared_za_callee()
296+ ; CHECK-NEXT: ret void
297+ ;
298+ entry:
299+ call void @shared_za_callee ()
300+ ret void
301+ }
302+
303+ ; [ ] A -> N
304+ ; [ ] A -> Z
305+ ; [ ] A -> S
306+ ; [x] A -> A
307+ define void @agnostic_za_caller_agnostic_za_callee_inline () "aarch64_za_state_agnostic" {
308+ ; CHECK-LABEL: define void @agnostic_za_caller_agnostic_za_callee_inline
309+ ; CHECK-SAME: () #[[ATTR3]] {
310+ ; CHECK-NEXT: entry:
311+ ; CHECK-NEXT: call void asm sideeffect "
312+ ; CHECK-NEXT: call void @inlined_body()
313+ ; CHECK-NEXT: ret void
314+ ;
315+ entry:
316+ call void @agnostic_za_callee ()
317+ ret void
318+ }
319+
320+
321+
183322define void @private_za_callee_call_za_disable () {
184323; CHECK-LABEL: define void @private_za_callee_call_za_disable
185324; CHECK-SAME: () #[[ATTR0]] {
@@ -254,7 +393,7 @@ define void @nonzt0_callee() {
254393
255394define void @shared_zt0_caller_nonzt0_callee_dont_inline () "aarch64_inout_zt0" {
256395; CHECK-LABEL: define void @shared_zt0_caller_nonzt0_callee_dont_inline
257- ; CHECK-SAME: () #[[ATTR3 :[0-9]+]] {
396+ ; CHECK-SAME: () #[[ATTR4 :[0-9]+]] {
258397; CHECK-NEXT: call void @nonzt0_callee()
259398; CHECK-NEXT: ret void
260399;
@@ -264,7 +403,7 @@ define void @shared_zt0_caller_nonzt0_callee_dont_inline() "aarch64_inout_zt0" {
264403
265404define void @shared_zt0_callee () "aarch64_inout_zt0" {
266405; CHECK-LABEL: define void @shared_zt0_callee
267- ; CHECK-SAME: () #[[ATTR3 ]] {
406+ ; CHECK-SAME: () #[[ATTR4 ]] {
268407; CHECK-NEXT: call void asm sideeffect "
269408; CHECK-NEXT: call void @inlined_body()
270409; CHECK-NEXT: ret void
@@ -276,7 +415,7 @@ define void @shared_zt0_callee() "aarch64_inout_zt0" {
276415
277416define void @shared_zt0_caller_shared_zt0_callee_inline () "aarch64_inout_zt0" {
278417; CHECK-LABEL: define void @shared_zt0_caller_shared_zt0_callee_inline
279- ; CHECK-SAME: () #[[ATTR3 ]] {
418+ ; CHECK-SAME: () #[[ATTR4 ]] {
280419; CHECK-NEXT: call void asm sideeffect "
281420; CHECK-NEXT: call void @inlined_body()
282421; CHECK-NEXT: ret void
0 commit comments