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