Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / Inline / AArch64 / sme-pstatesm-attrs.ll
blob7723e6c664c3d5ee419c328619eaef27a3253273
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+sme -S -passes=inline | FileCheck %s
4 declare i32 @llvm.vscale.i32()
6 ; Define some functions that merely call llvm.vscale.i32(), which will be called
7 ; by the other functions below. If we see the call to one of these functions
8 ; being replaced by 'llvm.vscale()', then we know it has been inlined.
10 define i32 @normal_callee() {
11 ; CHECK-LABEL: define i32 @normal_callee
12 ; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
13 ; CHECK-NEXT:  entry:
14 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.vscale.i32()
15 ; CHECK-NEXT:    ret i32 [[RES]]
17 entry:
18   %res = call i32 @llvm.vscale.i32()
19   ret i32 %res
22 define i32 @streaming_callee() "aarch64_pstate_sm_enabled" {
23 ; CHECK-LABEL: define i32 @streaming_callee
24 ; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
25 ; CHECK-NEXT:  entry:
26 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.vscale.i32()
27 ; CHECK-NEXT:    ret i32 [[RES]]
29 entry:
30   %res = call i32 @llvm.vscale.i32()
31   ret i32 %res
34 define i32 @locally_streaming_callee() "aarch64_pstate_sm_body" {
35 ; CHECK-LABEL: define i32 @locally_streaming_callee
36 ; CHECK-SAME: () #[[ATTR3:[0-9]+]] {
37 ; CHECK-NEXT:  entry:
38 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.vscale.i32()
39 ; CHECK-NEXT:    ret i32 [[RES]]
41 entry:
42   %res = call i32 @llvm.vscale.i32()
43   ret i32 %res
46 define i32 @streaming_compatible_callee() "aarch64_pstate_sm_compatible" {
47 ; CHECK-LABEL: define i32 @streaming_compatible_callee
48 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
49 ; CHECK-NEXT:  entry:
50 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.vscale.i32()
51 ; CHECK-NEXT:    ret i32 [[RES]]
53 entry:
54   %res = call i32 @llvm.vscale.i32()
55   ret i32 %res
58 define i32 @streaming_compatible_locally_streaming_callee() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
59 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_callee
60 ; CHECK-SAME: () #[[ATTR4:[0-9]+]] {
61 ; CHECK-NEXT:  entry:
62 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @llvm.vscale.i32()
63 ; CHECK-NEXT:    ret i32 [[RES]]
65 entry:
66   %res = call i32 @llvm.vscale()
67   ret i32 %res
70 ; Now test that inlining only happens when their streaming modes match.
71 ; Test for a number of combinations, where:
72 ; N       Normal-interface (PSTATE.SM=0 on entry/exit)
73 ; S       Streaming-interface (PSTATE.SM=1 on entry/exit)
74 ; SC      Streaming-compatible interface
75 ;         (PSTATE.SM=0 or 1, unchanged on exit)
76 ; N + B   Normal-interface, streaming body
77 ;         (PSTATE.SM=0 on entry/exit, but 1 within the body of the function)
78 ; SC + B  Streaming-compatible-interface, streaming body
79 ;         (PSTATE.SM=0 or 1 on entry, unchanged on exit,
80 ;          but guaranteed to be 1 within the body of the function)
82 ; [x] N  -> N
83 ; [ ] N  -> S
84 ; [ ] N  -> SC
85 ; [ ] N  -> N + B
86 ; [ ] N  -> SC + B
87 define i32 @normal_caller_normal_callee_inline() {
88 ; CHECK-LABEL: define i32 @normal_caller_normal_callee_inline
89 ; CHECK-SAME: () #[[ATTR1]] {
90 ; CHECK-NEXT:  entry:
91 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
92 ; CHECK-NEXT:    ret i32 [[RES_I]]
94 entry:
95   %res = call i32 @normal_callee()
96   ret i32 %res
99 ; [ ] N  -> N
100 ; [x] N  -> S
101 ; [ ] N  -> SC
102 ; [ ] N  -> N + B
103 ; [ ] N  -> SC + B
104 define i32 @normal_caller_streaming_callee_dont_inline() {
105 ; CHECK-LABEL: define i32 @normal_caller_streaming_callee_dont_inline
106 ; CHECK-SAME: () #[[ATTR1]] {
107 ; CHECK-NEXT:  entry:
108 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @streaming_callee()
109 ; CHECK-NEXT:    ret i32 [[RES]]
111 entry:
112   %res = call i32 @streaming_callee()
113   ret i32 %res
116 ; [ ] N  -> N
117 ; [ ] N  -> S
118 ; [x] N  -> SC
119 ; [ ] N  -> N + B
120 ; [ ] N  -> SC + B
121 define i32 @normal_caller_streaming_compatible_callee_inline() {
122 ; CHECK-LABEL: define i32 @normal_caller_streaming_compatible_callee_inline
123 ; CHECK-SAME: () #[[ATTR1]] {
124 ; CHECK-NEXT:  entry:
125 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
126 ; CHECK-NEXT:    ret i32 [[RES_I]]
128 entry:
129   %res = call i32 @streaming_compatible_callee()
130   ret i32 %res
133 ; [ ] N  -> N
134 ; [ ] N  -> S
135 ; [ ] N  -> SC
136 ; [x] N  -> N + B
137 ; [ ] N  -> SC + B
138 define i32 @normal_caller_locally_streaming_callee_dont_inline() {
139 ; CHECK-LABEL: define i32 @normal_caller_locally_streaming_callee_dont_inline
140 ; CHECK-SAME: () #[[ATTR1]] {
141 ; CHECK-NEXT:  entry:
142 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @locally_streaming_callee()
143 ; CHECK-NEXT:    ret i32 [[RES]]
145 entry:
146   %res = call i32 @locally_streaming_callee()
147   ret i32 %res
150 ; [ ] N  -> N
151 ; [ ] N  -> S
152 ; [ ] N  -> SC
153 ; [ ] N  -> N + B
154 ; [x] N  -> SC + B
155 define i32 @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline() {
156 ; CHECK-LABEL: define i32 @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline
157 ; CHECK-SAME: () #[[ATTR1]] {
158 ; CHECK-NEXT:  entry:
159 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @streaming_compatible_locally_streaming_callee()
160 ; CHECK-NEXT:    ret i32 [[RES]]
162 entry:
163   %res = call i32 @streaming_compatible_locally_streaming_callee()
164   ret i32 %res
167 ; [x] S  -> N
168 ; [ ] S  -> S
169 ; [ ] S  -> SC
170 ; [ ] S  -> N + B
171 ; [ ] S  -> SC + B
172 define i32 @streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_enabled" {
173 ; CHECK-LABEL: define i32 @streaming_caller_normal_callee_dont_inline
174 ; CHECK-SAME: () #[[ATTR2]] {
175 ; CHECK-NEXT:  entry:
176 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @normal_callee()
177 ; CHECK-NEXT:    ret i32 [[RES]]
179 entry:
180   %res = call i32 @normal_callee()
181   ret i32 %res
184 ; [ ] S  -> N
185 ; [x] S  -> S
186 ; [ ] S  -> SC
187 ; [ ] S  -> N + B
188 ; [ ] S  -> SC + B
189 define i32 @streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
190 ; CHECK-LABEL: define i32 @streaming_caller_streaming_callee_inline
191 ; CHECK-SAME: () #[[ATTR2]] {
192 ; CHECK-NEXT:  entry:
193 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
194 ; CHECK-NEXT:    ret i32 [[RES_I]]
196 entry:
197   %res = call i32 @streaming_callee()
198   ret i32 %res
201 ; [ ] S  -> N
202 ; [ ] S  -> S
203 ; [x] S  -> SC
204 ; [ ] S  -> N + B
205 ; [ ] S  -> SC + B
206 define i32 @streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_enabled" {
207 ; CHECK-LABEL: define i32 @streaming_caller_streaming_compatible_callee_inline
208 ; CHECK-SAME: () #[[ATTR2]] {
209 ; CHECK-NEXT:  entry:
210 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
211 ; CHECK-NEXT:    ret i32 [[RES_I]]
213 entry:
214   %res = call i32 @streaming_compatible_callee()
215   ret i32 %res
218 ; [ ] S  -> N
219 ; [ ] S  -> S
220 ; [ ] S  -> SC
221 ; [x] S  -> N + B
222 ; [ ] S  -> SC + B
223 define i32 @streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
224 ; CHECK-LABEL: define i32 @streaming_caller_locally_streaming_callee_inline
225 ; CHECK-SAME: () #[[ATTR2]] {
226 ; CHECK-NEXT:  entry:
227 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
228 ; CHECK-NEXT:    ret i32 [[RES_I]]
230 entry:
231   %res = call i32 @locally_streaming_callee()
232   ret i32 %res
235 ; [ ] S  -> N
236 ; [ ] S  -> S
237 ; [ ] S  -> SC
238 ; [ ] S  -> N + B
239 ; [x] S  -> SC + B
240 define i32 @streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
241 ; CHECK-LABEL: define i32 @streaming_caller_streaming_compatible_locally_streaming_callee_inline
242 ; CHECK-SAME: () #[[ATTR2]] {
243 ; CHECK-NEXT:  entry:
244 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
245 ; CHECK-NEXT:    ret i32 [[RES_I]]
247 entry:
248   %res = call i32 @streaming_compatible_locally_streaming_callee()
249   ret i32 %res
252 ; [x] N + B -> N
253 ; [ ] N + B -> S
254 ; [ ] N + B -> SC
255 ; [ ] N + B -> N + B
256 ; [ ] N + B -> SC + B
257 define i32 @locally_streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_body" {
258 ; CHECK-LABEL: define i32 @locally_streaming_caller_normal_callee_dont_inline
259 ; CHECK-SAME: () #[[ATTR3]] {
260 ; CHECK-NEXT:  entry:
261 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @normal_callee()
262 ; CHECK-NEXT:    ret i32 [[RES]]
264 entry:
265   %res = call i32 @normal_callee()
266   ret i32 %res
269 ; [ ] N + B -> N
270 ; [x] N + B -> S
271 ; [ ] N + B -> SC
272 ; [ ] N + B -> N + B
273 ; [ ] N + B -> SC + B
274 define i32 @locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_body" {
275 ; CHECK-LABEL: define i32 @locally_streaming_caller_streaming_callee_inline
276 ; CHECK-SAME: () #[[ATTR3]] {
277 ; CHECK-NEXT:  entry:
278 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
279 ; CHECK-NEXT:    ret i32 [[RES_I]]
281 entry:
282   %res = call i32 @streaming_callee()
283   ret i32 %res
286 ; [ ] N + B -> N
287 ; [ ] N + B -> S
288 ; [x] N + B -> SC
289 ; [ ] N + B -> N + B
290 ; [ ] N + B -> SC + B
291 define i32 @locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_body" {
292 ; CHECK-LABEL: define i32 @locally_streaming_caller_streaming_compatible_callee_inline
293 ; CHECK-SAME: () #[[ATTR3]] {
294 ; CHECK-NEXT:  entry:
295 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
296 ; CHECK-NEXT:    ret i32 [[RES_I]]
298 entry:
299   %res = call i32 @streaming_compatible_callee()
300   ret i32 %res
303 ; [ ] N + B -> N
304 ; [ ] N + B -> S
305 ; [ ] N + B -> SC
306 ; [x] N + B -> N + B
307 ; [ ] N + B -> SC + B
308 define i32 @locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
309 ; CHECK-LABEL: define i32 @locally_streaming_caller_locally_streaming_callee_inline
310 ; CHECK-SAME: () #[[ATTR3]] {
311 ; CHECK-NEXT:  entry:
312 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
313 ; CHECK-NEXT:    ret i32 [[RES_I]]
315 entry:
316   %res = call i32 @locally_streaming_callee()
317   ret i32 %res
320 ; [ ] N + B -> N
321 ; [ ] N + B -> S
322 ; [ ] N + B -> SC
323 ; [ ] N + B -> N + B
324 ; [x] N + B -> SC + B
325 define i32 @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
326 ; CHECK-LABEL: define i32 @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline
327 ; CHECK-SAME: () #[[ATTR3]] {
328 ; CHECK-NEXT:  entry:
329 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
330 ; CHECK-NEXT:    ret i32 [[RES_I]]
332 entry:
333   %res = call i32 @streaming_compatible_locally_streaming_callee()
334   ret i32 %res
337 ; [x] SC -> N
338 ; [ ] SC -> S
339 ; [ ] SC -> SC
340 ; [ ] SC -> N + B
341 ; [ ] SC -> SC + B
342 define i32 @streaming_compatible_caller_normal_callee_dont_inline() "aarch64_pstate_sm_compatible" {
343 ; CHECK-LABEL: define i32 @streaming_compatible_caller_normal_callee_dont_inline
344 ; CHECK-SAME: () #[[ATTR0]] {
345 ; CHECK-NEXT:  entry:
346 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @normal_callee()
347 ; CHECK-NEXT:    ret i32 [[RES]]
349 entry:
350   %res = call i32 @normal_callee()
351   ret i32 %res
354 ; [ ] SC -> N
355 ; [x] SC -> S
356 ; [ ] SC -> SC
357 ; [ ] SC -> N + B
358 ; [ ] SC -> SC + B
359 define i32 @streaming_compatible_caller_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
360 ; CHECK-LABEL: define i32 @streaming_compatible_caller_streaming_callee_dont_inline
361 ; CHECK-SAME: () #[[ATTR0]] {
362 ; CHECK-NEXT:  entry:
363 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @streaming_callee()
364 ; CHECK-NEXT:    ret i32 [[RES]]
366 entry:
367   %res = call i32 @streaming_callee()
368   ret i32 %res
371 ; [ ] SC -> N
372 ; [ ] SC -> S
373 ; [x] SC -> SC
374 ; [ ] SC -> N + B
375 ; [ ] SC -> SC + B
376 define i32 @streaming_compatible_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" {
377 ; CHECK-LABEL: define i32 @streaming_compatible_caller_streaming_compatible_callee_inline
378 ; CHECK-SAME: () #[[ATTR0]] {
379 ; CHECK-NEXT:  entry:
380 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
381 ; CHECK-NEXT:    ret i32 [[RES_I]]
383 entry:
384   %res = call i32 @streaming_compatible_callee()
385   ret i32 %res
388 ; [ ] SC -> N
389 ; [ ] SC -> S
390 ; [ ] SC -> SC
391 ; [x] SC -> N + B
392 ; [ ] SC -> SC + B
393 define i32 @streaming_compatible_caller_locally_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
394 ; CHECK-LABEL: define i32 @streaming_compatible_caller_locally_streaming_callee_dont_inline
395 ; CHECK-SAME: () #[[ATTR0]] {
396 ; CHECK-NEXT:  entry:
397 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @locally_streaming_callee()
398 ; CHECK-NEXT:    ret i32 [[RES]]
400 entry:
401   %res = call i32 @locally_streaming_callee()
402   ret i32 %res
405 ; [ ] SC -> N
406 ; [ ] SC -> S
407 ; [ ] SC -> SC
408 ; [ ] SC -> N + B
409 ; [x] SC -> SC + B
410 define i32 @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
411 ; CHECK-LABEL: define i32 @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline
412 ; CHECK-SAME: () #[[ATTR0]] {
413 ; CHECK-NEXT:  entry:
414 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @streaming_compatible_locally_streaming_callee()
415 ; CHECK-NEXT:    ret i32 [[RES]]
417 entry:
418   %res = call i32 @streaming_compatible_locally_streaming_callee()
419   ret i32 %res
421 ; [x] SC + B -> N
422 ; [ ] SC + B -> S
423 ; [ ] SC + B -> SC
424 ; [ ] SC + B -> N + B
425 ; [ ] SC + B -> SC + B
426 define i32 @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
427 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline
428 ; CHECK-SAME: () #[[ATTR4]] {
429 ; CHECK-NEXT:  entry:
430 ; CHECK-NEXT:    [[RES:%.*]] = call i32 @normal_callee()
431 ; CHECK-NEXT:    ret i32 [[RES]]
433 entry:
434   %res = call i32 @normal_callee()
435   ret i32 %res
438 ; [ ] SC + B -> N
439 ; [x] SC + B -> S
440 ; [ ] SC + B -> SC
441 ; [ ] SC + B -> N + B
442 ; [ ] SC + B -> SC + B
443 define i32 @streaming_compatible_locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
444 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_caller_streaming_callee_inline
445 ; CHECK-SAME: () #[[ATTR4]] {
446 ; CHECK-NEXT:  entry:
447 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
448 ; CHECK-NEXT:    ret i32 [[RES_I]]
450 entry:
451   %res = call i32 @streaming_callee()
452   ret i32 %res
455 ; [ ] SC + B -> N
456 ; [ ] SC + B -> S
457 ; [x] SC + B -> SC
458 ; [ ] SC + B -> N + B
459 ; [ ] SC + B -> SC + B
460 define i32 @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
461 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline
462 ; CHECK-SAME: () #[[ATTR4]] {
463 ; CHECK-NEXT:  entry:
464 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
465 ; CHECK-NEXT:    ret i32 [[RES_I]]
467 entry:
468   %res = call i32 @streaming_compatible_callee()
469   ret i32 %res
472 ; [ ] SC + B -> N
473 ; [ ] SC + B -> S
474 ; [ ] SC + B -> SC
475 ; [x] SC + B -> N + B
476 ; [ ] SC + B -> SC + B
477 define i32 @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
478 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline
479 ; CHECK-SAME: () #[[ATTR4]] {
480 ; CHECK-NEXT:  entry:
481 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
482 ; CHECK-NEXT:    ret i32 [[RES_I]]
484 entry:
485   %res = call i32 @locally_streaming_callee()
486   ret i32 %res
489 ; [ ] SC + B -> N
490 ; [ ] SC + B -> S
491 ; [ ] SC + B -> SC
492 ; [ ] SC + B -> N + B
493 ; [x] SC + B -> SC + B
494 define i32 @streaming_compatible_locally_streaming_caller_and_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
495 ; CHECK-LABEL: define i32 @streaming_compatible_locally_streaming_caller_and_callee_inline
496 ; CHECK-SAME: () #[[ATTR4]] {
497 ; CHECK-NEXT:  entry:
498 ; CHECK-NEXT:    [[RES_I:%.*]] = call i32 @llvm.vscale.i32()
499 ; CHECK-NEXT:    ret i32 [[RES_I]]
501 entry:
502   %res = call i32 @streaming_compatible_locally_streaming_callee()
503   ret i32 %res
506 define void @normal_callee_with_inlineasm() {
507 ; CHECK-LABEL: define void @normal_callee_with_inlineasm
508 ; CHECK-SAME: () #[[ATTR1]] {
509 ; CHECK-NEXT:  entry:
510 ; CHECK-NEXT:    call void asm sideeffect "
511 ; CHECK-NEXT:    ret void
513 entry:
514   call void asm sideeffect "; inlineasm", ""()
515   ret void
518 define void @streaming_caller_normal_callee_with_inlineasm_dont_inline() "aarch64_pstate_sm_enabled" {
519 ; CHECK-LABEL: define void @streaming_caller_normal_callee_with_inlineasm_dont_inline
520 ; CHECK-SAME: () #[[ATTR2]] {
521 ; CHECK-NEXT:  entry:
522 ; CHECK-NEXT:    call void @normal_callee_with_inlineasm()
523 ; CHECK-NEXT:    ret void
525 entry:
526   call void @normal_callee_with_inlineasm()
527   ret void
530 define i64 @normal_callee_with_intrinsic_call() {
531 ; CHECK-LABEL: define i64 @normal_callee_with_intrinsic_call
532 ; CHECK-SAME: () #[[ATTR1]] {
533 ; CHECK-NEXT:  entry:
534 ; CHECK-NEXT:    [[RES:%.*]] = call i64 @llvm.aarch64.sve.cntb(i32 4)
535 ; CHECK-NEXT:    ret i64 [[RES]]
537 entry:
538   %res = call i64 @llvm.aarch64.sve.cntb(i32 4)
539   ret i64 %res
542 define i64 @streaming_caller_normal_callee_with_intrinsic_call_dont_inline() "aarch64_pstate_sm_enabled" {
543 ; CHECK-LABEL: define i64 @streaming_caller_normal_callee_with_intrinsic_call_dont_inline
544 ; CHECK-SAME: () #[[ATTR2]] {
545 ; CHECK-NEXT:  entry:
546 ; CHECK-NEXT:    [[RES:%.*]] = call i64 @normal_callee_with_intrinsic_call()
547 ; CHECK-NEXT:    ret i64 [[RES]]
549 entry:
550   %res = call i64 @normal_callee_with_intrinsic_call()
551   ret i64 %res
554 declare i64 @llvm.aarch64.sve.cntb(i32)
556 define i64 @normal_callee_call_sme_state() {
557 ; CHECK-LABEL: define i64 @normal_callee_call_sme_state
558 ; CHECK-SAME: () #[[ATTR1]] {
559 ; CHECK-NEXT:  entry:
560 ; CHECK-NEXT:    [[RES:%.*]] = call { i64, i64 } @__arm_sme_state()
561 ; CHECK-NEXT:    [[RES_0:%.*]] = extractvalue { i64, i64 } [[RES]], 0
562 ; CHECK-NEXT:    ret i64 [[RES_0]]
564 entry:
565   %res = call {i64, i64} @__arm_sme_state()
566   %res.0 = extractvalue {i64, i64} %res, 0
567   ret i64 %res.0
570 declare {i64, i64} @__arm_sme_state()
572 define i64 @streaming_caller_normal_callee_call_sme_state_dont_inline() "aarch64_pstate_sm_enabled" {
573 ; CHECK-LABEL: define i64 @streaming_caller_normal_callee_call_sme_state_dont_inline
574 ; CHECK-SAME: () #[[ATTR2]] {
575 ; CHECK-NEXT:  entry:
576 ; CHECK-NEXT:    [[RES:%.*]] = call i64 @normal_callee_call_sme_state()
577 ; CHECK-NEXT:    ret i64 [[RES]]
579 entry:
580   %res = call i64 @normal_callee_call_sme_state()
581   ret i64 %res
586 declare void @streaming_body() "aarch64_pstate_sm_enabled"
588 define void @streaming_caller_single_streaming_callee() "aarch64_pstate_sm_enabled" {
589 ; CHECK-LABEL: define void @streaming_caller_single_streaming_callee
590 ; CHECK-SAME: () #[[ATTR2]] {
591 ; CHECK-NEXT:    call void @streaming_body()
592 ; CHECK-NEXT:    ret void
594   call void @streaming_body()
595   ret void
598 define void @streaming_caller_multiple_streaming_callees() "aarch64_pstate_sm_enabled" {
599 ; CHECK-LABEL: define void @streaming_caller_multiple_streaming_callees
600 ; CHECK-SAME: () #[[ATTR2]] {
601 ; CHECK-NEXT:    call void @streaming_body()
602 ; CHECK-NEXT:    call void @streaming_body()
603 ; CHECK-NEXT:    ret void
605   call void @streaming_body()
606   call void @streaming_body()
607   ret void
610 ; Allow inlining, as inline it would not increase the number of streaming-mode changes.
611 define void @streaming_caller_single_streaming_callee_inline() {
612 ; CHECK-LABEL: define void @streaming_caller_single_streaming_callee_inline
613 ; CHECK-SAME: () #[[ATTR1]] {
614 ; CHECK-NEXT:    call void @streaming_body()
615 ; CHECK-NEXT:    ret void
617   call void @streaming_caller_single_streaming_callee()
618   ret void
621 ; Prevent inlining, as inline it would lead to multiple streaming-mode changes.
622 define void @streaming_caller_multiple_streaming_callees_dont_inline() {
623 ; CHECK-LABEL: define void @streaming_caller_multiple_streaming_callees_dont_inline
624 ; CHECK-SAME: () #[[ATTR1]] {
625 ; CHECK-NEXT:    call void @streaming_caller_multiple_streaming_callees()
626 ; CHECK-NEXT:    ret void
628   call void @streaming_caller_multiple_streaming_callees()
629   ret void
632 declare void @streaming_compatible_body() "aarch64_pstate_sm_compatible"
634 define void @streaming_caller_single_streaming_compatible_callee() "aarch64_pstate_sm_enabled" {
635 ; CHECK-LABEL: define void @streaming_caller_single_streaming_compatible_callee
636 ; CHECK-SAME: () #[[ATTR2]] {
637 ; CHECK-NEXT:    call void @streaming_compatible_body()
638 ; CHECK-NEXT:    ret void
640   call void @streaming_compatible_body()
641   ret void
644 define void @streaming_caller_multiple_streaming_compatible_callees() "aarch64_pstate_sm_enabled" {
645 ; CHECK-LABEL: define void @streaming_caller_multiple_streaming_compatible_callees
646 ; CHECK-SAME: () #[[ATTR2]] {
647 ; CHECK-NEXT:    call void @streaming_compatible_body()
648 ; CHECK-NEXT:    call void @streaming_compatible_body()
649 ; CHECK-NEXT:    ret void
651   call void @streaming_compatible_body()
652   call void @streaming_compatible_body()
653   ret void
656 ; Allow inlining, as inline would remove a streaming-mode change.
657 define void @streaming_caller_single_streaming_compatible_callee_inline() {
658 ; CHECK-LABEL: define void @streaming_caller_single_streaming_compatible_callee_inline
659 ; CHECK-SAME: () #[[ATTR1]] {
660 ; CHECK-NEXT:    call void @streaming_compatible_body()
661 ; CHECK-NEXT:    ret void
663   call void @streaming_caller_single_streaming_compatible_callee()
664   ret void
667 ; Allow inlining, as inline would remove several stremaing-mode changes.
668 define void @streaming_caller_multiple_streaming_compatible_callees_inline() {
669 ; CHECK-LABEL: define void @streaming_caller_multiple_streaming_compatible_callees_inline
670 ; CHECK-SAME: () #[[ATTR1]] {
671 ; CHECK-NEXT:    call void @streaming_compatible_body()
672 ; CHECK-NEXT:    call void @streaming_compatible_body()
673 ; CHECK-NEXT:    ret void
675   call void @streaming_caller_multiple_streaming_compatible_callees()
676   ret void