xref: /llvm-project/llvm/test/CodeGen/Thumb2/pacbti-m-basic.ll (revision dff114b3565e4c981fcb40f24f72a0cb426294fe)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc --force-dwarf-frame-section %s -o - | FileCheck %s
3; RUN: llc --filetype=obj %s -o - | llvm-readelf -s --unwind - | FileCheck %s --check-prefix=UNWIND
4target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
5target triple = "thumbv8m.main-none-none-eabi"
6
7; int g(int);
8;
9; #if __ARM_FEATURE_CMSE == 3
10; #define ENTRY __attribute__((cmse_nonsecure_entry))
11; #else
12; #define ENTRY
13; #endif
14;
15; ENTRY int f(int x) {
16;     return 1 + g(x - 1);
17; }
18
19define hidden i32 @f0(i32 %x) local_unnamed_addr "sign-return-address"="non-leaf" {
20; CHECK-LABEL: f0:
21; CHECK:         .cfi_sections .debug_frame
22; CHECK-NEXT:    .cfi_startproc
23; CHECK-NEXT:  @ %bb.0: @ %entry
24; CHECK-NEXT:    pac r12, lr, sp
25; CHECK-NEXT:    .save {r7, ra_auth_code, lr}
26; CHECK-NEXT:    push.w {r7, r12, lr}
27; CHECK-NEXT:    .cfi_def_cfa_offset 12
28; CHECK-NEXT:    .cfi_offset lr, -4
29; CHECK-NEXT:    .cfi_offset ra_auth_code, -8
30; CHECK-NEXT:    .cfi_offset r7, -12
31; CHECK-NEXT:    .pad #4
32; CHECK-NEXT:    sub sp, #4
33; CHECK-NEXT:    .cfi_def_cfa_offset 16
34; CHECK-NEXT:    subs r0, #1
35; CHECK-NEXT:    bl g
36; CHECK-NEXT:    adds r0, #1
37; CHECK-NEXT:    add sp, #4
38; CHECK-NEXT:    pop.w {r7, r12, lr}
39; CHECK-NEXT:    aut r12, lr, sp
40; CHECK-NEXT:    bx lr
41entry:
42  %sub = add nsw i32 %x, -1
43  %call = tail call i32 @g(i32 %sub)
44  %add = add nsw i32 %call, 1
45  ret i32 %add
46}
47
48define hidden i32 @f1(i32 %x) local_unnamed_addr #0 {
49; CHECK-LABEL: f1:
50; CHECK:         .cfi_startproc
51; CHECK-NEXT:  @ %bb.0: @ %entry
52; CHECK-NEXT:    pac r12, lr, sp
53; CHECK-NEXT:    vstr fpcxtns, [sp, #-4]!
54; CHECK-NEXT:    .cfi_def_cfa_offset 4
55; CHECK-NEXT:    .save {r7, ra_auth_code, lr}
56; CHECK-NEXT:    push.w {r7, r12, lr}
57; CHECK-NEXT:    .cfi_def_cfa_offset 16
58; CHECK-NEXT:    .cfi_offset lr, -8
59; CHECK-NEXT:    .cfi_offset ra_auth_code, -12
60; CHECK-NEXT:    .cfi_offset r7, -16
61; CHECK-NEXT:    subs r0, #1
62; CHECK-NEXT:    bl g
63; CHECK-NEXT:    adds r0, #1
64; CHECK-NEXT:    pop.w {r7, r12, lr}
65; CHECK-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
66; CHECK-NEXT:    vldr fpcxtns, [sp], #4
67; CHECK-NEXT:    aut r12, lr, sp
68; CHECK-NEXT:    clrm {r1, r2, r3, r12, apsr}
69; CHECK-NEXT:    bxns lr
70entry:
71  %sub = add nsw i32 %x, -1
72  %call = tail call i32 @g(i32 %sub)
73  %add = add nsw i32 %call, 1
74  ret i32 %add
75}
76
77define hidden i32 @f2(i32 %x) local_unnamed_addr #1 {
78; CHECK-LABEL: f2:
79; CHECK:         .cfi_startproc
80; CHECK-NEXT:  @ %bb.0: @ %entry
81; CHECK-NEXT:    pac r12, lr, sp
82; CHECK-NEXT:    .save {r7, ra_auth_code, lr}
83; CHECK-NEXT:    push.w {r7, r12, lr}
84; CHECK-NEXT:    .cfi_def_cfa_offset 12
85; CHECK-NEXT:    .cfi_offset lr, -4
86; CHECK-NEXT:    .cfi_offset ra_auth_code, -8
87; CHECK-NEXT:    .cfi_offset r7, -12
88; CHECK-NEXT:    .pad #4
89; CHECK-NEXT:    sub sp, #4
90; CHECK-NEXT:    .cfi_def_cfa_offset 16
91; CHECK-NEXT:    subs r0, #1
92; CHECK-NEXT:    bl g
93; CHECK-NEXT:    adds r0, #1
94; CHECK-NEXT:    add sp, #4
95; CHECK-NEXT:    pop.w {r7, r12, lr}
96; CHECK-NEXT:    aut r12, lr, sp
97; CHECK-NEXT:    mrs r12, control
98; CHECK-NEXT:    tst.w r12, #8
99; CHECK-NEXT:    beq .LBB2_2
100; CHECK-NEXT:  @ %bb.1: @ %entry
101; CHECK-NEXT:    vmrs r12, fpscr
102; CHECK-NEXT:    vmov d0, lr, lr
103; CHECK-NEXT:    vmov d1, lr, lr
104; CHECK-NEXT:    vmov d2, lr, lr
105; CHECK-NEXT:    vmov d3, lr, lr
106; CHECK-NEXT:    vmov d4, lr, lr
107; CHECK-NEXT:    vmov d5, lr, lr
108; CHECK-NEXT:    vmov d6, lr, lr
109; CHECK-NEXT:    vmov d7, lr, lr
110; CHECK-NEXT:    bic r12, r12, #159
111; CHECK-NEXT:    bic r12, r12, #4026531840
112; CHECK-NEXT:    vmsr fpscr, r12
113; CHECK-NEXT:  .LBB2_2: @ %entry
114; CHECK-NEXT:    mov r1, lr
115; CHECK-NEXT:    mov r2, lr
116; CHECK-NEXT:    mov r3, lr
117; CHECK-NEXT:    mov r12, lr
118; CHECK-NEXT:    msr apsr_nzcvq, lr
119; CHECK-NEXT:    bxns lr
120entry:
121  %sub = add nsw i32 %x, -1
122  %call = tail call i32 @g(i32 %sub)
123  %add = add nsw i32 %call, 1
124  ret i32 %add
125}
126
127declare dso_local i32 @g(i32) local_unnamed_addr
128
129attributes #0 = { "sign-return-address"="non-leaf" "cmse_nonsecure_entry" "target-features"="+8msecext,+armv8.1-m.main"}
130attributes #1 = { "sign-return-address"="non-leaf" "cmse_nonsecure_entry" "target-features"="+8msecext,+armv8-m.main,+fp-armv8d16"}
131
132!llvm.module.flags = !{!0, !1, !2}
133
134!0 = !{i32 8, !"branch-target-enforcement", i32 0}
135!1 = !{i32 8, !"sign-return-address", i32 1}
136!2 = !{i32 8, !"sign-return-address-all", i32 0}
137
138; UNWIND-LABEL: FunctionAddress: 0x0
139; UNWIND:       0x00      ; vsp = vsp + 4
140; UNWIND-NEXT:  0x80 0x08 ; pop {r7}
141; UNWIND-NEXT:  0xB4      ; pop ra_auth_code
142; UNWIND-NEXT:  0x84 0x00 ; pop {lr}
143
144
145; UNWIND-LABEL: FunctionAddress: 0x1E
146; UNWIND:       0x80 0x08 ; pop {r7}
147; UNWIND-NEXT:  0xB4      ; pop ra_auth_code
148; UNWIND-NEXT:  0x84 0x00 ; pop {lr}
149
150; UNWIND-LABEL: FunctionAddress: 0x48
151; UNWIND:       0x00      ; vsp = vsp + 4
152; UNWIND-NEXT:  0x80 0x08 ; pop {r7}
153; UNWIND-NEXT:  0xB4      ; pop ra_auth_code
154; UNWIND-NEXT:  0x84 0x00 ; pop {lr}
155
156; UNWIND-LABEL: 00000001 {{.*}} f0
157; UNWIND-LABEL: 0000001f {{.*}} f1
158; UNWIND-LABEL: 00000049 {{.*}} f2
159