1 ; RUN: opt < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+sme -S -passes=inline | FileCheck %s
3 declare void @inlined_body() "aarch64_pstate_sm_compatible";
6 ; Define some functions that will be called by the functions below.
7 ; These just call a '...body()' function. If we see the call to one of
8 ; these functions being replaced by '...body()', then we know it has been
12 define void @normal_callee() {
14 call void @inlined_body()
18 define void @streaming_callee() "aarch64_pstate_sm_enabled" {
20 call void @inlined_body()
24 define void @locally_streaming_callee() "aarch64_pstate_sm_body" {
26 call void @inlined_body()
30 define void @streaming_compatible_callee() "aarch64_pstate_sm_compatible" {
32 call void @inlined_body()
36 define void @streaming_compatible_locally_streaming_callee() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
38 call void @inlined_body()
43 ; Now test that inlining only happens when their streaming modes match.
44 ; Test for a number of combinations, where:
45 ; N Normal-interface (PSTATE.SM=0 on entry/exit)
46 ; S Streaming-interface (PSTATE.SM=1 on entry/exit)
47 ; SC Streaming-compatible interface
48 ; (PSTATE.SM=0 or 1, unchanged on exit)
49 ; N + B Normal-interface, streaming body
50 ; (PSTATE.SM=0 on entry/exit, but 1 within the body of the function)
51 ; SC + B Streaming-compatible-interface, streaming body
52 ; (PSTATE.SM=0 or 1 on entry, unchanged on exit,
53 ; but guaranteed to be 1 within the body of the function)
60 define void @normal_caller_normal_callee_inline() {
61 ; CHECK-LABEL: @normal_caller_normal_callee_inline(
62 ; CHECK: call void @inlined_body()
64 call void @normal_callee()
73 define void @normal_caller_streaming_callee_dont_inline() {
74 ; CHECK-LABEL: @normal_caller_streaming_callee_dont_inline(
75 ; CHECK: call void @streaming_callee()
77 call void @streaming_callee()
86 define void @normal_caller_streaming_compatible_callee_inline() {
87 ; CHECK-LABEL: @normal_caller_streaming_compatible_callee_inline(
88 ; CHECK: call void @inlined_body()
90 call void @streaming_compatible_callee()
99 define void @normal_caller_locally_streaming_callee_dont_inline() {
100 ; CHECK-LABEL: @normal_caller_locally_streaming_callee_dont_inline(
101 ; CHECK: call void @locally_streaming_callee()
103 call void @locally_streaming_callee()
112 define void @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline() {
113 ; CHECK-LABEL: @normal_caller_streaming_compatible_locally_streaming_callee_dont_inline(
114 ; CHECK: call void @streaming_compatible_locally_streaming_callee()
116 call void @streaming_compatible_locally_streaming_callee()
125 define void @streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_enabled" {
126 ; CHECK-LABEL: @streaming_caller_normal_callee_dont_inline(
127 ; CHECK: call void @normal_callee()
129 call void @normal_callee()
138 define void @streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
139 ; CHECK-LABEL: @streaming_caller_streaming_callee_inline(
140 ; CHECK: call void @inlined_body()
142 call void @streaming_callee()
151 define void @streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_enabled" {
152 ; CHECK-LABEL: @streaming_caller_streaming_compatible_callee_inline(
153 ; CHECK: call void @inlined_body()
155 call void @streaming_compatible_callee()
164 define void @streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
165 ; CHECK-LABEL: @streaming_caller_locally_streaming_callee_inline(
166 ; CHECK: call void @inlined_body()
168 call void @locally_streaming_callee()
177 define void @streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_enabled" {
178 ; CHECK-LABEL: @streaming_caller_streaming_compatible_locally_streaming_callee_inline(
179 ; CHECK: call void @inlined_body()
181 call void @streaming_compatible_locally_streaming_callee()
189 ; [ ] N + B -> SC + B
190 define void @locally_streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_body" {
191 ; CHECK-LABEL: @locally_streaming_caller_normal_callee_dont_inline(
192 ; CHECK: call void @normal_callee()
194 call void @normal_callee()
202 ; [ ] N + B -> SC + B
203 define void @locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_body" {
204 ; CHECK-LABEL: @locally_streaming_caller_streaming_callee_inline(
205 ; CHECK: call void @inlined_body()
207 call void @streaming_callee()
215 ; [ ] N + B -> SC + B
216 define void @locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_body" {
217 ; CHECK-LABEL: @locally_streaming_caller_streaming_compatible_callee_inline(
218 ; CHECK: call void @inlined_body()
220 call void @streaming_compatible_callee()
228 ; [ ] N + B -> SC + B
229 define void @locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
230 ; CHECK-LABEL: @locally_streaming_caller_locally_streaming_callee_inline(
231 ; CHECK: call void @inlined_body()
233 call void @locally_streaming_callee()
241 ; [x] N + B -> SC + B
242 define void @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline() "aarch64_pstate_sm_body" {
243 ; CHECK-LABEL: @locally_streaming_caller_streaming_compatible_locally_streaming_callee_inline(
244 ; CHECK: call void @inlined_body()
246 call void @streaming_compatible_locally_streaming_callee()
255 define void @streaming_compatible_caller_normal_callee_dont_inline() "aarch64_pstate_sm_compatible" {
256 ; CHECK-LABEL: @streaming_compatible_caller_normal_callee_dont_inline(
257 ; CHECK: call void @normal_callee()
259 call void @normal_callee()
268 define void @streaming_compatible_caller_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
269 ; CHECK-LABEL: @streaming_compatible_caller_streaming_callee_dont_inline(
270 ; CHECK: call void @streaming_callee()
272 call void @streaming_callee()
281 define void @streaming_compatible_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" {
282 ; CHECK-LABEL: @streaming_compatible_caller_streaming_compatible_callee_inline(
283 ; CHECK: call void @inlined_body()
285 call void @streaming_compatible_callee()
294 define void @streaming_compatible_caller_locally_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
295 ; CHECK-LABEL: @streaming_compatible_caller_locally_streaming_callee_dont_inline(
296 ; CHECK: call void @locally_streaming_callee()
298 call void @locally_streaming_callee()
307 define void @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline() "aarch64_pstate_sm_compatible" {
308 ; CHECK-LABEL: @streaming_compatible_caller_streaming_compatible_locally_streaming_callee_dont_inline(
309 ; CHECK: call void @streaming_compatible_locally_streaming_callee()
311 call void @streaming_compatible_locally_streaming_callee()
317 ; [ ] SC + B -> N + B
318 ; [ ] SC + B -> SC + B
319 define void @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
320 ; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_normal_callee_dont_inline(
321 ; CHECK: call void @normal_callee()
323 call void @normal_callee()
330 ; [ ] SC + B -> N + B
331 ; [ ] SC + B -> SC + B
332 define void @streaming_compatible_locally_streaming_caller_streaming_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
333 ; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_streaming_callee_inline(
334 ; CHECK: call void @inlined_body()
336 call void @streaming_callee()
343 ; [ ] SC + B -> N + B
344 ; [ ] SC + B -> SC + B
345 define void @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
346 ; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_streaming_compatible_callee_inline(
347 ; CHECK: call void @inlined_body()
349 call void @streaming_compatible_callee()
356 ; [x] SC + B -> N + B
357 ; [ ] SC + B -> SC + B
358 define void @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
359 ; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_locally_streaming_callee_inline(
360 ; CHECK: call void @inlined_body()
362 call void @locally_streaming_callee()
369 ; [ ] SC + B -> N + B
370 ; [x] SC + B -> SC + B
371 define void @streaming_compatible_locally_streaming_caller_and_callee_inline() "aarch64_pstate_sm_compatible" "aarch64_pstate_sm_body" {
372 ; CHECK-LABEL: @streaming_compatible_locally_streaming_caller_and_callee_inline(
373 ; CHECK: call void @inlined_body()
375 call void @streaming_compatible_locally_streaming_callee()