1; RUN: llc -mtriple=aarch64 %s -o - | FileCheck --check-prefixes=CHECK %s
2
3define void @f0() "patchable-function-entry"="0" "branch-target-enforcement" {
4; CHECK-LABEL: f0:
5; CHECK-NEXT: .Lfunc_begin0:
6; CHECK:      // %bb.0:
7; CHECK-NEXT:  hint #34
8; CHECK-NEXT:  ret
9; CHECK-NOT:  .section __patchable_function_entries
10  ret void
11}
12
13;; -fpatchable-function-entry=1 -mbranch-protection=bti
14;; For M=0, place the label .Lpatch0 after the initial BTI.
15define void @f1() "patchable-function-entry"="1" "branch-target-enforcement" {
16; CHECK-LABEL: f1:
17; CHECK-NEXT: .Lfunc_begin1:
18; CHECK:      // %bb.0:
19; CHECK-NEXT:  hint #34
20; CHECK-NEXT: .Lpatch0:
21; CHECK-NEXT:  nop
22; CHECK-NEXT:  ret
23; CHECK:      .section __patchable_function_entries,"awo",@progbits,f1,unique,0
24; CHECK-NEXT: .p2align 3
25; CHECK-NEXT: .xword .Lpatch0
26  ret void
27}
28
29;; -fpatchable-function-entry=2,1 -mbranch-protection=bti
30define void @f2_1() "patchable-function-entry"="1" "patchable-function-prefix"="1" "branch-target-enforcement" {
31; CHECK-LABEL: .type f2_1,@function
32; CHECK-NEXT: .Ltmp0:
33; CHECK-NEXT:  nop
34; CHECK-NEXT: f2_1:
35; CHECK-NEXT: .Lfunc_begin2:
36; CHECK:      // %bb.0:
37; CHECK-NEXT:  hint #34
38; CHECK-NEXT:  nop
39; CHECK-NEXT:  ret
40; CHECK:      .Lfunc_end2:
41; CHECK-NEXT: .size f2_1, .Lfunc_end2-f2_1
42; CHECK:      .section __patchable_function_entries,"awo",@progbits,f1,unique,0
43; CHECK-NEXT: .p2align 3
44; CHECK-NEXT: .xword .Ltmp0
45  ret void
46}
47
48;; -fpatchable-function-entry=1 -mbranch-protection=bti
49;; For M=0, don't create .Lpatch0 if the initial instruction is not BTI,
50;; even if other basic blocks may have BTI.
51define internal void @f1i(i64 %v) "patchable-function-entry"="1" "branch-target-enforcement" {
52; CHECK-LABEL: f1i:
53; CHECK-NEXT: .Lfunc_begin3:
54; CHECK:      // %bb.0:
55; CHECK-NEXT:  nop
56;; Other basic blocks have BTI, but they don't affect our decision to not create .Lpatch0
57; CHECK:      .LBB{{.+}} // %sw.bb1
58; CHECK-NEXT:  hint #36
59; CHECK:      .section __patchable_function_entries,"awo",@progbits,f1,unique,0
60; CHECK-NEXT: .p2align 3
61; CHECK-NEXT: .xword .Lfunc_begin3
62entry:
63  switch i64 %v, label %sw.bb0 [
64    i64 1, label %sw.bb1
65    i64 2, label %sw.bb2
66    i64 3, label %sw.bb3
67    i64 4, label %sw.bb4
68  ]
69sw.bb0:
70  call void asm sideeffect "", ""()
71  ret void
72sw.bb1:
73  call void asm sideeffect "", ""()
74  ret void
75sw.bb2:
76  call void asm sideeffect "", ""()
77  ret void
78sw.bb3:
79  call void asm sideeffect "", ""()
80  ret void
81sw.bb4:
82  call void asm sideeffect "", ""()
83  ret void
84}
85