Skip to content

Commit c4812b5

Browse files
committed
[ARM] Pre-commit test showing frame pointer bug
1 parent 3ed954d commit c4812b5

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=thumbv8.1m.main-none-eabi < %s --force-dwarf-frame-section -frame-pointer=all -mattr=+aapcs-frame-chain | FileCheck %s
3+
4+
; int test1() {
5+
; return 0;
6+
; }
7+
; Here, r11 is used as the frame pointer before it is pushed to the stack, so
8+
; it's value isn't preserved.
9+
define i32 @test1() "sign-return-address"="non-leaf" {
10+
; CHECK-LABEL: test1:
11+
; CHECK: .cfi_sections .debug_frame
12+
; CHECK-NEXT: .cfi_startproc
13+
; CHECK-NEXT: @ %bb.0: @ %entry
14+
; CHECK-NEXT: pac r12, lr, sp
15+
; CHECK-NEXT: .save {r11, ra_auth_code, lr}
16+
; CHECK-NEXT: push.w {r11, r12, lr}
17+
; CHECK-NEXT: .cfi_def_cfa_offset 12
18+
; CHECK-NEXT: .cfi_offset lr, -4
19+
; CHECK-NEXT: .cfi_offset ra_auth_code, -8
20+
; CHECK-NEXT: .cfi_offset r11, -12
21+
; CHECK-NEXT: .setfp r11, sp
22+
; CHECK-NEXT: mov r11, sp
23+
; CHECK-NEXT: .cfi_def_cfa_register r11
24+
; CHECK-NEXT: movs r0, #0
25+
; CHECK-NEXT: pop.w {r11, r12, lr}
26+
; CHECK-NEXT: aut r12, lr, sp
27+
; CHECK-NEXT: bx lr
28+
entry:
29+
ret i32 0
30+
}
31+
32+
; void foo(int n) {
33+
; int a[n];
34+
; bar(a);
35+
; }
36+
define dso_local void @test2(i32 noundef %n) "sign-return-address"="non-leaf" {
37+
; CHECK-LABEL: test2:
38+
; CHECK: .cfi_startproc
39+
; CHECK-NEXT: @ %bb.0: @ %entry
40+
; CHECK-NEXT: pac r12, lr, sp
41+
; CHECK-NEXT: .save {r4, r7, r11, ra_auth_code, lr}
42+
; CHECK-NEXT: push.w {r4, r7, r11, r12, lr}
43+
; CHECK-NEXT: .cfi_def_cfa_offset 20
44+
; CHECK-NEXT: .cfi_offset lr, -4
45+
; CHECK-NEXT: .cfi_offset ra_auth_code, -8
46+
; CHECK-NEXT: .cfi_offset r11, -12
47+
; CHECK-NEXT: .cfi_offset r7, -16
48+
; CHECK-NEXT: .cfi_offset r4, -20
49+
; CHECK-NEXT: .setfp r11, sp, #8
50+
; CHECK-NEXT: add.w r11, sp, #8
51+
; CHECK-NEXT: .cfi_def_cfa r11, 12
52+
; CHECK-NEXT: .pad #4
53+
; CHECK-NEXT: sub sp, #4
54+
; CHECK-NEXT: movs r1, #7
55+
; CHECK-NEXT: add.w r0, r1, r0, lsl #2
56+
; CHECK-NEXT: bic r0, r0, #7
57+
; CHECK-NEXT: sub.w r0, sp, r0
58+
; CHECK-NEXT: mov sp, r0
59+
; CHECK-NEXT: bl take_ptr
60+
; CHECK-NEXT: sub.w r4, r11, #8
61+
; CHECK-NEXT: mov sp, r4
62+
; CHECK-NEXT: pop.w {r4, r7, r11, r12, lr}
63+
; CHECK-NEXT: aut r12, lr, sp
64+
; CHECK-NEXT: bx lr
65+
entry:
66+
%vla = alloca i32, i32 %n, align 4
67+
call void @take_ptr(ptr noundef nonnull %vla)
68+
ret void
69+
}
70+
71+
; void test3(int c, float e, int z) {
72+
; if (c)
73+
; knr();
74+
; take_ptr(alloca(z));
75+
; if (e)
76+
; knr();
77+
; }
78+
define void @test3(i32 noundef %c, float noundef %e, i32 noundef %z) "sign-return-address"="non-leaf" {
79+
; CHECK-LABEL: test3:
80+
; CHECK: .cfi_startproc
81+
; CHECK-NEXT: @ %bb.0: @ %entry
82+
; CHECK-NEXT: pac r12, lr, sp
83+
; CHECK-NEXT: .save {r4, r5, r6, r7, r11, ra_auth_code, lr}
84+
; CHECK-NEXT: push.w {r4, r5, r6, r7, r11, r12, lr}
85+
; CHECK-NEXT: .cfi_def_cfa_offset 28
86+
; CHECK-NEXT: .cfi_offset lr, -4
87+
; CHECK-NEXT: .cfi_offset ra_auth_code, -8
88+
; CHECK-NEXT: .cfi_offset r11, -12
89+
; CHECK-NEXT: .cfi_offset r7, -16
90+
; CHECK-NEXT: .cfi_offset r6, -20
91+
; CHECK-NEXT: .cfi_offset r5, -24
92+
; CHECK-NEXT: .cfi_offset r4, -28
93+
; CHECK-NEXT: .setfp r11, sp, #16
94+
; CHECK-NEXT: add.w r11, sp, #16
95+
; CHECK-NEXT: .cfi_def_cfa r11, 12
96+
; CHECK-NEXT: .pad #4
97+
; CHECK-NEXT: sub sp, #4
98+
; CHECK-NEXT: cmp r0, #0
99+
; CHECK-NEXT: mov r5, r2
100+
; CHECK-NEXT: mov r4, r1
101+
; CHECK-NEXT: it ne
102+
; CHECK-NEXT: blne knr
103+
; CHECK-NEXT: adds r0, r5, #7
104+
; CHECK-NEXT: bic r0, r0, #7
105+
; CHECK-NEXT: sub.w r0, sp, r0
106+
; CHECK-NEXT: mov sp, r0
107+
; CHECK-NEXT: bl take_ptr
108+
; CHECK-NEXT: mov r0, r4
109+
; CHECK-NEXT: movs r1, #0
110+
; CHECK-NEXT: bl __aeabi_fcmpeq
111+
; CHECK-NEXT: cmp r0, #0
112+
; CHECK-NEXT: it eq
113+
; CHECK-NEXT: bleq knr
114+
; CHECK-NEXT: sub.w r4, r11, #16
115+
; CHECK-NEXT: mov sp, r4
116+
; CHECK-NEXT: pop.w {r4, r5, r6, r7, r11, r12, lr}
117+
; CHECK-NEXT: aut r12, lr, sp
118+
; CHECK-NEXT: bx lr
119+
entry:
120+
%tobool.not = icmp eq i32 %c, 0
121+
br i1 %tobool.not, label %if.end, label %if.then
122+
123+
if.then: ; preds = %entry
124+
tail call void @knr()
125+
br label %if.end
126+
127+
if.end: ; preds = %if.then, %entry
128+
%0 = alloca i8, i32 %z, align 8
129+
call void @take_ptr(ptr noundef nonnull %0)
130+
%tobool1 = fcmp une float %e, 0.000000e+00
131+
br i1 %tobool1, label %if.then2, label %if.end3
132+
133+
if.then2: ; preds = %if.end
134+
call void @knr()
135+
br label %if.end3
136+
137+
if.end3: ; preds = %if.then2, %if.end
138+
ret void
139+
}
140+
141+
declare void @knr(...)
142+
declare void @take_ptr(ptr noundef)

0 commit comments

Comments
 (0)