94 lines · c
1// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_FLATTEN -o - | FileCheck %s2// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_ALWAYS_INLINE_STMT -o - | FileCheck %s3 4// REQUIRES: aarch64-registered-target5 6extern void was_inlined(void);7 8#if defined(USE_FLATTEN)9 #define FN_ATTR __attribute__((flatten))10 #define STMT_ATTR11#elif defined(USE_ALWAYS_INLINE_STMT)12 #define FN_ATTR13 #define STMT_ATTR [[clang::always_inline]]14#else15 #error Expected USE_FLATTEN or USE_ALWAYS_INLINE_STMT to be defined.16#endif17 18void fn(void) { was_inlined(); }19void fn_streaming_compatible(void) __arm_streaming_compatible { was_inlined(); }20void 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 25FN_ATTR26void 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_inlined37// CHECK-NEXT: call void @was_inlined38// CHECK-NEXT: call void @fn_streaming39// CHECK-NEXT: call void @fn_locally_streaming40// CHECK-NEXT: call void @fn_streaming_new_za41// CHECK-NEXT: call void @fn_streaming_new_zt042 43FN_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 @fn54// CHECK-NEXT: call void @was_inlined55// CHECK-NEXT: call void @fn_streaming56// CHECK-NEXT: call void @fn_locally_streaming57// CHECK-NEXT: call void @fn_streaming_new_za58// CHECK-NEXT: call void @fn_streaming_new_zt059 60FN_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 @fn71// CHECK-NEXT: call void @was_inlined72// CHECK-NEXT: call void @was_inlined73// CHECK-NEXT: call void @was_inlined74// CHECK-NEXT: call void @fn_streaming_new_za75// CHECK-NEXT: call void @fn_streaming_new_zt076 77FN_ATTR __arm_locally_streaming78void 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 @fn89// CHECK-NEXT: call void @was_inlined90// CHECK-NEXT: call void @was_inlined91// CHECK-NEXT: call void @was_inlined92// CHECK-NEXT: call void @fn_streaming_new_za93// CHECK-NEXT: call void @fn_streaming_new_zt094