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