xref: /llvm-project/llvm/test/CodeGen/ARM/Windows/wineh-opcodes.ll (revision c5383536cb6824391f99f8f5963fc1427dd1673f)
1d8e67c1cSMartin Storsjö;; Check that this produces the expected assembly output
2d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s
3d8e67c1cSMartin Storsjö;; Also try to write an object file, which verifies that the SEH opcodes
4d8e67c1cSMartin Storsjö;; match the actual prologue/epilogue length.
5d8e67c1cSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs
6d8e67c1cSMartin Storsjö
7d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4Frame:
8d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4Frame
9d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
10d8e67c1cSMartin Storsjö; CHECK-NEXT:         push.w  {r4, r7, r11, lr}
11d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4, r7, r11, lr}
12d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   r11, sp, #8
13d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
14d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
15d8e67c1cSMartin Storsjö; CHECK-NEXT:         bl      other
16d8e67c1cSMartin Storsjö
17d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
18d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r4, r7, r11, pc}
19d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4, r7, r11, lr}
20d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
21d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
22d8e67c1cSMartin Storsjö
23d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4Frame() uwtable "frame-pointer"="all" {
24d8e67c1cSMartin Storsjöentry:
25d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @other()
26d8e67c1cSMartin Storsjö  call void asm sideeffect "", "~{r4}"()
27d8e67c1cSMartin Storsjö  ret void
28d8e67c1cSMartin Storsjö}
29d8e67c1cSMartin Storsjö
30d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4NoFrame:
31d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4NoFrame
32d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
33bd52506dSMartin Storsjö; CHECK-NEXT:         push    {r4, lr}
34bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4, lr}
35d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
36d8e67c1cSMartin Storsjö; CHECK-NEXT:         bl      other
37d8e67c1cSMartin Storsjö
38d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
39bd52506dSMartin Storsjö; CHECK-NEXT:         pop     {r4, pc}
40bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4, lr}
41d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
42d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
43d8e67c1cSMartin Storsjö
44d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4NoFrame() uwtable "frame-pointer"="none" {
45d8e67c1cSMartin Storsjöentry:
46d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @other()
47d8e67c1cSMartin Storsjö  call void asm sideeffect "", "~{r4}"()
48d8e67c1cSMartin Storsjö  ret void
49d8e67c1cSMartin Storsjö}
50d8e67c1cSMartin Storsjö
51d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberR4Tail:
52d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberR4Tail
53d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
54bd52506dSMartin Storsjö; CHECK-NEXT:         push    {r4, lr}
55bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4, lr}
56d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
57d8e67c1cSMartin Storsjö
58d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
59d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r4, lr}
60d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4, lr}
61d8e67c1cSMartin Storsjö; CHECK-NEXT:         b.w     other
62d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
63d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
64d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
65d8e67c1cSMartin Storsjö
66d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberR4Tail() uwtable "frame-pointer"="none" {
67d8e67c1cSMartin Storsjöentry:
68d8e67c1cSMartin Storsjö  call void asm sideeffect "", "~{r4}"()
69d8e67c1cSMartin Storsjö  tail call arm_aapcs_vfpcc void @other()
70d8e67c1cSMartin Storsjö  ret void
71d8e67c1cSMartin Storsjö}
72d8e67c1cSMartin Storsjö
73d8e67c1cSMartin Storsjö; CHECK-LABEL: clobberD8D10:
74d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc clobberD8D10
75d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
76d8e67c1cSMartin Storsjö; CHECK-NEXT:         vpush   {d8, d9, d10}
77d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs {d8-d10}
78d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
79d8e67c1cSMartin Storsjö
80d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
81d8e67c1cSMartin Storsjö; CHECK-NEXT:         vpop    {d8, d9, d10}
82d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs {d8-d10}
83d8e67c1cSMartin Storsjö; CHECK-NEXT:         b.w     other
84d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
85d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
86d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
87d8e67c1cSMartin Storsjö
88d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @clobberD8D10() uwtable "frame-pointer"="none" {
89d8e67c1cSMartin Storsjöentry:
90d8e67c1cSMartin Storsjö  call void asm sideeffect "", "~{d8},~{d9},~{d10}"()
91d8e67c1cSMartin Storsjö  tail call arm_aapcs_vfpcc void @other()
92d8e67c1cSMartin Storsjö  ret void
93d8e67c1cSMartin Storsjö}
94d8e67c1cSMartin Storsjö
95d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @other()
96d8e67c1cSMartin Storsjö
97d8e67c1cSMartin Storsjö; CHECK-LABEL: vararg:
98d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc vararg
99d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
100d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub     sp, #12
101d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
102d8e67c1cSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
103d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
104d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub     sp, #4
105d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
106d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
107d8e67c1cSMartin Storsjö
108d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
109d8e67c1cSMartin Storsjö; CHECK-NEXT:         add     sp, #4
110d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
111d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
112d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
113d8e67c1cSMartin Storsjö; CHECK-NEXT:         add     sp, #12
114d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
115d8e67c1cSMartin Storsjö; CHECK-NEXT:         bx      lr
116d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop
117d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
118d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
119d8e67c1cSMartin Storsjö
120d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @vararg(i32 noundef %a, ...) uwtable "frame-pointer"="none" {
121d8e67c1cSMartin Storsjöentry:
122d8e67c1cSMartin Storsjö  %ap = alloca ptr, align 4
123d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap)
124d8e67c1cSMartin Storsjö  call void @llvm.va_start(ptr nonnull %ap)
125d8e67c1cSMartin Storsjö  %0 = load ptr, ptr %ap
126d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useva(ptr noundef %0)
127d8e67c1cSMartin Storsjö  call void @llvm.va_end(ptr nonnull %ap)
128d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap)
129d8e67c1cSMartin Storsjö  ret void
130d8e67c1cSMartin Storsjö}
131d8e67c1cSMartin Storsjö
132d8e67c1cSMartin Storsjödeclare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
133d8e67c1cSMartin Storsjödeclare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
134d8e67c1cSMartin Storsjödeclare void @llvm.va_start(ptr)
135d8e67c1cSMartin Storsjödeclare void @llvm.va_end(ptr)
136d8e67c1cSMartin Storsjö
137d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @useva(ptr noundef)
138d8e67c1cSMartin Storsjö
139d8e67c1cSMartin Storsjö; CHECK-LABEL: onlystack:
140d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc onlystack
141d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
142d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub     sp, #4
143d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
144d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
145d8e67c1cSMartin Storsjö
146d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
147d8e67c1cSMartin Storsjö; CHECK-NEXT:         add     sp, #4
148d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
149d8e67c1cSMartin Storsjö; CHECK-NEXT:         bx      lr
150d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop
151d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
152d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
153d8e67c1cSMartin Storsjö
154d8e67c1cSMartin Storsjödefine dso_local arm_aapcs_vfpcc void @onlystack() uwtable "frame-pointer"="none" {
155d8e67c1cSMartin Storsjöentry:
156d8e67c1cSMartin Storsjö  %buf = alloca [4 x i8], align 1
157d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %buf)
158d8e67c1cSMartin Storsjö  call void asm sideeffect "", "r"(ptr nonnull %buf)
159d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %buf)
160d8e67c1cSMartin Storsjö  ret void
161d8e67c1cSMartin Storsjö}
162d8e67c1cSMartin Storsjö
163d8e67c1cSMartin Storsjö; CHECK-LABEL: func50:
164d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func50
165d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
166d8e67c1cSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
167d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
168d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub     sp, #56
169d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 56
170d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
171d8e67c1cSMartin Storsjö
172d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
173d8e67c1cSMartin Storsjö; CHECK-NEXT:         add     sp, #56
174d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 56
175d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, pc}
176d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
177d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
178d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
179d8e67c1cSMartin Storsjö
180d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func50() {
181d8e67c1cSMartin Storsjöentry:
182d8e67c1cSMartin Storsjö  %buf = alloca [50 x i8], align 1
183d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 50, ptr nonnull %buf)
184d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf)
185d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 50, ptr nonnull %buf)
186d8e67c1cSMartin Storsjö  ret void
187d8e67c1cSMartin Storsjö}
188d8e67c1cSMartin Storsjö
189d8e67c1cSMartin Storsjö; CHECK-LABEL: func4000:
190d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func4000
191d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
192d8e67c1cSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
193d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
194d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, #4000
195d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       4000
196d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
197d8e67c1cSMartin Storsjö
198d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
199d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   sp, sp, #4000
200d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       4000
201d8e67c1cSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, pc}
202d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
203d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
204d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
205d8e67c1cSMartin Storsjö
206d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func4000() {
207d8e67c1cSMartin Storsjöentry:
208d8e67c1cSMartin Storsjö  %buf = alloca [4000 x i8], align 1
209d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %buf)
210d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf)
211d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %buf)
212d8e67c1cSMartin Storsjö  ret void
213d8e67c1cSMartin Storsjö}
214d8e67c1cSMartin Storsjö
215d8e67c1cSMartin Storsjö; CHECK-LABEL: func5000:
216d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func5000
217d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
218bd52506dSMartin Storsjö; CHECK-NEXT:         push    {r4, r5, r6, lr}
219bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
220d8e67c1cSMartin Storsjö; CHECK-NEXT:         movw    r4, #1250
221d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
222d8e67c1cSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
223d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
224d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
225d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       5000
226d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
227d8e67c1cSMartin Storsjö
228d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
229d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   sp, sp, #4992
230d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       4992
231d8e67c1cSMartin Storsjö; CHECK-NEXT:         add     sp, #8
232d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 8
233bd52506dSMartin Storsjö; CHECK-NEXT:         pop     {r4, r5, r6, pc}
234bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
235d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
236d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
237d8e67c1cSMartin Storsjö
238d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func5000() {
239d8e67c1cSMartin Storsjöentry:
240d8e67c1cSMartin Storsjö  %buf = alloca [5000 x i8], align 1
241d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf)
242d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf)
243d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf)
244d8e67c1cSMartin Storsjö  ret void
245d8e67c1cSMartin Storsjö}
246d8e67c1cSMartin Storsjö
247d8e67c1cSMartin Storsjö; CHECK-LABEL: func262144:
248d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func262144
249d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
250bd52506dSMartin Storsjö; CHECK-NEXT:         push    {r4, r5, r6, lr}
251bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
252485432f3SMartin Storsjö; CHECK-NEXT:         movs    r4, #0
253485432f3SMartin Storsjö; CHECK-NEXT:         .seh_nop
254d8e67c1cSMartin Storsjö; CHECK-NEXT:         movt    r4, #1
255d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
256d8e67c1cSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
257d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
258d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
259d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       262144
260d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
261d8e67c1cSMartin Storsjö
262d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
263d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   sp, sp, #262144
264d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       262144
265bd52506dSMartin Storsjö; CHECK-NEXT:         pop     {r4, r5, r6, pc}
266bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
267d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
268d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
269d8e67c1cSMartin Storsjö
270d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func262144() {
271d8e67c1cSMartin Storsjöentry:
272d8e67c1cSMartin Storsjö  %buf = alloca [262144 x i8], align 1
273d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 262144, ptr nonnull %buf)
274d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf)
275d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 262144, ptr nonnull %buf)
276d8e67c1cSMartin Storsjö  ret void
277d8e67c1cSMartin Storsjö}
278d8e67c1cSMartin Storsjö
279d8e67c1cSMartin Storsjö; CHECK-LABEL: func270000:
280d8e67c1cSMartin Storsjö; CHECK-NEXT: .seh_proc func270000
281d8e67c1cSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
282bd52506dSMartin Storsjö; CHECK-NEXT:         push    {r4, r5, r6, lr}
283bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
284d8e67c1cSMartin Storsjö; CHECK-NEXT:         movw    r4, #1964
285d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
286d8e67c1cSMartin Storsjö; CHECK-NEXT:         movt    r4, #1
287d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
288d8e67c1cSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
289d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_nop_w
290d8e67c1cSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
291d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       270000
292d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
293d8e67c1cSMartin Storsjö
294d8e67c1cSMartin Storsjö; CHECK:              .seh_startepilogue
295d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   sp, sp, #268288
296d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       268288
297d8e67c1cSMartin Storsjö; CHECK-NEXT:         add.w   sp, sp, #1712
298d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc_w       1712
299bd52506dSMartin Storsjö; CHECK-NEXT:         pop     {r4, r5, r6, pc}
300bd52506dSMartin Storsjö; CHECK-NEXT:         .seh_save_regs  {r4-r6, lr}
301d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
302d8e67c1cSMartin Storsjö; CHECK-NEXT:         .seh_endproc
303d8e67c1cSMartin Storsjö
304d8e67c1cSMartin Storsjödefine arm_aapcs_vfpcc void @func270000() {
305d8e67c1cSMartin Storsjöentry:
306d8e67c1cSMartin Storsjö  %buf = alloca [270000 x i8], align 1
307d8e67c1cSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 270000, ptr nonnull %buf)
308d8e67c1cSMartin Storsjö  call arm_aapcs_vfpcc void @useptr(ptr noundef nonnull %buf)
309d8e67c1cSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 270000, ptr nonnull %buf)
310d8e67c1cSMartin Storsjö  ret void
311d8e67c1cSMartin Storsjö}
312d8e67c1cSMartin Storsjö
313d8e67c1cSMartin Storsjödeclare arm_aapcs_vfpcc void @useptr(ptr noundef)
314*c5383536SMartin Storsjö
315*c5383536SMartin Storsjö; CHECK-LABEL: func_fp:
316*c5383536SMartin Storsjö; CHECK-NEXT: .seh_proc func_fp
317*c5383536SMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
318*c5383536SMartin Storsjö; CHECK-NEXT:         str     r11, [sp, #-4]!
319*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11}
320*c5383536SMartin Storsjö; CHECK-NEXT:         mov     r11, sp
321*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
322*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_endprologue
323*c5383536SMartin Storsjö
324*c5383536SMartin Storsjö; CHECK-NEXT:         mov     r0, r11
325*c5383536SMartin Storsjö
326*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_startepilogue
327*c5383536SMartin Storsjö; CHECK-NEXT:         ldr     r11, [sp], #4
328*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11}
329*c5383536SMartin Storsjö; CHECK-NEXT:         bx      lr
330*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_nop
331*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
332*c5383536SMartin Storsjö; CHECK-NEXT:         .seh_endproc
333*c5383536SMartin Storsjö
334*c5383536SMartin Storsjödefine arm_aapcs_vfpcc i32 @func_fp() {
335*c5383536SMartin Storsjöentry:
336*c5383536SMartin Storsjö  %0 = tail call ptr @llvm.frameaddress.p0(i32 0)
337*c5383536SMartin Storsjö  %1 = ptrtoint ptr %0 to i32
338*c5383536SMartin Storsjö  ret i32 %1
339*c5383536SMartin Storsjö}
340*c5383536SMartin Storsjö
341*c5383536SMartin Storsjödeclare ptr @llvm.frameaddress.p0(i32 immarg)
342