xref: /llvm-project/llvm/test/CodeGen/RISCV/prolog-epilogue.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s -check-prefixes=RV32,RV32I
4; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+zba < %s \
5; RUN:   | FileCheck %s -check-prefixes=RV32,RV32ZBA
6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7; RUN:   | FileCheck %s -check-prefixes=RV64,RV64I
8; RUN: llc -mtriple=riscv64 -verify-machineinstrs -mattr=+zba < %s \
9; RUN:   | FileCheck %s -check-prefixes=RV64,RV64ZBA
10
11declare void @callee(ptr)
12
13define void @frame_16b() {
14; RV32-LABEL: frame_16b:
15; RV32:       # %bb.0:
16; RV32-NEXT:    addi sp, sp, -16
17; RV32-NEXT:    .cfi_def_cfa_offset 16
18; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
19; RV32-NEXT:    .cfi_offset ra, -4
20; RV32-NEXT:    li a0, 0
21; RV32-NEXT:    call callee
22; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23; RV32-NEXT:    .cfi_restore ra
24; RV32-NEXT:    addi sp, sp, 16
25; RV32-NEXT:    .cfi_def_cfa_offset 0
26; RV32-NEXT:    ret
27;
28; RV64-LABEL: frame_16b:
29; RV64:       # %bb.0:
30; RV64-NEXT:    addi sp, sp, -16
31; RV64-NEXT:    .cfi_def_cfa_offset 16
32; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
33; RV64-NEXT:    .cfi_offset ra, -8
34; RV64-NEXT:    li a0, 0
35; RV64-NEXT:    call callee
36; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
37; RV64-NEXT:    .cfi_restore ra
38; RV64-NEXT:    addi sp, sp, 16
39; RV64-NEXT:    .cfi_def_cfa_offset 0
40; RV64-NEXT:    ret
41  call void @callee(ptr null)
42  ret void
43}
44
45define void @frame_1024b() {
46; RV32-LABEL: frame_1024b:
47; RV32:       # %bb.0:
48; RV32-NEXT:    addi sp, sp, -1024
49; RV32-NEXT:    .cfi_def_cfa_offset 1024
50; RV32-NEXT:    sw ra, 1020(sp) # 4-byte Folded Spill
51; RV32-NEXT:    .cfi_offset ra, -4
52; RV32-NEXT:    addi a0, sp, 12
53; RV32-NEXT:    call callee
54; RV32-NEXT:    lw ra, 1020(sp) # 4-byte Folded Reload
55; RV32-NEXT:    .cfi_restore ra
56; RV32-NEXT:    addi sp, sp, 1024
57; RV32-NEXT:    .cfi_def_cfa_offset 0
58; RV32-NEXT:    ret
59;
60; RV64-LABEL: frame_1024b:
61; RV64:       # %bb.0:
62; RV64-NEXT:    addi sp, sp, -1024
63; RV64-NEXT:    .cfi_def_cfa_offset 1024
64; RV64-NEXT:    sd ra, 1016(sp) # 8-byte Folded Spill
65; RV64-NEXT:    .cfi_offset ra, -8
66; RV64-NEXT:    addi a0, sp, 8
67; RV64-NEXT:    call callee
68; RV64-NEXT:    ld ra, 1016(sp) # 8-byte Folded Reload
69; RV64-NEXT:    .cfi_restore ra
70; RV64-NEXT:    addi sp, sp, 1024
71; RV64-NEXT:    .cfi_def_cfa_offset 0
72; RV64-NEXT:    ret
73  %a = alloca [1008 x i8]
74  call void @callee(ptr %a)
75  ret void
76}
77
78define void @frame_2048b() {
79; RV32-LABEL: frame_2048b:
80; RV32:       # %bb.0:
81; RV32-NEXT:    addi sp, sp, -2032
82; RV32-NEXT:    .cfi_def_cfa_offset 2032
83; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
84; RV32-NEXT:    .cfi_offset ra, -4
85; RV32-NEXT:    addi sp, sp, -16
86; RV32-NEXT:    .cfi_def_cfa_offset 2048
87; RV32-NEXT:    addi a0, sp, 12
88; RV32-NEXT:    call callee
89; RV32-NEXT:    addi sp, sp, 16
90; RV32-NEXT:    .cfi_def_cfa_offset 2032
91; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
92; RV32-NEXT:    .cfi_restore ra
93; RV32-NEXT:    addi sp, sp, 2032
94; RV32-NEXT:    .cfi_def_cfa_offset 0
95; RV32-NEXT:    ret
96;
97; RV64-LABEL: frame_2048b:
98; RV64:       # %bb.0:
99; RV64-NEXT:    addi sp, sp, -2032
100; RV64-NEXT:    .cfi_def_cfa_offset 2032
101; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
102; RV64-NEXT:    .cfi_offset ra, -8
103; RV64-NEXT:    addi sp, sp, -16
104; RV64-NEXT:    .cfi_def_cfa_offset 2048
105; RV64-NEXT:    addi a0, sp, 8
106; RV64-NEXT:    call callee
107; RV64-NEXT:    addi sp, sp, 16
108; RV64-NEXT:    .cfi_def_cfa_offset 2032
109; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
110; RV64-NEXT:    .cfi_restore ra
111; RV64-NEXT:    addi sp, sp, 2032
112; RV64-NEXT:    .cfi_def_cfa_offset 0
113; RV64-NEXT:    ret
114  %a = alloca [2032 x i8]
115  call void @callee(ptr %a)
116  ret void
117}
118
119define void @frame_4096b() {
120; RV32-LABEL: frame_4096b:
121; RV32:       # %bb.0:
122; RV32-NEXT:    addi sp, sp, -2032
123; RV32-NEXT:    .cfi_def_cfa_offset 2032
124; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
125; RV32-NEXT:    .cfi_offset ra, -4
126; RV32-NEXT:    addi sp, sp, -2048
127; RV32-NEXT:    addi sp, sp, -16
128; RV32-NEXT:    .cfi_def_cfa_offset 4096
129; RV32-NEXT:    addi a0, sp, 12
130; RV32-NEXT:    call callee
131; RV32-NEXT:    addi sp, sp, 2032
132; RV32-NEXT:    addi sp, sp, 32
133; RV32-NEXT:    .cfi_def_cfa_offset 2032
134; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
135; RV32-NEXT:    .cfi_restore ra
136; RV32-NEXT:    addi sp, sp, 2032
137; RV32-NEXT:    .cfi_def_cfa_offset 0
138; RV32-NEXT:    ret
139;
140; RV64-LABEL: frame_4096b:
141; RV64:       # %bb.0:
142; RV64-NEXT:    addi sp, sp, -2032
143; RV64-NEXT:    .cfi_def_cfa_offset 2032
144; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
145; RV64-NEXT:    .cfi_offset ra, -8
146; RV64-NEXT:    addi sp, sp, -2048
147; RV64-NEXT:    addi sp, sp, -16
148; RV64-NEXT:    .cfi_def_cfa_offset 4096
149; RV64-NEXT:    addi a0, sp, 8
150; RV64-NEXT:    call callee
151; RV64-NEXT:    addi sp, sp, 2032
152; RV64-NEXT:    addi sp, sp, 32
153; RV64-NEXT:    .cfi_def_cfa_offset 2032
154; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
155; RV64-NEXT:    .cfi_restore ra
156; RV64-NEXT:    addi sp, sp, 2032
157; RV64-NEXT:    .cfi_def_cfa_offset 0
158; RV64-NEXT:    ret
159  %a = alloca [4080 x i8]
160  call void @callee(ptr %a)
161  ret void
162}
163
164;; 2^12-16+2032
165define void @frame_4kb() {
166; RV32-LABEL: frame_4kb:
167; RV32:       # %bb.0:
168; RV32-NEXT:    addi sp, sp, -2032
169; RV32-NEXT:    .cfi_def_cfa_offset 2032
170; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
171; RV32-NEXT:    .cfi_offset ra, -4
172; RV32-NEXT:    lui a0, 1
173; RV32-NEXT:    sub sp, sp, a0
174; RV32-NEXT:    .cfi_def_cfa_offset 6128
175; RV32-NEXT:    addi a0, sp, 12
176; RV32-NEXT:    call callee
177; RV32-NEXT:    lui a0, 1
178; RV32-NEXT:    add sp, sp, a0
179; RV32-NEXT:    .cfi_def_cfa_offset 2032
180; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
181; RV32-NEXT:    .cfi_restore ra
182; RV32-NEXT:    addi sp, sp, 2032
183; RV32-NEXT:    .cfi_def_cfa_offset 0
184; RV32-NEXT:    ret
185;
186; RV64-LABEL: frame_4kb:
187; RV64:       # %bb.0:
188; RV64-NEXT:    addi sp, sp, -2032
189; RV64-NEXT:    .cfi_def_cfa_offset 2032
190; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
191; RV64-NEXT:    .cfi_offset ra, -8
192; RV64-NEXT:    lui a0, 1
193; RV64-NEXT:    sub sp, sp, a0
194; RV64-NEXT:    .cfi_def_cfa_offset 6128
195; RV64-NEXT:    addi a0, sp, 8
196; RV64-NEXT:    call callee
197; RV64-NEXT:    lui a0, 1
198; RV64-NEXT:    add sp, sp, a0
199; RV64-NEXT:    .cfi_def_cfa_offset 2032
200; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
201; RV64-NEXT:    .cfi_restore ra
202; RV64-NEXT:    addi sp, sp, 2032
203; RV64-NEXT:    .cfi_def_cfa_offset 0
204; RV64-NEXT:    ret
205  %a = alloca [6112 x i8]
206  call void @callee(ptr %a)
207  ret void
208}
209
210define void @frame_4kb_offset_128() {
211; RV32I-LABEL: frame_4kb_offset_128:
212; RV32I:       # %bb.0:
213; RV32I-NEXT:    addi sp, sp, -2032
214; RV32I-NEXT:    .cfi_def_cfa_offset 2032
215; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
216; RV32I-NEXT:    .cfi_offset ra, -4
217; RV32I-NEXT:    lui a0, 1
218; RV32I-NEXT:    addi a0, a0, 128
219; RV32I-NEXT:    sub sp, sp, a0
220; RV32I-NEXT:    .cfi_def_cfa_offset 6256
221; RV32I-NEXT:    addi a0, sp, 12
222; RV32I-NEXT:    call callee
223; RV32I-NEXT:    lui a0, 1
224; RV32I-NEXT:    addi a0, a0, 128
225; RV32I-NEXT:    add sp, sp, a0
226; RV32I-NEXT:    .cfi_def_cfa_offset 2032
227; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
228; RV32I-NEXT:    .cfi_restore ra
229; RV32I-NEXT:    addi sp, sp, 2032
230; RV32I-NEXT:    .cfi_def_cfa_offset 0
231; RV32I-NEXT:    ret
232;
233; RV32ZBA-LABEL: frame_4kb_offset_128:
234; RV32ZBA:       # %bb.0:
235; RV32ZBA-NEXT:    addi sp, sp, -2032
236; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
237; RV32ZBA-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
238; RV32ZBA-NEXT:    .cfi_offset ra, -4
239; RV32ZBA-NEXT:    li a0, -528
240; RV32ZBA-NEXT:    sh3add sp, a0, sp
241; RV32ZBA-NEXT:    .cfi_def_cfa_offset 6256
242; RV32ZBA-NEXT:    addi a0, sp, 12
243; RV32ZBA-NEXT:    call callee
244; RV32ZBA-NEXT:    li a0, 528
245; RV32ZBA-NEXT:    sh3add sp, a0, sp
246; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
247; RV32ZBA-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
248; RV32ZBA-NEXT:    .cfi_restore ra
249; RV32ZBA-NEXT:    addi sp, sp, 2032
250; RV32ZBA-NEXT:    .cfi_def_cfa_offset 0
251; RV32ZBA-NEXT:    ret
252;
253; RV64I-LABEL: frame_4kb_offset_128:
254; RV64I:       # %bb.0:
255; RV64I-NEXT:    addi sp, sp, -2032
256; RV64I-NEXT:    .cfi_def_cfa_offset 2032
257; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
258; RV64I-NEXT:    .cfi_offset ra, -8
259; RV64I-NEXT:    lui a0, 1
260; RV64I-NEXT:    addiw a0, a0, 128
261; RV64I-NEXT:    sub sp, sp, a0
262; RV64I-NEXT:    .cfi_def_cfa_offset 6256
263; RV64I-NEXT:    addi a0, sp, 8
264; RV64I-NEXT:    call callee
265; RV64I-NEXT:    lui a0, 1
266; RV64I-NEXT:    addiw a0, a0, 128
267; RV64I-NEXT:    add sp, sp, a0
268; RV64I-NEXT:    .cfi_def_cfa_offset 2032
269; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
270; RV64I-NEXT:    .cfi_restore ra
271; RV64I-NEXT:    addi sp, sp, 2032
272; RV64I-NEXT:    .cfi_def_cfa_offset 0
273; RV64I-NEXT:    ret
274;
275; RV64ZBA-LABEL: frame_4kb_offset_128:
276; RV64ZBA:       # %bb.0:
277; RV64ZBA-NEXT:    addi sp, sp, -2032
278; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
279; RV64ZBA-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
280; RV64ZBA-NEXT:    .cfi_offset ra, -8
281; RV64ZBA-NEXT:    li a0, -528
282; RV64ZBA-NEXT:    sh3add sp, a0, sp
283; RV64ZBA-NEXT:    .cfi_def_cfa_offset 6256
284; RV64ZBA-NEXT:    addi a0, sp, 8
285; RV64ZBA-NEXT:    call callee
286; RV64ZBA-NEXT:    li a0, 528
287; RV64ZBA-NEXT:    sh3add sp, a0, sp
288; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
289; RV64ZBA-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
290; RV64ZBA-NEXT:    .cfi_restore ra
291; RV64ZBA-NEXT:    addi sp, sp, 2032
292; RV64ZBA-NEXT:    .cfi_def_cfa_offset 0
293; RV64ZBA-NEXT:    ret
294  %a = alloca [6240 x i8]
295  call void @callee(ptr %a)
296  ret void
297}
298
299
300;; 2^13-16+2032
301define void @frame_8kb() {
302; RV32-LABEL: frame_8kb:
303; RV32:       # %bb.0:
304; RV32-NEXT:    addi sp, sp, -2032
305; RV32-NEXT:    .cfi_def_cfa_offset 2032
306; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
307; RV32-NEXT:    .cfi_offset ra, -4
308; RV32-NEXT:    lui a0, 2
309; RV32-NEXT:    sub sp, sp, a0
310; RV32-NEXT:    .cfi_def_cfa_offset 10224
311; RV32-NEXT:    addi a0, sp, 12
312; RV32-NEXT:    call callee
313; RV32-NEXT:    lui a0, 2
314; RV32-NEXT:    add sp, sp, a0
315; RV32-NEXT:    .cfi_def_cfa_offset 2032
316; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
317; RV32-NEXT:    .cfi_restore ra
318; RV32-NEXT:    addi sp, sp, 2032
319; RV32-NEXT:    .cfi_def_cfa_offset 0
320; RV32-NEXT:    ret
321;
322; RV64-LABEL: frame_8kb:
323; RV64:       # %bb.0:
324; RV64-NEXT:    addi sp, sp, -2032
325; RV64-NEXT:    .cfi_def_cfa_offset 2032
326; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
327; RV64-NEXT:    .cfi_offset ra, -8
328; RV64-NEXT:    lui a0, 2
329; RV64-NEXT:    sub sp, sp, a0
330; RV64-NEXT:    .cfi_def_cfa_offset 10224
331; RV64-NEXT:    addi a0, sp, 8
332; RV64-NEXT:    call callee
333; RV64-NEXT:    lui a0, 2
334; RV64-NEXT:    add sp, sp, a0
335; RV64-NEXT:    .cfi_def_cfa_offset 2032
336; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
337; RV64-NEXT:    .cfi_restore ra
338; RV64-NEXT:    addi sp, sp, 2032
339; RV64-NEXT:    .cfi_def_cfa_offset 0
340; RV64-NEXT:    ret
341  %a = alloca [10208 x i8]
342  call void @callee(ptr %a)
343  ret void
344}
345
346define void @frame_8kb_offset_128() {
347; RV32I-LABEL: frame_8kb_offset_128:
348; RV32I:       # %bb.0:
349; RV32I-NEXT:    addi sp, sp, -2032
350; RV32I-NEXT:    .cfi_def_cfa_offset 2032
351; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
352; RV32I-NEXT:    .cfi_offset ra, -4
353; RV32I-NEXT:    lui a0, 2
354; RV32I-NEXT:    addi a0, a0, 128
355; RV32I-NEXT:    sub sp, sp, a0
356; RV32I-NEXT:    .cfi_def_cfa_offset 10352
357; RV32I-NEXT:    addi a0, sp, 12
358; RV32I-NEXT:    call callee
359; RV32I-NEXT:    lui a0, 2
360; RV32I-NEXT:    addi a0, a0, 128
361; RV32I-NEXT:    add sp, sp, a0
362; RV32I-NEXT:    .cfi_def_cfa_offset 2032
363; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
364; RV32I-NEXT:    .cfi_restore ra
365; RV32I-NEXT:    addi sp, sp, 2032
366; RV32I-NEXT:    .cfi_def_cfa_offset 0
367; RV32I-NEXT:    ret
368;
369; RV32ZBA-LABEL: frame_8kb_offset_128:
370; RV32ZBA:       # %bb.0:
371; RV32ZBA-NEXT:    addi sp, sp, -2032
372; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
373; RV32ZBA-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
374; RV32ZBA-NEXT:    .cfi_offset ra, -4
375; RV32ZBA-NEXT:    li a0, -1040
376; RV32ZBA-NEXT:    sh3add sp, a0, sp
377; RV32ZBA-NEXT:    .cfi_def_cfa_offset 10352
378; RV32ZBA-NEXT:    addi a0, sp, 12
379; RV32ZBA-NEXT:    call callee
380; RV32ZBA-NEXT:    li a0, 1040
381; RV32ZBA-NEXT:    sh3add sp, a0, sp
382; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
383; RV32ZBA-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
384; RV32ZBA-NEXT:    .cfi_restore ra
385; RV32ZBA-NEXT:    addi sp, sp, 2032
386; RV32ZBA-NEXT:    .cfi_def_cfa_offset 0
387; RV32ZBA-NEXT:    ret
388;
389; RV64I-LABEL: frame_8kb_offset_128:
390; RV64I:       # %bb.0:
391; RV64I-NEXT:    addi sp, sp, -2032
392; RV64I-NEXT:    .cfi_def_cfa_offset 2032
393; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
394; RV64I-NEXT:    .cfi_offset ra, -8
395; RV64I-NEXT:    lui a0, 2
396; RV64I-NEXT:    addiw a0, a0, 128
397; RV64I-NEXT:    sub sp, sp, a0
398; RV64I-NEXT:    .cfi_def_cfa_offset 10352
399; RV64I-NEXT:    addi a0, sp, 8
400; RV64I-NEXT:    call callee
401; RV64I-NEXT:    lui a0, 2
402; RV64I-NEXT:    addiw a0, a0, 128
403; RV64I-NEXT:    add sp, sp, a0
404; RV64I-NEXT:    .cfi_def_cfa_offset 2032
405; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
406; RV64I-NEXT:    .cfi_restore ra
407; RV64I-NEXT:    addi sp, sp, 2032
408; RV64I-NEXT:    .cfi_def_cfa_offset 0
409; RV64I-NEXT:    ret
410;
411; RV64ZBA-LABEL: frame_8kb_offset_128:
412; RV64ZBA:       # %bb.0:
413; RV64ZBA-NEXT:    addi sp, sp, -2032
414; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
415; RV64ZBA-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
416; RV64ZBA-NEXT:    .cfi_offset ra, -8
417; RV64ZBA-NEXT:    li a0, -1040
418; RV64ZBA-NEXT:    sh3add sp, a0, sp
419; RV64ZBA-NEXT:    .cfi_def_cfa_offset 10352
420; RV64ZBA-NEXT:    addi a0, sp, 8
421; RV64ZBA-NEXT:    call callee
422; RV64ZBA-NEXT:    li a0, 1040
423; RV64ZBA-NEXT:    sh3add sp, a0, sp
424; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
425; RV64ZBA-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
426; RV64ZBA-NEXT:    .cfi_restore ra
427; RV64ZBA-NEXT:    addi sp, sp, 2032
428; RV64ZBA-NEXT:    .cfi_def_cfa_offset 0
429; RV64ZBA-NEXT:    ret
430  %a = alloca [10336 x i8]
431  call void @callee(ptr %a)
432  ret void
433}
434
435define void @frame_16kb_minus_80() {
436; RV32I-LABEL: frame_16kb_minus_80:
437; RV32I:       # %bb.0:
438; RV32I-NEXT:    addi sp, sp, -2032
439; RV32I-NEXT:    .cfi_def_cfa_offset 2032
440; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
441; RV32I-NEXT:    .cfi_offset ra, -4
442; RV32I-NEXT:    lui a0, 4
443; RV32I-NEXT:    addi a0, a0, -80
444; RV32I-NEXT:    sub sp, sp, a0
445; RV32I-NEXT:    .cfi_def_cfa_offset 18336
446; RV32I-NEXT:    addi a0, sp, 12
447; RV32I-NEXT:    call callee
448; RV32I-NEXT:    lui a0, 4
449; RV32I-NEXT:    addi a0, a0, -80
450; RV32I-NEXT:    add sp, sp, a0
451; RV32I-NEXT:    .cfi_def_cfa_offset 2032
452; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
453; RV32I-NEXT:    .cfi_restore ra
454; RV32I-NEXT:    addi sp, sp, 2032
455; RV32I-NEXT:    .cfi_def_cfa_offset 0
456; RV32I-NEXT:    ret
457;
458; RV32ZBA-LABEL: frame_16kb_minus_80:
459; RV32ZBA:       # %bb.0:
460; RV32ZBA-NEXT:    addi sp, sp, -2032
461; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
462; RV32ZBA-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
463; RV32ZBA-NEXT:    .cfi_offset ra, -4
464; RV32ZBA-NEXT:    li a0, -2038
465; RV32ZBA-NEXT:    sh3add sp, a0, sp
466; RV32ZBA-NEXT:    .cfi_def_cfa_offset 18336
467; RV32ZBA-NEXT:    addi a0, sp, 12
468; RV32ZBA-NEXT:    call callee
469; RV32ZBA-NEXT:    li a0, 2038
470; RV32ZBA-NEXT:    sh3add sp, a0, sp
471; RV32ZBA-NEXT:    .cfi_def_cfa_offset 2032
472; RV32ZBA-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
473; RV32ZBA-NEXT:    .cfi_restore ra
474; RV32ZBA-NEXT:    addi sp, sp, 2032
475; RV32ZBA-NEXT:    .cfi_def_cfa_offset 0
476; RV32ZBA-NEXT:    ret
477;
478; RV64I-LABEL: frame_16kb_minus_80:
479; RV64I:       # %bb.0:
480; RV64I-NEXT:    addi sp, sp, -2032
481; RV64I-NEXT:    .cfi_def_cfa_offset 2032
482; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
483; RV64I-NEXT:    .cfi_offset ra, -8
484; RV64I-NEXT:    lui a0, 4
485; RV64I-NEXT:    addiw a0, a0, -80
486; RV64I-NEXT:    sub sp, sp, a0
487; RV64I-NEXT:    .cfi_def_cfa_offset 18336
488; RV64I-NEXT:    addi a0, sp, 8
489; RV64I-NEXT:    call callee
490; RV64I-NEXT:    lui a0, 4
491; RV64I-NEXT:    addiw a0, a0, -80
492; RV64I-NEXT:    add sp, sp, a0
493; RV64I-NEXT:    .cfi_def_cfa_offset 2032
494; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
495; RV64I-NEXT:    .cfi_restore ra
496; RV64I-NEXT:    addi sp, sp, 2032
497; RV64I-NEXT:    .cfi_def_cfa_offset 0
498; RV64I-NEXT:    ret
499;
500; RV64ZBA-LABEL: frame_16kb_minus_80:
501; RV64ZBA:       # %bb.0:
502; RV64ZBA-NEXT:    addi sp, sp, -2032
503; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
504; RV64ZBA-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
505; RV64ZBA-NEXT:    .cfi_offset ra, -8
506; RV64ZBA-NEXT:    li a0, -2038
507; RV64ZBA-NEXT:    sh3add sp, a0, sp
508; RV64ZBA-NEXT:    .cfi_def_cfa_offset 18336
509; RV64ZBA-NEXT:    addi a0, sp, 8
510; RV64ZBA-NEXT:    call callee
511; RV64ZBA-NEXT:    li a0, 2038
512; RV64ZBA-NEXT:    sh3add sp, a0, sp
513; RV64ZBA-NEXT:    .cfi_def_cfa_offset 2032
514; RV64ZBA-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
515; RV64ZBA-NEXT:    .cfi_restore ra
516; RV64ZBA-NEXT:    addi sp, sp, 2032
517; RV64ZBA-NEXT:    .cfi_def_cfa_offset 0
518; RV64ZBA-NEXT:    ret
519  %a = alloca [18320 x i8]
520  call void @callee(ptr %a)
521  ret void
522}
523
524;; 2^14-16+2032
525define void @frame_16kb() {
526; RV32-LABEL: frame_16kb:
527; RV32:       # %bb.0:
528; RV32-NEXT:    addi sp, sp, -2032
529; RV32-NEXT:    .cfi_def_cfa_offset 2032
530; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
531; RV32-NEXT:    .cfi_offset ra, -4
532; RV32-NEXT:    lui a0, 4
533; RV32-NEXT:    sub sp, sp, a0
534; RV32-NEXT:    .cfi_def_cfa_offset 18416
535; RV32-NEXT:    addi a0, sp, 12
536; RV32-NEXT:    call callee
537; RV32-NEXT:    lui a0, 4
538; RV32-NEXT:    add sp, sp, a0
539; RV32-NEXT:    .cfi_def_cfa_offset 2032
540; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
541; RV32-NEXT:    .cfi_restore ra
542; RV32-NEXT:    addi sp, sp, 2032
543; RV32-NEXT:    .cfi_def_cfa_offset 0
544; RV32-NEXT:    ret
545;
546; RV64-LABEL: frame_16kb:
547; RV64:       # %bb.0:
548; RV64-NEXT:    addi sp, sp, -2032
549; RV64-NEXT:    .cfi_def_cfa_offset 2032
550; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
551; RV64-NEXT:    .cfi_offset ra, -8
552; RV64-NEXT:    lui a0, 4
553; RV64-NEXT:    sub sp, sp, a0
554; RV64-NEXT:    .cfi_def_cfa_offset 18416
555; RV64-NEXT:    addi a0, sp, 8
556; RV64-NEXT:    call callee
557; RV64-NEXT:    lui a0, 4
558; RV64-NEXT:    add sp, sp, a0
559; RV64-NEXT:    .cfi_def_cfa_offset 2032
560; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
561; RV64-NEXT:    .cfi_restore ra
562; RV64-NEXT:    addi sp, sp, 2032
563; RV64-NEXT:    .cfi_def_cfa_offset 0
564; RV64-NEXT:    ret
565  %a = alloca [18400 x i8]
566  call void @callee(ptr %a)
567  ret void
568}
569
570;; 2^15-16+2032
571define void @frame_32kb() {
572; RV32-LABEL: frame_32kb:
573; RV32:       # %bb.0:
574; RV32-NEXT:    addi sp, sp, -2032
575; RV32-NEXT:    .cfi_def_cfa_offset 2032
576; RV32-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
577; RV32-NEXT:    .cfi_offset ra, -4
578; RV32-NEXT:    lui a0, 8
579; RV32-NEXT:    sub sp, sp, a0
580; RV32-NEXT:    .cfi_def_cfa_offset 34800
581; RV32-NEXT:    addi a0, sp, 12
582; RV32-NEXT:    call callee
583; RV32-NEXT:    lui a0, 8
584; RV32-NEXT:    add sp, sp, a0
585; RV32-NEXT:    .cfi_def_cfa_offset 2032
586; RV32-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
587; RV32-NEXT:    .cfi_restore ra
588; RV32-NEXT:    addi sp, sp, 2032
589; RV32-NEXT:    .cfi_def_cfa_offset 0
590; RV32-NEXT:    ret
591;
592; RV64-LABEL: frame_32kb:
593; RV64:       # %bb.0:
594; RV64-NEXT:    addi sp, sp, -2032
595; RV64-NEXT:    .cfi_def_cfa_offset 2032
596; RV64-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
597; RV64-NEXT:    .cfi_offset ra, -8
598; RV64-NEXT:    lui a0, 8
599; RV64-NEXT:    sub sp, sp, a0
600; RV64-NEXT:    .cfi_def_cfa_offset 34800
601; RV64-NEXT:    addi a0, sp, 8
602; RV64-NEXT:    call callee
603; RV64-NEXT:    lui a0, 8
604; RV64-NEXT:    add sp, sp, a0
605; RV64-NEXT:    .cfi_def_cfa_offset 2032
606; RV64-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
607; RV64-NEXT:    .cfi_restore ra
608; RV64-NEXT:    addi sp, sp, 2032
609; RV64-NEXT:    .cfi_def_cfa_offset 0
610; RV64-NEXT:    ret
611  %a = alloca [34784 x i8]
612  call void @callee(ptr %a)
613  ret void
614}
615