| // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_FLATTEN -o - | FileCheck %s |
| // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -target-feature +sme -target-feature +sme2 %s -DUSE_ALWAYS_INLINE_STMT -o - | FileCheck %s |
| |
| // REQUIRES: aarch64-registered-target |
| |
| extern void was_inlined(void); |
| |
| #if defined(USE_FLATTEN) |
| #define FN_ATTR __attribute__((flatten)) |
| #define STMT_ATTR |
| #elif defined(USE_ALWAYS_INLINE_STMT) |
| #define FN_ATTR |
| #define STMT_ATTR [[clang::always_inline]] |
| #else |
| #error Expected USE_FLATTEN or USE_ALWAYS_INLINE_STMT to be defined. |
| #endif |
| |
| void fn(void) { was_inlined(); } |
| void fn_streaming_compatible(void) __arm_streaming_compatible { was_inlined(); } |
| void fn_streaming(void) __arm_streaming { was_inlined(); } |
| __arm_locally_streaming void fn_locally_streaming(void) { was_inlined(); } |
| __arm_new("za") void fn_streaming_new_za(void) __arm_streaming { was_inlined(); } |
| __arm_new("zt0") void fn_streaming_new_zt0(void) __arm_streaming { was_inlined(); } |
| |
| FN_ATTR |
| void caller(void) { |
| STMT_ATTR fn(); |
| STMT_ATTR fn_streaming_compatible(); |
| STMT_ATTR fn_streaming(); |
| STMT_ATTR fn_locally_streaming(); |
| STMT_ATTR fn_streaming_new_za(); |
| STMT_ATTR fn_streaming_new_zt0(); |
| } |
| // CHECK-LABEL: void @caller() |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @fn_streaming |
| // CHECK-NEXT: call void @fn_locally_streaming |
| // CHECK-NEXT: call void @fn_streaming_new_za |
| // CHECK-NEXT: call void @fn_streaming_new_zt0 |
| |
| FN_ATTR void caller_streaming_compatible(void) __arm_streaming_compatible { |
| STMT_ATTR fn(); |
| STMT_ATTR fn_streaming_compatible(); |
| STMT_ATTR fn_streaming(); |
| STMT_ATTR fn_locally_streaming(); |
| STMT_ATTR fn_streaming_new_za(); |
| STMT_ATTR fn_streaming_new_zt0(); |
| } |
| // CHECK-LABEL: void @caller_streaming_compatible() |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: call void @fn |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @fn_streaming |
| // CHECK-NEXT: call void @fn_locally_streaming |
| // CHECK-NEXT: call void @fn_streaming_new_za |
| // CHECK-NEXT: call void @fn_streaming_new_zt0 |
| |
| FN_ATTR void caller_streaming(void) __arm_streaming { |
| STMT_ATTR fn(); |
| STMT_ATTR fn_streaming_compatible(); |
| STMT_ATTR fn_streaming(); |
| STMT_ATTR fn_locally_streaming(); |
| STMT_ATTR fn_streaming_new_za(); |
| STMT_ATTR fn_streaming_new_zt0(); |
| } |
| // CHECK-LABEL: void @caller_streaming() |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: call void @fn |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @fn_streaming_new_za |
| // CHECK-NEXT: call void @fn_streaming_new_zt0 |
| |
| FN_ATTR __arm_locally_streaming |
| void caller_locally_streaming(void) { |
| STMT_ATTR fn(); |
| STMT_ATTR fn_streaming_compatible(); |
| STMT_ATTR fn_streaming(); |
| STMT_ATTR fn_locally_streaming(); |
| STMT_ATTR fn_streaming_new_za(); |
| STMT_ATTR fn_streaming_new_zt0(); |
| } |
| // CHECK-LABEL: void @caller_locally_streaming() |
| // CHECK-NEXT: entry: |
| // CHECK-NEXT: call void @fn |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @was_inlined |
| // CHECK-NEXT: call void @fn_streaming_new_za |
| // CHECK-NEXT: call void @fn_streaming_new_zt0 |