1; RUN: llc -verify-machineinstrs -enable-machine-outliner -mtriple \ 2; RUN: aarch64-arm-linux-gnu %s -o - | FileCheck %s 3 4; Check that functions that should sign their return addresses don't get 5; outlined if not all of the function either support v8.3a features or all of 6; the functions don't!! 7 8define void @a() #0 { 9; CHECK-LABEL: a: // @a 10; CHECK: // %bb.0: 11; CHECK-NEXT: .cfi_b_key_frame 12; CHECK-NEXT: pacibsp 13; CHECK-NEXT: .cfi_negate_ra_state 14; CHECK-NOT: OUTLINED_FUNCTION_ 15 %1 = alloca i32, align 4 16 %2 = alloca i32, align 4 17 %3 = alloca i32, align 4 18 %4 = alloca i32, align 4 19 %5 = alloca i32, align 4 20 %6 = alloca i32, align 4 21 store i32 1, i32* %1, align 4 22 store i32 2, i32* %2, align 4 23 store i32 3, i32* %3, align 4 24 store i32 4, i32* %4, align 4 25 store i32 5, i32* %5, align 4 26 store i32 6, i32* %6, align 4 27; CHECK: retab 28; CHECK-NOT: auti[a,b]sp 29 ret void 30} 31 32define void @b() #0 { 33; CHECK-LABEL: b: // @b 34; CHECK: // %bb.0: 35; CHECK-NEXT: .cfi_b_key_frame 36; CHECK-NEXT: pacibsp 37; CHECK-NEXT: .cfi_negate_ra_state 38; CHECK-NOT: OUTLINED_FUNCTION_ 39 %1 = alloca i32, align 4 40 %2 = alloca i32, align 4 41 %3 = alloca i32, align 4 42 %4 = alloca i32, align 4 43 %5 = alloca i32, align 4 44 %6 = alloca i32, align 4 45 store i32 1, i32* %1, align 4 46 store i32 2, i32* %2, align 4 47 store i32 3, i32* %3, align 4 48 store i32 4, i32* %4, align 4 49 store i32 5, i32* %5, align 4 50 store i32 6, i32* %6, align 4 51; CHECK: retab 52; CHECK-NOT: auti[a,b]sp 53 ret void 54} 55 56define void @c() #1 { 57; CHECK-LABEL: c: // @c 58; CHECK: // %bb.0: 59; CHECK-NEXT: .cfi_b_key_frame 60; CHECK-NEXT: hint #27 61; CHECK-NEXT: .cfi_negate_ra_state 62; CHECK-NOT: OUTLINED_FUNCTION_ 63 %1 = alloca i32, align 4 64 %2 = alloca i32, align 4 65 %3 = alloca i32, align 4 66 %4 = alloca i32, align 4 67 %5 = alloca i32, align 4 68 %6 = alloca i32, align 4 69 store i32 1, i32* %1, align 4 70 store i32 2, i32* %2, align 4 71 store i32 3, i32* %3, align 4 72 store i32 4, i32* %4, align 4 73 store i32 5, i32* %5, align 4 74 store i32 6, i32* %6, align 4 75; CHECK: hint #31 76; CHECK-NOT: ret{{[a,b]}} 77 ret void 78} 79 80attributes #0 = { "sign-return-address"="all" 81 "sign-return-address-key"="b_key" 82 "target-features"="+v8.3a" } 83 84attributes #1 = { "sign-return-address"="all" 85 "sign-return-address-key"="b_key" } 86 87; CHECK-NOT: OUTLINED_FUNCTION_ 88