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