xref: /llvm-project/clang/test/CodeGen/AArch64/sme-inline-callees-streaming-attrs.c (revision d8d4c187619098ee7b0497b4f40311e3ee1f9259)
1 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_FLATTEN -o - | FileCheck %s
2 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_ALWAYS_INLINE_STMT -o - | FileCheck %s
3 
4 // REQUIRES: aarch64-registered-target
5 
6 extern void was_inlined(void);
7 
8 #if defined(USE_FLATTEN)
9     #define FN_ATTR __attribute__((flatten))
10     #define STMT_ATTR
11 #elif defined(USE_ALWAYS_INLINE_STMT)
12     #define FN_ATTR
13     #define STMT_ATTR [[clang::always_inline]]
14 #else
15     #error Expected USE_FLATTEN or USE_ALWAYS_INLINE_STMT to be defined.
16 #endif
17 
18 void fn(void) { was_inlined(); }
19 void fn_streaming_compatible(void) __arm_streaming_compatible { was_inlined(); }
20 void fn_streaming(void) __arm_streaming { was_inlined(); }
21 __arm_locally_streaming void fn_locally_streaming(void) { was_inlined(); }
22 __arm_new("za") void fn_streaming_new_za(void) __arm_streaming { was_inlined(); }
23 __arm_new("zt0") void fn_streaming_new_zt0(void) __arm_streaming { was_inlined(); }
24 
25 FN_ATTR
26 void caller(void) {
27     STMT_ATTR fn();
28     STMT_ATTR fn_streaming_compatible();
29     STMT_ATTR fn_streaming();
30     STMT_ATTR fn_locally_streaming();
31     STMT_ATTR fn_streaming_new_za();
32     STMT_ATTR fn_streaming_new_zt0();
33 }
34 // CHECK-LABEL: void @caller()
35 //  CHECK-NEXT: entry:
36 //  CHECK-NEXT:   call void @was_inlined
37 //  CHECK-NEXT:   call void @was_inlined
38 //  CHECK-NEXT:   call void @fn_streaming
39 //  CHECK-NEXT:   call void @fn_locally_streaming
40 //  CHECK-NEXT:   call void @fn_streaming_new_za
41 //  CHECK-NEXT:   call void @fn_streaming_new_zt0
42 
43 FN_ATTR void caller_streaming_compatible(void) __arm_streaming_compatible {
44     STMT_ATTR fn();
45     STMT_ATTR fn_streaming_compatible();
46     STMT_ATTR fn_streaming();
47     STMT_ATTR fn_locally_streaming();
48     STMT_ATTR fn_streaming_new_za();
49     STMT_ATTR fn_streaming_new_zt0();
50 }
51 // CHECK-LABEL: void @caller_streaming_compatible()
52 //  CHECK-NEXT: entry:
53 //  CHECK-NEXT:   call void @fn
54 //  CHECK-NEXT:   call void @was_inlined
55 //  CHECK-NEXT:   call void @fn_streaming
56 //  CHECK-NEXT:   call void @fn_locally_streaming
57 //  CHECK-NEXT:   call void @fn_streaming_new_za
58 //  CHECK-NEXT:   call void @fn_streaming_new_zt0
59 
60 FN_ATTR void caller_streaming(void) __arm_streaming {
61     STMT_ATTR fn();
62     STMT_ATTR fn_streaming_compatible();
63     STMT_ATTR fn_streaming();
64     STMT_ATTR fn_locally_streaming();
65     STMT_ATTR fn_streaming_new_za();
66     STMT_ATTR fn_streaming_new_zt0();
67 }
68 // CHECK-LABEL: void @caller_streaming()
69 //  CHECK-NEXT: entry:
70 //  CHECK-NEXT:   call void @fn
71 //  CHECK-NEXT:   call void @was_inlined
72 //  CHECK-NEXT:   call void @was_inlined
73 //  CHECK-NEXT:   call void @was_inlined
74 //  CHECK-NEXT:   call void @fn_streaming_new_za
75 //  CHECK-NEXT:   call void @fn_streaming_new_zt0
76 
77 FN_ATTR __arm_locally_streaming
78 void caller_locally_streaming(void) {
79     STMT_ATTR fn();
80     STMT_ATTR fn_streaming_compatible();
81     STMT_ATTR fn_streaming();
82     STMT_ATTR fn_locally_streaming();
83     STMT_ATTR fn_streaming_new_za();
84     STMT_ATTR fn_streaming_new_zt0();
85 }
86 // CHECK-LABEL: void @caller_locally_streaming()
87 //  CHECK-NEXT: entry:
88 //  CHECK-NEXT:   call void @fn
89 //  CHECK-NEXT:   call void @was_inlined
90 //  CHECK-NEXT:   call void @was_inlined
91 //  CHECK-NEXT:   call void @was_inlined
92 //  CHECK-NEXT:   call void @fn_streaming_new_za
93 //  CHECK-NEXT:   call void @fn_streaming_new_zt0
94