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