| //@ add-minicore |
| //@ compile-flags: --target aarch64-unknown-linux-gnu -Zinline-mir=no -C no-prepopulate-passes |
| //@ needs-llvm-components: aarch64 |
| |
| #![crate_type = "lib"] |
| #![feature(no_core, lang_items, target_feature_inline_always)] |
| #![no_core] |
| |
| extern crate minicore; |
| use minicore::*; |
| |
| #[inline(always)] |
| #[target_feature(enable = "neon")] |
| #[no_mangle] |
| pub fn single_target_feature() -> i32 { |
| 42 |
| } |
| |
| #[inline(always)] |
| #[target_feature(enable = "neon,i8mm")] |
| #[no_mangle] |
| // CHECK: define{{( noundef)?}} i32 @multiple_target_features() unnamed_addr #1 { |
| pub fn multiple_target_features() -> i32 { |
| // CHECK: %_0 = call{{( noundef)?}} i32 @single_target_feature() #3 |
| single_target_feature() |
| } |
| |
| #[no_mangle] |
| // CHECK: define{{( noundef)?}} i32 @inherits_from_global() unnamed_addr #2 { |
| pub fn inherits_from_global() -> i32 { |
| unsafe { |
| // CHECK: %_0 = call{{( noundef)?}} i32 @single_target_feature() #3 |
| single_target_feature() |
| } |
| } |
| |
| // Attribute #3 requires the alwaysinline attribute, the alwaysinline attribute is not emitted on a |
| // function definition when target features are present, rather it will be moved onto the function |
| // call, if the features match up. |
| // |
| // CHECK: attributes #3 = { alwaysinline nounwind } |