xref: /llvm-project/llvm/test/CodeGen/RISCV/stack-realignment.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-prefix=RV32I
4; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
5; RUN:   | FileCheck %s -check-prefix=RV32I-ILP32E
6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7; RUN:   | FileCheck %s -check-prefix=RV64I
8; RUN: llc -mtriple=riscv64 -target-abi lp64e -verify-machineinstrs < %s \
9; RUN:   | FileCheck %s -check-prefix=RV64I-LP64E
10
11declare void @callee(ptr)
12
13define void @caller16() {
14; RV32I-LABEL: caller16:
15; RV32I:       # %bb.0:
16; RV32I-NEXT:    addi sp, sp, -16
17; RV32I-NEXT:    .cfi_def_cfa_offset 16
18; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
19; RV32I-NEXT:    .cfi_offset ra, -4
20; RV32I-NEXT:    mv a0, sp
21; RV32I-NEXT:    call callee
22; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
23; RV32I-NEXT:    .cfi_restore ra
24; RV32I-NEXT:    addi sp, sp, 16
25; RV32I-NEXT:    .cfi_def_cfa_offset 0
26; RV32I-NEXT:    ret
27;
28; RV32I-ILP32E-LABEL: caller16:
29; RV32I-ILP32E:       # %bb.0:
30; RV32I-ILP32E-NEXT:    addi sp, sp, -16
31; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 16
32; RV32I-ILP32E-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
33; RV32I-ILP32E-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
34; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
35; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
36; RV32I-ILP32E-NEXT:    addi s0, sp, 16
37; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
38; RV32I-ILP32E-NEXT:    andi sp, sp, -16
39; RV32I-ILP32E-NEXT:    mv a0, sp
40; RV32I-ILP32E-NEXT:    call callee
41; RV32I-ILP32E-NEXT:    addi sp, s0, -16
42; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 16
43; RV32I-ILP32E-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
44; RV32I-ILP32E-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
45; RV32I-ILP32E-NEXT:    .cfi_restore ra
46; RV32I-ILP32E-NEXT:    .cfi_restore s0
47; RV32I-ILP32E-NEXT:    addi sp, sp, 16
48; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
49; RV32I-ILP32E-NEXT:    ret
50;
51; RV64I-LABEL: caller16:
52; RV64I:       # %bb.0:
53; RV64I-NEXT:    addi sp, sp, -16
54; RV64I-NEXT:    .cfi_def_cfa_offset 16
55; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
56; RV64I-NEXT:    .cfi_offset ra, -8
57; RV64I-NEXT:    mv a0, sp
58; RV64I-NEXT:    call callee
59; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
60; RV64I-NEXT:    .cfi_restore ra
61; RV64I-NEXT:    addi sp, sp, 16
62; RV64I-NEXT:    .cfi_def_cfa_offset 0
63; RV64I-NEXT:    ret
64;
65; RV64I-LP64E-LABEL: caller16:
66; RV64I-LP64E:       # %bb.0:
67; RV64I-LP64E-NEXT:    addi sp, sp, -32
68; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 32
69; RV64I-LP64E-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
70; RV64I-LP64E-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
71; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
72; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
73; RV64I-LP64E-NEXT:    addi s0, sp, 32
74; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
75; RV64I-LP64E-NEXT:    andi sp, sp, -16
76; RV64I-LP64E-NEXT:    mv a0, sp
77; RV64I-LP64E-NEXT:    call callee
78; RV64I-LP64E-NEXT:    addi sp, s0, -32
79; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 32
80; RV64I-LP64E-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
81; RV64I-LP64E-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
82; RV64I-LP64E-NEXT:    .cfi_restore ra
83; RV64I-LP64E-NEXT:    .cfi_restore s0
84; RV64I-LP64E-NEXT:    addi sp, sp, 32
85; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
86; RV64I-LP64E-NEXT:    ret
87  %1 = alloca i8, align 16
88  call void @callee(ptr %1)
89  ret void
90}
91
92define void @caller_no_realign16() "no-realign-stack" {
93; RV32I-LABEL: caller_no_realign16:
94; RV32I:       # %bb.0:
95; RV32I-NEXT:    addi sp, sp, -16
96; RV32I-NEXT:    .cfi_def_cfa_offset 16
97; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
98; RV32I-NEXT:    .cfi_offset ra, -4
99; RV32I-NEXT:    mv a0, sp
100; RV32I-NEXT:    call callee
101; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
102; RV32I-NEXT:    .cfi_restore ra
103; RV32I-NEXT:    addi sp, sp, 16
104; RV32I-NEXT:    .cfi_def_cfa_offset 0
105; RV32I-NEXT:    ret
106;
107; RV32I-ILP32E-LABEL: caller_no_realign16:
108; RV32I-ILP32E:       # %bb.0:
109; RV32I-ILP32E-NEXT:    addi sp, sp, -8
110; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
111; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
112; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
113; RV32I-ILP32E-NEXT:    mv a0, sp
114; RV32I-ILP32E-NEXT:    call callee
115; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
116; RV32I-ILP32E-NEXT:    .cfi_restore ra
117; RV32I-ILP32E-NEXT:    addi sp, sp, 8
118; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
119; RV32I-ILP32E-NEXT:    ret
120;
121; RV64I-LABEL: caller_no_realign16:
122; RV64I:       # %bb.0:
123; RV64I-NEXT:    addi sp, sp, -16
124; RV64I-NEXT:    .cfi_def_cfa_offset 16
125; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
126; RV64I-NEXT:    .cfi_offset ra, -8
127; RV64I-NEXT:    mv a0, sp
128; RV64I-NEXT:    call callee
129; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
130; RV64I-NEXT:    .cfi_restore ra
131; RV64I-NEXT:    addi sp, sp, 16
132; RV64I-NEXT:    .cfi_def_cfa_offset 0
133; RV64I-NEXT:    ret
134;
135; RV64I-LP64E-LABEL: caller_no_realign16:
136; RV64I-LP64E:       # %bb.0:
137; RV64I-LP64E-NEXT:    addi sp, sp, -16
138; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
139; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
140; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
141; RV64I-LP64E-NEXT:    mv a0, sp
142; RV64I-LP64E-NEXT:    call callee
143; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
144; RV64I-LP64E-NEXT:    .cfi_restore ra
145; RV64I-LP64E-NEXT:    addi sp, sp, 16
146; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
147; RV64I-LP64E-NEXT:    ret
148  %1 = alloca i8, align 16
149  call void @callee(ptr %1)
150  ret void
151}
152
153define void @caller32() {
154; RV32I-LABEL: caller32:
155; RV32I:       # %bb.0:
156; RV32I-NEXT:    addi sp, sp, -32
157; RV32I-NEXT:    .cfi_def_cfa_offset 32
158; RV32I-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
159; RV32I-NEXT:    sw s0, 24(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, 32
163; RV32I-NEXT:    .cfi_def_cfa s0, 0
164; RV32I-NEXT:    andi sp, sp, -32
165; RV32I-NEXT:    mv a0, sp
166; RV32I-NEXT:    call callee
167; RV32I-NEXT:    addi sp, s0, -32
168; RV32I-NEXT:    .cfi_def_cfa sp, 32
169; RV32I-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
170; RV32I-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
171; RV32I-NEXT:    .cfi_restore ra
172; RV32I-NEXT:    .cfi_restore s0
173; RV32I-NEXT:    addi sp, sp, 32
174; RV32I-NEXT:    .cfi_def_cfa_offset 0
175; RV32I-NEXT:    ret
176;
177; RV32I-ILP32E-LABEL: caller32:
178; RV32I-ILP32E:       # %bb.0:
179; RV32I-ILP32E-NEXT:    addi sp, sp, -32
180; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 32
181; RV32I-ILP32E-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
182; RV32I-ILP32E-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
183; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
184; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
185; RV32I-ILP32E-NEXT:    addi s0, sp, 32
186; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
187; RV32I-ILP32E-NEXT:    andi sp, sp, -32
188; RV32I-ILP32E-NEXT:    mv a0, sp
189; RV32I-ILP32E-NEXT:    call callee
190; RV32I-ILP32E-NEXT:    addi sp, s0, -32
191; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 32
192; RV32I-ILP32E-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
193; RV32I-ILP32E-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
194; RV32I-ILP32E-NEXT:    .cfi_restore ra
195; RV32I-ILP32E-NEXT:    .cfi_restore s0
196; RV32I-ILP32E-NEXT:    addi sp, sp, 32
197; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
198; RV32I-ILP32E-NEXT:    ret
199;
200; RV64I-LABEL: caller32:
201; RV64I:       # %bb.0:
202; RV64I-NEXT:    addi sp, sp, -32
203; RV64I-NEXT:    .cfi_def_cfa_offset 32
204; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
205; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
206; RV64I-NEXT:    .cfi_offset ra, -8
207; RV64I-NEXT:    .cfi_offset s0, -16
208; RV64I-NEXT:    addi s0, sp, 32
209; RV64I-NEXT:    .cfi_def_cfa s0, 0
210; RV64I-NEXT:    andi sp, sp, -32
211; RV64I-NEXT:    mv a0, sp
212; RV64I-NEXT:    call callee
213; RV64I-NEXT:    addi sp, s0, -32
214; RV64I-NEXT:    .cfi_def_cfa sp, 32
215; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
216; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
217; RV64I-NEXT:    .cfi_restore ra
218; RV64I-NEXT:    .cfi_restore s0
219; RV64I-NEXT:    addi sp, sp, 32
220; RV64I-NEXT:    .cfi_def_cfa_offset 0
221; RV64I-NEXT:    ret
222;
223; RV64I-LP64E-LABEL: caller32:
224; RV64I-LP64E:       # %bb.0:
225; RV64I-LP64E-NEXT:    addi sp, sp, -32
226; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 32
227; RV64I-LP64E-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
228; RV64I-LP64E-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
229; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
230; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
231; RV64I-LP64E-NEXT:    addi s0, sp, 32
232; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
233; RV64I-LP64E-NEXT:    andi sp, sp, -32
234; RV64I-LP64E-NEXT:    mv a0, sp
235; RV64I-LP64E-NEXT:    call callee
236; RV64I-LP64E-NEXT:    addi sp, s0, -32
237; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 32
238; RV64I-LP64E-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
239; RV64I-LP64E-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
240; RV64I-LP64E-NEXT:    .cfi_restore ra
241; RV64I-LP64E-NEXT:    .cfi_restore s0
242; RV64I-LP64E-NEXT:    addi sp, sp, 32
243; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
244; RV64I-LP64E-NEXT:    ret
245  %1 = alloca i8, align 32
246  call void @callee(ptr %1)
247  ret void
248}
249
250define void @caller_no_realign32() "no-realign-stack" {
251; RV32I-LABEL: caller_no_realign32:
252; RV32I:       # %bb.0:
253; RV32I-NEXT:    addi sp, sp, -16
254; RV32I-NEXT:    .cfi_def_cfa_offset 16
255; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
256; RV32I-NEXT:    .cfi_offset ra, -4
257; RV32I-NEXT:    mv a0, sp
258; RV32I-NEXT:    call callee
259; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
260; RV32I-NEXT:    .cfi_restore ra
261; RV32I-NEXT:    addi sp, sp, 16
262; RV32I-NEXT:    .cfi_def_cfa_offset 0
263; RV32I-NEXT:    ret
264;
265; RV32I-ILP32E-LABEL: caller_no_realign32:
266; RV32I-ILP32E:       # %bb.0:
267; RV32I-ILP32E-NEXT:    addi sp, sp, -8
268; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
269; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
270; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
271; RV32I-ILP32E-NEXT:    mv a0, sp
272; RV32I-ILP32E-NEXT:    call callee
273; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
274; RV32I-ILP32E-NEXT:    .cfi_restore ra
275; RV32I-ILP32E-NEXT:    addi sp, sp, 8
276; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
277; RV32I-ILP32E-NEXT:    ret
278;
279; RV64I-LABEL: caller_no_realign32:
280; RV64I:       # %bb.0:
281; RV64I-NEXT:    addi sp, sp, -16
282; RV64I-NEXT:    .cfi_def_cfa_offset 16
283; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
284; RV64I-NEXT:    .cfi_offset ra, -8
285; RV64I-NEXT:    mv a0, sp
286; RV64I-NEXT:    call callee
287; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
288; RV64I-NEXT:    .cfi_restore ra
289; RV64I-NEXT:    addi sp, sp, 16
290; RV64I-NEXT:    .cfi_def_cfa_offset 0
291; RV64I-NEXT:    ret
292;
293; RV64I-LP64E-LABEL: caller_no_realign32:
294; RV64I-LP64E:       # %bb.0:
295; RV64I-LP64E-NEXT:    addi sp, sp, -16
296; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
297; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
298; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
299; RV64I-LP64E-NEXT:    mv a0, sp
300; RV64I-LP64E-NEXT:    call callee
301; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
302; RV64I-LP64E-NEXT:    .cfi_restore ra
303; RV64I-LP64E-NEXT:    addi sp, sp, 16
304; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
305; RV64I-LP64E-NEXT:    ret
306  %1 = alloca i8, align 32
307  call void @callee(ptr %1)
308  ret void
309}
310
311define void @caller64() {
312; RV32I-LABEL: caller64:
313; RV32I:       # %bb.0:
314; RV32I-NEXT:    addi sp, sp, -64
315; RV32I-NEXT:    .cfi_def_cfa_offset 64
316; RV32I-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
317; RV32I-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
318; RV32I-NEXT:    .cfi_offset ra, -4
319; RV32I-NEXT:    .cfi_offset s0, -8
320; RV32I-NEXT:    addi s0, sp, 64
321; RV32I-NEXT:    .cfi_def_cfa s0, 0
322; RV32I-NEXT:    andi sp, sp, -64
323; RV32I-NEXT:    mv a0, sp
324; RV32I-NEXT:    call callee
325; RV32I-NEXT:    addi sp, s0, -64
326; RV32I-NEXT:    .cfi_def_cfa sp, 64
327; RV32I-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
328; RV32I-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
329; RV32I-NEXT:    .cfi_restore ra
330; RV32I-NEXT:    .cfi_restore s0
331; RV32I-NEXT:    addi sp, sp, 64
332; RV32I-NEXT:    .cfi_def_cfa_offset 0
333; RV32I-NEXT:    ret
334;
335; RV32I-ILP32E-LABEL: caller64:
336; RV32I-ILP32E:       # %bb.0:
337; RV32I-ILP32E-NEXT:    addi sp, sp, -64
338; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 64
339; RV32I-ILP32E-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
340; RV32I-ILP32E-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
341; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
342; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
343; RV32I-ILP32E-NEXT:    addi s0, sp, 64
344; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
345; RV32I-ILP32E-NEXT:    andi sp, sp, -64
346; RV32I-ILP32E-NEXT:    mv a0, sp
347; RV32I-ILP32E-NEXT:    call callee
348; RV32I-ILP32E-NEXT:    addi sp, s0, -64
349; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 64
350; RV32I-ILP32E-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
351; RV32I-ILP32E-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
352; RV32I-ILP32E-NEXT:    .cfi_restore ra
353; RV32I-ILP32E-NEXT:    .cfi_restore s0
354; RV32I-ILP32E-NEXT:    addi sp, sp, 64
355; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
356; RV32I-ILP32E-NEXT:    ret
357;
358; RV64I-LABEL: caller64:
359; RV64I:       # %bb.0:
360; RV64I-NEXT:    addi sp, sp, -64
361; RV64I-NEXT:    .cfi_def_cfa_offset 64
362; RV64I-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
363; RV64I-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
364; RV64I-NEXT:    .cfi_offset ra, -8
365; RV64I-NEXT:    .cfi_offset s0, -16
366; RV64I-NEXT:    addi s0, sp, 64
367; RV64I-NEXT:    .cfi_def_cfa s0, 0
368; RV64I-NEXT:    andi sp, sp, -64
369; RV64I-NEXT:    mv a0, sp
370; RV64I-NEXT:    call callee
371; RV64I-NEXT:    addi sp, s0, -64
372; RV64I-NEXT:    .cfi_def_cfa sp, 64
373; RV64I-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
374; RV64I-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
375; RV64I-NEXT:    .cfi_restore ra
376; RV64I-NEXT:    .cfi_restore s0
377; RV64I-NEXT:    addi sp, sp, 64
378; RV64I-NEXT:    .cfi_def_cfa_offset 0
379; RV64I-NEXT:    ret
380;
381; RV64I-LP64E-LABEL: caller64:
382; RV64I-LP64E:       # %bb.0:
383; RV64I-LP64E-NEXT:    addi sp, sp, -64
384; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 64
385; RV64I-LP64E-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
386; RV64I-LP64E-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
387; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
388; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
389; RV64I-LP64E-NEXT:    addi s0, sp, 64
390; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
391; RV64I-LP64E-NEXT:    andi sp, sp, -64
392; RV64I-LP64E-NEXT:    mv a0, sp
393; RV64I-LP64E-NEXT:    call callee
394; RV64I-LP64E-NEXT:    addi sp, s0, -64
395; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 64
396; RV64I-LP64E-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
397; RV64I-LP64E-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
398; RV64I-LP64E-NEXT:    .cfi_restore ra
399; RV64I-LP64E-NEXT:    .cfi_restore s0
400; RV64I-LP64E-NEXT:    addi sp, sp, 64
401; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
402; RV64I-LP64E-NEXT:    ret
403  %1 = alloca i8, align 64
404  call void @callee(ptr %1)
405  ret void
406}
407
408define void @caller_no_realign64() "no-realign-stack" {
409; RV32I-LABEL: caller_no_realign64:
410; RV32I:       # %bb.0:
411; RV32I-NEXT:    addi sp, sp, -16
412; RV32I-NEXT:    .cfi_def_cfa_offset 16
413; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
414; RV32I-NEXT:    .cfi_offset ra, -4
415; RV32I-NEXT:    mv a0, sp
416; RV32I-NEXT:    call callee
417; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
418; RV32I-NEXT:    .cfi_restore ra
419; RV32I-NEXT:    addi sp, sp, 16
420; RV32I-NEXT:    .cfi_def_cfa_offset 0
421; RV32I-NEXT:    ret
422;
423; RV32I-ILP32E-LABEL: caller_no_realign64:
424; RV32I-ILP32E:       # %bb.0:
425; RV32I-ILP32E-NEXT:    addi sp, sp, -8
426; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
427; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
428; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
429; RV32I-ILP32E-NEXT:    mv a0, sp
430; RV32I-ILP32E-NEXT:    call callee
431; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
432; RV32I-ILP32E-NEXT:    .cfi_restore ra
433; RV32I-ILP32E-NEXT:    addi sp, sp, 8
434; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
435; RV32I-ILP32E-NEXT:    ret
436;
437; RV64I-LABEL: caller_no_realign64:
438; RV64I:       # %bb.0:
439; RV64I-NEXT:    addi sp, sp, -16
440; RV64I-NEXT:    .cfi_def_cfa_offset 16
441; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
442; RV64I-NEXT:    .cfi_offset ra, -8
443; RV64I-NEXT:    mv a0, sp
444; RV64I-NEXT:    call callee
445; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
446; RV64I-NEXT:    .cfi_restore ra
447; RV64I-NEXT:    addi sp, sp, 16
448; RV64I-NEXT:    .cfi_def_cfa_offset 0
449; RV64I-NEXT:    ret
450;
451; RV64I-LP64E-LABEL: caller_no_realign64:
452; RV64I-LP64E:       # %bb.0:
453; RV64I-LP64E-NEXT:    addi sp, sp, -16
454; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
455; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
456; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
457; RV64I-LP64E-NEXT:    mv a0, sp
458; RV64I-LP64E-NEXT:    call callee
459; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
460; RV64I-LP64E-NEXT:    .cfi_restore ra
461; RV64I-LP64E-NEXT:    addi sp, sp, 16
462; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
463; RV64I-LP64E-NEXT:    ret
464  %1 = alloca i8, align 64
465  call void @callee(ptr %1)
466  ret void
467}
468
469define void @caller128() {
470; RV32I-LABEL: caller128:
471; RV32I:       # %bb.0:
472; RV32I-NEXT:    addi sp, sp, -128
473; RV32I-NEXT:    .cfi_def_cfa_offset 128
474; RV32I-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
475; RV32I-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
476; RV32I-NEXT:    .cfi_offset ra, -4
477; RV32I-NEXT:    .cfi_offset s0, -8
478; RV32I-NEXT:    addi s0, sp, 128
479; RV32I-NEXT:    .cfi_def_cfa s0, 0
480; RV32I-NEXT:    andi sp, sp, -128
481; RV32I-NEXT:    mv a0, sp
482; RV32I-NEXT:    call callee
483; RV32I-NEXT:    addi sp, s0, -128
484; RV32I-NEXT:    .cfi_def_cfa sp, 128
485; RV32I-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
486; RV32I-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
487; RV32I-NEXT:    .cfi_restore ra
488; RV32I-NEXT:    .cfi_restore s0
489; RV32I-NEXT:    addi sp, sp, 128
490; RV32I-NEXT:    .cfi_def_cfa_offset 0
491; RV32I-NEXT:    ret
492;
493; RV32I-ILP32E-LABEL: caller128:
494; RV32I-ILP32E:       # %bb.0:
495; RV32I-ILP32E-NEXT:    addi sp, sp, -128
496; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 128
497; RV32I-ILP32E-NEXT:    sw ra, 124(sp) # 4-byte Folded Spill
498; RV32I-ILP32E-NEXT:    sw s0, 120(sp) # 4-byte Folded Spill
499; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
500; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
501; RV32I-ILP32E-NEXT:    addi s0, sp, 128
502; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
503; RV32I-ILP32E-NEXT:    andi sp, sp, -128
504; RV32I-ILP32E-NEXT:    mv a0, sp
505; RV32I-ILP32E-NEXT:    call callee
506; RV32I-ILP32E-NEXT:    addi sp, s0, -128
507; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 128
508; RV32I-ILP32E-NEXT:    lw ra, 124(sp) # 4-byte Folded Reload
509; RV32I-ILP32E-NEXT:    lw s0, 120(sp) # 4-byte Folded Reload
510; RV32I-ILP32E-NEXT:    .cfi_restore ra
511; RV32I-ILP32E-NEXT:    .cfi_restore s0
512; RV32I-ILP32E-NEXT:    addi sp, sp, 128
513; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
514; RV32I-ILP32E-NEXT:    ret
515;
516; RV64I-LABEL: caller128:
517; RV64I:       # %bb.0:
518; RV64I-NEXT:    addi sp, sp, -128
519; RV64I-NEXT:    .cfi_def_cfa_offset 128
520; RV64I-NEXT:    sd ra, 120(sp) # 8-byte Folded Spill
521; RV64I-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
522; RV64I-NEXT:    .cfi_offset ra, -8
523; RV64I-NEXT:    .cfi_offset s0, -16
524; RV64I-NEXT:    addi s0, sp, 128
525; RV64I-NEXT:    .cfi_def_cfa s0, 0
526; RV64I-NEXT:    andi sp, sp, -128
527; RV64I-NEXT:    mv a0, sp
528; RV64I-NEXT:    call callee
529; RV64I-NEXT:    addi sp, s0, -128
530; RV64I-NEXT:    .cfi_def_cfa sp, 128
531; RV64I-NEXT:    ld ra, 120(sp) # 8-byte Folded Reload
532; RV64I-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
533; RV64I-NEXT:    .cfi_restore ra
534; RV64I-NEXT:    .cfi_restore s0
535; RV64I-NEXT:    addi sp, sp, 128
536; RV64I-NEXT:    .cfi_def_cfa_offset 0
537; RV64I-NEXT:    ret
538;
539; RV64I-LP64E-LABEL: caller128:
540; RV64I-LP64E:       # %bb.0:
541; RV64I-LP64E-NEXT:    addi sp, sp, -128
542; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 128
543; RV64I-LP64E-NEXT:    sd ra, 120(sp) # 8-byte Folded Spill
544; RV64I-LP64E-NEXT:    sd s0, 112(sp) # 8-byte Folded Spill
545; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
546; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
547; RV64I-LP64E-NEXT:    addi s0, sp, 128
548; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
549; RV64I-LP64E-NEXT:    andi sp, sp, -128
550; RV64I-LP64E-NEXT:    mv a0, sp
551; RV64I-LP64E-NEXT:    call callee
552; RV64I-LP64E-NEXT:    addi sp, s0, -128
553; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 128
554; RV64I-LP64E-NEXT:    ld ra, 120(sp) # 8-byte Folded Reload
555; RV64I-LP64E-NEXT:    ld s0, 112(sp) # 8-byte Folded Reload
556; RV64I-LP64E-NEXT:    .cfi_restore ra
557; RV64I-LP64E-NEXT:    .cfi_restore s0
558; RV64I-LP64E-NEXT:    addi sp, sp, 128
559; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
560; RV64I-LP64E-NEXT:    ret
561  %1 = alloca i8, align 128
562  call void @callee(ptr %1)
563  ret void
564}
565
566define void @caller_no_realign128() "no-realign-stack" {
567; RV32I-LABEL: caller_no_realign128:
568; RV32I:       # %bb.0:
569; RV32I-NEXT:    addi sp, sp, -16
570; RV32I-NEXT:    .cfi_def_cfa_offset 16
571; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
572; RV32I-NEXT:    .cfi_offset ra, -4
573; RV32I-NEXT:    mv a0, sp
574; RV32I-NEXT:    call callee
575; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
576; RV32I-NEXT:    .cfi_restore ra
577; RV32I-NEXT:    addi sp, sp, 16
578; RV32I-NEXT:    .cfi_def_cfa_offset 0
579; RV32I-NEXT:    ret
580;
581; RV32I-ILP32E-LABEL: caller_no_realign128:
582; RV32I-ILP32E:       # %bb.0:
583; RV32I-ILP32E-NEXT:    addi sp, sp, -8
584; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
585; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
586; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
587; RV32I-ILP32E-NEXT:    mv a0, sp
588; RV32I-ILP32E-NEXT:    call callee
589; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
590; RV32I-ILP32E-NEXT:    .cfi_restore ra
591; RV32I-ILP32E-NEXT:    addi sp, sp, 8
592; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
593; RV32I-ILP32E-NEXT:    ret
594;
595; RV64I-LABEL: caller_no_realign128:
596; RV64I:       # %bb.0:
597; RV64I-NEXT:    addi sp, sp, -16
598; RV64I-NEXT:    .cfi_def_cfa_offset 16
599; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
600; RV64I-NEXT:    .cfi_offset ra, -8
601; RV64I-NEXT:    mv a0, sp
602; RV64I-NEXT:    call callee
603; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
604; RV64I-NEXT:    .cfi_restore ra
605; RV64I-NEXT:    addi sp, sp, 16
606; RV64I-NEXT:    .cfi_def_cfa_offset 0
607; RV64I-NEXT:    ret
608;
609; RV64I-LP64E-LABEL: caller_no_realign128:
610; RV64I-LP64E:       # %bb.0:
611; RV64I-LP64E-NEXT:    addi sp, sp, -16
612; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
613; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
614; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
615; RV64I-LP64E-NEXT:    mv a0, sp
616; RV64I-LP64E-NEXT:    call callee
617; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
618; RV64I-LP64E-NEXT:    .cfi_restore ra
619; RV64I-LP64E-NEXT:    addi sp, sp, 16
620; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
621; RV64I-LP64E-NEXT:    ret
622  %1 = alloca i8, align 128
623  call void @callee(ptr %1)
624  ret void
625}
626
627define void @caller256() {
628; RV32I-LABEL: caller256:
629; RV32I:       # %bb.0:
630; RV32I-NEXT:    addi sp, sp, -256
631; RV32I-NEXT:    .cfi_def_cfa_offset 256
632; RV32I-NEXT:    sw ra, 252(sp) # 4-byte Folded Spill
633; RV32I-NEXT:    sw s0, 248(sp) # 4-byte Folded Spill
634; RV32I-NEXT:    .cfi_offset ra, -4
635; RV32I-NEXT:    .cfi_offset s0, -8
636; RV32I-NEXT:    addi s0, sp, 256
637; RV32I-NEXT:    .cfi_def_cfa s0, 0
638; RV32I-NEXT:    andi sp, sp, -256
639; RV32I-NEXT:    mv a0, sp
640; RV32I-NEXT:    call callee
641; RV32I-NEXT:    addi sp, s0, -256
642; RV32I-NEXT:    .cfi_def_cfa sp, 256
643; RV32I-NEXT:    lw ra, 252(sp) # 4-byte Folded Reload
644; RV32I-NEXT:    lw s0, 248(sp) # 4-byte Folded Reload
645; RV32I-NEXT:    .cfi_restore ra
646; RV32I-NEXT:    .cfi_restore s0
647; RV32I-NEXT:    addi sp, sp, 256
648; RV32I-NEXT:    .cfi_def_cfa_offset 0
649; RV32I-NEXT:    ret
650;
651; RV32I-ILP32E-LABEL: caller256:
652; RV32I-ILP32E:       # %bb.0:
653; RV32I-ILP32E-NEXT:    addi sp, sp, -256
654; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 256
655; RV32I-ILP32E-NEXT:    sw ra, 252(sp) # 4-byte Folded Spill
656; RV32I-ILP32E-NEXT:    sw s0, 248(sp) # 4-byte Folded Spill
657; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
658; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
659; RV32I-ILP32E-NEXT:    addi s0, sp, 256
660; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
661; RV32I-ILP32E-NEXT:    andi sp, sp, -256
662; RV32I-ILP32E-NEXT:    mv a0, sp
663; RV32I-ILP32E-NEXT:    call callee
664; RV32I-ILP32E-NEXT:    addi sp, s0, -256
665; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 256
666; RV32I-ILP32E-NEXT:    lw ra, 252(sp) # 4-byte Folded Reload
667; RV32I-ILP32E-NEXT:    lw s0, 248(sp) # 4-byte Folded Reload
668; RV32I-ILP32E-NEXT:    .cfi_restore ra
669; RV32I-ILP32E-NEXT:    .cfi_restore s0
670; RV32I-ILP32E-NEXT:    addi sp, sp, 256
671; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
672; RV32I-ILP32E-NEXT:    ret
673;
674; RV64I-LABEL: caller256:
675; RV64I:       # %bb.0:
676; RV64I-NEXT:    addi sp, sp, -256
677; RV64I-NEXT:    .cfi_def_cfa_offset 256
678; RV64I-NEXT:    sd ra, 248(sp) # 8-byte Folded Spill
679; RV64I-NEXT:    sd s0, 240(sp) # 8-byte Folded Spill
680; RV64I-NEXT:    .cfi_offset ra, -8
681; RV64I-NEXT:    .cfi_offset s0, -16
682; RV64I-NEXT:    addi s0, sp, 256
683; RV64I-NEXT:    .cfi_def_cfa s0, 0
684; RV64I-NEXT:    andi sp, sp, -256
685; RV64I-NEXT:    mv a0, sp
686; RV64I-NEXT:    call callee
687; RV64I-NEXT:    addi sp, s0, -256
688; RV64I-NEXT:    .cfi_def_cfa sp, 256
689; RV64I-NEXT:    ld ra, 248(sp) # 8-byte Folded Reload
690; RV64I-NEXT:    ld s0, 240(sp) # 8-byte Folded Reload
691; RV64I-NEXT:    .cfi_restore ra
692; RV64I-NEXT:    .cfi_restore s0
693; RV64I-NEXT:    addi sp, sp, 256
694; RV64I-NEXT:    .cfi_def_cfa_offset 0
695; RV64I-NEXT:    ret
696;
697; RV64I-LP64E-LABEL: caller256:
698; RV64I-LP64E:       # %bb.0:
699; RV64I-LP64E-NEXT:    addi sp, sp, -256
700; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 256
701; RV64I-LP64E-NEXT:    sd ra, 248(sp) # 8-byte Folded Spill
702; RV64I-LP64E-NEXT:    sd s0, 240(sp) # 8-byte Folded Spill
703; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
704; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
705; RV64I-LP64E-NEXT:    addi s0, sp, 256
706; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
707; RV64I-LP64E-NEXT:    andi sp, sp, -256
708; RV64I-LP64E-NEXT:    mv a0, sp
709; RV64I-LP64E-NEXT:    call callee
710; RV64I-LP64E-NEXT:    addi sp, s0, -256
711; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 256
712; RV64I-LP64E-NEXT:    ld ra, 248(sp) # 8-byte Folded Reload
713; RV64I-LP64E-NEXT:    ld s0, 240(sp) # 8-byte Folded Reload
714; RV64I-LP64E-NEXT:    .cfi_restore ra
715; RV64I-LP64E-NEXT:    .cfi_restore s0
716; RV64I-LP64E-NEXT:    addi sp, sp, 256
717; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
718; RV64I-LP64E-NEXT:    ret
719  %1 = alloca i8, align 256
720  call void @callee(ptr %1)
721  ret void
722}
723
724define void @caller_no_realign256() "no-realign-stack" {
725; RV32I-LABEL: caller_no_realign256:
726; RV32I:       # %bb.0:
727; RV32I-NEXT:    addi sp, sp, -16
728; RV32I-NEXT:    .cfi_def_cfa_offset 16
729; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
730; RV32I-NEXT:    .cfi_offset ra, -4
731; RV32I-NEXT:    mv a0, sp
732; RV32I-NEXT:    call callee
733; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
734; RV32I-NEXT:    .cfi_restore ra
735; RV32I-NEXT:    addi sp, sp, 16
736; RV32I-NEXT:    .cfi_def_cfa_offset 0
737; RV32I-NEXT:    ret
738;
739; RV32I-ILP32E-LABEL: caller_no_realign256:
740; RV32I-ILP32E:       # %bb.0:
741; RV32I-ILP32E-NEXT:    addi sp, sp, -8
742; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
743; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
744; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
745; RV32I-ILP32E-NEXT:    mv a0, sp
746; RV32I-ILP32E-NEXT:    call callee
747; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
748; RV32I-ILP32E-NEXT:    .cfi_restore ra
749; RV32I-ILP32E-NEXT:    addi sp, sp, 8
750; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
751; RV32I-ILP32E-NEXT:    ret
752;
753; RV64I-LABEL: caller_no_realign256:
754; RV64I:       # %bb.0:
755; RV64I-NEXT:    addi sp, sp, -16
756; RV64I-NEXT:    .cfi_def_cfa_offset 16
757; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
758; RV64I-NEXT:    .cfi_offset ra, -8
759; RV64I-NEXT:    mv a0, sp
760; RV64I-NEXT:    call callee
761; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
762; RV64I-NEXT:    .cfi_restore ra
763; RV64I-NEXT:    addi sp, sp, 16
764; RV64I-NEXT:    .cfi_def_cfa_offset 0
765; RV64I-NEXT:    ret
766;
767; RV64I-LP64E-LABEL: caller_no_realign256:
768; RV64I-LP64E:       # %bb.0:
769; RV64I-LP64E-NEXT:    addi sp, sp, -16
770; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
771; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
772; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
773; RV64I-LP64E-NEXT:    mv a0, sp
774; RV64I-LP64E-NEXT:    call callee
775; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
776; RV64I-LP64E-NEXT:    .cfi_restore ra
777; RV64I-LP64E-NEXT:    addi sp, sp, 16
778; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
779; RV64I-LP64E-NEXT:    ret
780  %1 = alloca i8, align 256
781  call void @callee(ptr %1)
782  ret void
783}
784
785define void @caller512() {
786; RV32I-LABEL: caller512:
787; RV32I:       # %bb.0:
788; RV32I-NEXT:    addi sp, sp, -1024
789; RV32I-NEXT:    .cfi_def_cfa_offset 1024
790; RV32I-NEXT:    sw ra, 1020(sp) # 4-byte Folded Spill
791; RV32I-NEXT:    sw s0, 1016(sp) # 4-byte Folded Spill
792; RV32I-NEXT:    .cfi_offset ra, -4
793; RV32I-NEXT:    .cfi_offset s0, -8
794; RV32I-NEXT:    addi s0, sp, 1024
795; RV32I-NEXT:    .cfi_def_cfa s0, 0
796; RV32I-NEXT:    andi sp, sp, -512
797; RV32I-NEXT:    addi a0, sp, 512
798; RV32I-NEXT:    call callee
799; RV32I-NEXT:    addi sp, s0, -1024
800; RV32I-NEXT:    .cfi_def_cfa sp, 1024
801; RV32I-NEXT:    lw ra, 1020(sp) # 4-byte Folded Reload
802; RV32I-NEXT:    lw s0, 1016(sp) # 4-byte Folded Reload
803; RV32I-NEXT:    .cfi_restore ra
804; RV32I-NEXT:    .cfi_restore s0
805; RV32I-NEXT:    addi sp, sp, 1024
806; RV32I-NEXT:    .cfi_def_cfa_offset 0
807; RV32I-NEXT:    ret
808;
809; RV32I-ILP32E-LABEL: caller512:
810; RV32I-ILP32E:       # %bb.0:
811; RV32I-ILP32E-NEXT:    addi sp, sp, -1024
812; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 1024
813; RV32I-ILP32E-NEXT:    sw ra, 1020(sp) # 4-byte Folded Spill
814; RV32I-ILP32E-NEXT:    sw s0, 1016(sp) # 4-byte Folded Spill
815; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
816; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
817; RV32I-ILP32E-NEXT:    addi s0, sp, 1024
818; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
819; RV32I-ILP32E-NEXT:    andi sp, sp, -512
820; RV32I-ILP32E-NEXT:    addi a0, sp, 512
821; RV32I-ILP32E-NEXT:    call callee
822; RV32I-ILP32E-NEXT:    addi sp, s0, -1024
823; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 1024
824; RV32I-ILP32E-NEXT:    lw ra, 1020(sp) # 4-byte Folded Reload
825; RV32I-ILP32E-NEXT:    lw s0, 1016(sp) # 4-byte Folded Reload
826; RV32I-ILP32E-NEXT:    .cfi_restore ra
827; RV32I-ILP32E-NEXT:    .cfi_restore s0
828; RV32I-ILP32E-NEXT:    addi sp, sp, 1024
829; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
830; RV32I-ILP32E-NEXT:    ret
831;
832; RV64I-LABEL: caller512:
833; RV64I:       # %bb.0:
834; RV64I-NEXT:    addi sp, sp, -1024
835; RV64I-NEXT:    .cfi_def_cfa_offset 1024
836; RV64I-NEXT:    sd ra, 1016(sp) # 8-byte Folded Spill
837; RV64I-NEXT:    sd s0, 1008(sp) # 8-byte Folded Spill
838; RV64I-NEXT:    .cfi_offset ra, -8
839; RV64I-NEXT:    .cfi_offset s0, -16
840; RV64I-NEXT:    addi s0, sp, 1024
841; RV64I-NEXT:    .cfi_def_cfa s0, 0
842; RV64I-NEXT:    andi sp, sp, -512
843; RV64I-NEXT:    addi a0, sp, 512
844; RV64I-NEXT:    call callee
845; RV64I-NEXT:    addi sp, s0, -1024
846; RV64I-NEXT:    .cfi_def_cfa sp, 1024
847; RV64I-NEXT:    ld ra, 1016(sp) # 8-byte Folded Reload
848; RV64I-NEXT:    ld s0, 1008(sp) # 8-byte Folded Reload
849; RV64I-NEXT:    .cfi_restore ra
850; RV64I-NEXT:    .cfi_restore s0
851; RV64I-NEXT:    addi sp, sp, 1024
852; RV64I-NEXT:    .cfi_def_cfa_offset 0
853; RV64I-NEXT:    ret
854;
855; RV64I-LP64E-LABEL: caller512:
856; RV64I-LP64E:       # %bb.0:
857; RV64I-LP64E-NEXT:    addi sp, sp, -1024
858; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 1024
859; RV64I-LP64E-NEXT:    sd ra, 1016(sp) # 8-byte Folded Spill
860; RV64I-LP64E-NEXT:    sd s0, 1008(sp) # 8-byte Folded Spill
861; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
862; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
863; RV64I-LP64E-NEXT:    addi s0, sp, 1024
864; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
865; RV64I-LP64E-NEXT:    andi sp, sp, -512
866; RV64I-LP64E-NEXT:    addi a0, sp, 512
867; RV64I-LP64E-NEXT:    call callee
868; RV64I-LP64E-NEXT:    addi sp, s0, -1024
869; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 1024
870; RV64I-LP64E-NEXT:    ld ra, 1016(sp) # 8-byte Folded Reload
871; RV64I-LP64E-NEXT:    ld s0, 1008(sp) # 8-byte Folded Reload
872; RV64I-LP64E-NEXT:    .cfi_restore ra
873; RV64I-LP64E-NEXT:    .cfi_restore s0
874; RV64I-LP64E-NEXT:    addi sp, sp, 1024
875; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
876; RV64I-LP64E-NEXT:    ret
877  %1 = alloca i8, align 512
878  call void @callee(ptr %1)
879  ret void
880}
881
882define void @caller_no_realign512() "no-realign-stack" {
883; RV32I-LABEL: caller_no_realign512:
884; RV32I:       # %bb.0:
885; RV32I-NEXT:    addi sp, sp, -16
886; RV32I-NEXT:    .cfi_def_cfa_offset 16
887; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
888; RV32I-NEXT:    .cfi_offset ra, -4
889; RV32I-NEXT:    mv a0, sp
890; RV32I-NEXT:    call callee
891; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
892; RV32I-NEXT:    .cfi_restore ra
893; RV32I-NEXT:    addi sp, sp, 16
894; RV32I-NEXT:    .cfi_def_cfa_offset 0
895; RV32I-NEXT:    ret
896;
897; RV32I-ILP32E-LABEL: caller_no_realign512:
898; RV32I-ILP32E:       # %bb.0:
899; RV32I-ILP32E-NEXT:    addi sp, sp, -8
900; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
901; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
902; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
903; RV32I-ILP32E-NEXT:    mv a0, sp
904; RV32I-ILP32E-NEXT:    call callee
905; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
906; RV32I-ILP32E-NEXT:    .cfi_restore ra
907; RV32I-ILP32E-NEXT:    addi sp, sp, 8
908; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
909; RV32I-ILP32E-NEXT:    ret
910;
911; RV64I-LABEL: caller_no_realign512:
912; RV64I:       # %bb.0:
913; RV64I-NEXT:    addi sp, sp, -16
914; RV64I-NEXT:    .cfi_def_cfa_offset 16
915; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
916; RV64I-NEXT:    .cfi_offset ra, -8
917; RV64I-NEXT:    mv a0, sp
918; RV64I-NEXT:    call callee
919; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
920; RV64I-NEXT:    .cfi_restore ra
921; RV64I-NEXT:    addi sp, sp, 16
922; RV64I-NEXT:    .cfi_def_cfa_offset 0
923; RV64I-NEXT:    ret
924;
925; RV64I-LP64E-LABEL: caller_no_realign512:
926; RV64I-LP64E:       # %bb.0:
927; RV64I-LP64E-NEXT:    addi sp, sp, -16
928; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
929; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
930; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
931; RV64I-LP64E-NEXT:    mv a0, sp
932; RV64I-LP64E-NEXT:    call callee
933; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
934; RV64I-LP64E-NEXT:    .cfi_restore ra
935; RV64I-LP64E-NEXT:    addi sp, sp, 16
936; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
937; RV64I-LP64E-NEXT:    ret
938  %1 = alloca i8, align 512
939  call void @callee(ptr %1)
940  ret void
941}
942
943define void @caller1024() {
944; RV32I-LABEL: caller1024:
945; RV32I:       # %bb.0:
946; RV32I-NEXT:    addi sp, sp, -2032
947; RV32I-NEXT:    .cfi_def_cfa_offset 2032
948; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
949; RV32I-NEXT:    sw s0, 2024(sp) # 4-byte Folded Spill
950; RV32I-NEXT:    .cfi_offset ra, -4
951; RV32I-NEXT:    .cfi_offset s0, -8
952; RV32I-NEXT:    addi s0, sp, 2032
953; RV32I-NEXT:    .cfi_def_cfa s0, 0
954; RV32I-NEXT:    addi sp, sp, -16
955; RV32I-NEXT:    andi sp, sp, -1024
956; RV32I-NEXT:    addi a0, sp, 1024
957; RV32I-NEXT:    call callee
958; RV32I-NEXT:    addi sp, s0, -2032
959; RV32I-NEXT:    .cfi_def_cfa sp, 2032
960; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
961; RV32I-NEXT:    lw s0, 2024(sp) # 4-byte Folded Reload
962; RV32I-NEXT:    .cfi_restore ra
963; RV32I-NEXT:    .cfi_restore s0
964; RV32I-NEXT:    addi sp, sp, 2032
965; RV32I-NEXT:    .cfi_def_cfa_offset 0
966; RV32I-NEXT:    ret
967;
968; RV32I-ILP32E-LABEL: caller1024:
969; RV32I-ILP32E:       # %bb.0:
970; RV32I-ILP32E-NEXT:    addi sp, sp, -2044
971; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 2044
972; RV32I-ILP32E-NEXT:    sw ra, 2040(sp) # 4-byte Folded Spill
973; RV32I-ILP32E-NEXT:    sw s0, 2036(sp) # 4-byte Folded Spill
974; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
975; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
976; RV32I-ILP32E-NEXT:    addi s0, sp, 2044
977; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
978; RV32I-ILP32E-NEXT:    addi sp, sp, -4
979; RV32I-ILP32E-NEXT:    andi sp, sp, -1024
980; RV32I-ILP32E-NEXT:    addi a0, sp, 1024
981; RV32I-ILP32E-NEXT:    call callee
982; RV32I-ILP32E-NEXT:    addi sp, s0, -2044
983; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 2044
984; RV32I-ILP32E-NEXT:    lw ra, 2040(sp) # 4-byte Folded Reload
985; RV32I-ILP32E-NEXT:    lw s0, 2036(sp) # 4-byte Folded Reload
986; RV32I-ILP32E-NEXT:    .cfi_restore ra
987; RV32I-ILP32E-NEXT:    .cfi_restore s0
988; RV32I-ILP32E-NEXT:    addi sp, sp, 2044
989; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
990; RV32I-ILP32E-NEXT:    ret
991;
992; RV64I-LABEL: caller1024:
993; RV64I:       # %bb.0:
994; RV64I-NEXT:    addi sp, sp, -2032
995; RV64I-NEXT:    .cfi_def_cfa_offset 2032
996; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
997; RV64I-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill
998; RV64I-NEXT:    .cfi_offset ra, -8
999; RV64I-NEXT:    .cfi_offset s0, -16
1000; RV64I-NEXT:    addi s0, sp, 2032
1001; RV64I-NEXT:    .cfi_def_cfa s0, 0
1002; RV64I-NEXT:    addi sp, sp, -16
1003; RV64I-NEXT:    andi sp, sp, -1024
1004; RV64I-NEXT:    addi a0, sp, 1024
1005; RV64I-NEXT:    call callee
1006; RV64I-NEXT:    addi sp, s0, -2032
1007; RV64I-NEXT:    .cfi_def_cfa sp, 2032
1008; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
1009; RV64I-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload
1010; RV64I-NEXT:    .cfi_restore ra
1011; RV64I-NEXT:    .cfi_restore s0
1012; RV64I-NEXT:    addi sp, sp, 2032
1013; RV64I-NEXT:    .cfi_def_cfa_offset 0
1014; RV64I-NEXT:    ret
1015;
1016; RV64I-LP64E-LABEL: caller1024:
1017; RV64I-LP64E:       # %bb.0:
1018; RV64I-LP64E-NEXT:    addi sp, sp, -2040
1019; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 2040
1020; RV64I-LP64E-NEXT:    sd ra, 2032(sp) # 8-byte Folded Spill
1021; RV64I-LP64E-NEXT:    sd s0, 2024(sp) # 8-byte Folded Spill
1022; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1023; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
1024; RV64I-LP64E-NEXT:    addi s0, sp, 2040
1025; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
1026; RV64I-LP64E-NEXT:    addi sp, sp, -8
1027; RV64I-LP64E-NEXT:    andi sp, sp, -1024
1028; RV64I-LP64E-NEXT:    addi a0, sp, 1024
1029; RV64I-LP64E-NEXT:    call callee
1030; RV64I-LP64E-NEXT:    addi sp, s0, -2040
1031; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 2040
1032; RV64I-LP64E-NEXT:    ld ra, 2032(sp) # 8-byte Folded Reload
1033; RV64I-LP64E-NEXT:    ld s0, 2024(sp) # 8-byte Folded Reload
1034; RV64I-LP64E-NEXT:    .cfi_restore ra
1035; RV64I-LP64E-NEXT:    .cfi_restore s0
1036; RV64I-LP64E-NEXT:    addi sp, sp, 2040
1037; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1038; RV64I-LP64E-NEXT:    ret
1039  %1 = alloca i8, align 1024
1040  call void @callee(ptr %1)
1041  ret void
1042}
1043
1044define void @caller_no_realign1024() "no-realign-stack" {
1045; RV32I-LABEL: caller_no_realign1024:
1046; RV32I:       # %bb.0:
1047; RV32I-NEXT:    addi sp, sp, -16
1048; RV32I-NEXT:    .cfi_def_cfa_offset 16
1049; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1050; RV32I-NEXT:    .cfi_offset ra, -4
1051; RV32I-NEXT:    mv a0, sp
1052; RV32I-NEXT:    call callee
1053; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1054; RV32I-NEXT:    .cfi_restore ra
1055; RV32I-NEXT:    addi sp, sp, 16
1056; RV32I-NEXT:    .cfi_def_cfa_offset 0
1057; RV32I-NEXT:    ret
1058;
1059; RV32I-ILP32E-LABEL: caller_no_realign1024:
1060; RV32I-ILP32E:       # %bb.0:
1061; RV32I-ILP32E-NEXT:    addi sp, sp, -8
1062; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
1063; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1064; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
1065; RV32I-ILP32E-NEXT:    mv a0, sp
1066; RV32I-ILP32E-NEXT:    call callee
1067; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1068; RV32I-ILP32E-NEXT:    .cfi_restore ra
1069; RV32I-ILP32E-NEXT:    addi sp, sp, 8
1070; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
1071; RV32I-ILP32E-NEXT:    ret
1072;
1073; RV64I-LABEL: caller_no_realign1024:
1074; RV64I:       # %bb.0:
1075; RV64I-NEXT:    addi sp, sp, -16
1076; RV64I-NEXT:    .cfi_def_cfa_offset 16
1077; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1078; RV64I-NEXT:    .cfi_offset ra, -8
1079; RV64I-NEXT:    mv a0, sp
1080; RV64I-NEXT:    call callee
1081; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1082; RV64I-NEXT:    .cfi_restore ra
1083; RV64I-NEXT:    addi sp, sp, 16
1084; RV64I-NEXT:    .cfi_def_cfa_offset 0
1085; RV64I-NEXT:    ret
1086;
1087; RV64I-LP64E-LABEL: caller_no_realign1024:
1088; RV64I-LP64E:       # %bb.0:
1089; RV64I-LP64E-NEXT:    addi sp, sp, -16
1090; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
1091; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1092; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1093; RV64I-LP64E-NEXT:    mv a0, sp
1094; RV64I-LP64E-NEXT:    call callee
1095; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1096; RV64I-LP64E-NEXT:    .cfi_restore ra
1097; RV64I-LP64E-NEXT:    addi sp, sp, 16
1098; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1099; RV64I-LP64E-NEXT:    ret
1100  %1 = alloca i8, align 1024
1101  call void @callee(ptr %1)
1102  ret void
1103}
1104
1105define void @caller2048() {
1106; RV32I-LABEL: caller2048:
1107; RV32I:       # %bb.0:
1108; RV32I-NEXT:    addi sp, sp, -2032
1109; RV32I-NEXT:    .cfi_def_cfa_offset 2032
1110; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
1111; RV32I-NEXT:    sw s0, 2024(sp) # 4-byte Folded Spill
1112; RV32I-NEXT:    .cfi_offset ra, -4
1113; RV32I-NEXT:    .cfi_offset s0, -8
1114; RV32I-NEXT:    addi s0, sp, 2032
1115; RV32I-NEXT:    .cfi_def_cfa s0, 0
1116; RV32I-NEXT:    addi sp, sp, -2048
1117; RV32I-NEXT:    addi sp, sp, -16
1118; RV32I-NEXT:    andi sp, sp, -2048
1119; RV32I-NEXT:    addi a0, sp, 2047
1120; RV32I-NEXT:    addi a0, a0, 1
1121; RV32I-NEXT:    call callee
1122; RV32I-NEXT:    addi sp, s0, -2032
1123; RV32I-NEXT:    .cfi_def_cfa sp, 2032
1124; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
1125; RV32I-NEXT:    lw s0, 2024(sp) # 4-byte Folded Reload
1126; RV32I-NEXT:    .cfi_restore ra
1127; RV32I-NEXT:    .cfi_restore s0
1128; RV32I-NEXT:    addi sp, sp, 2032
1129; RV32I-NEXT:    .cfi_def_cfa_offset 0
1130; RV32I-NEXT:    ret
1131;
1132; RV32I-ILP32E-LABEL: caller2048:
1133; RV32I-ILP32E:       # %bb.0:
1134; RV32I-ILP32E-NEXT:    addi sp, sp, -2044
1135; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 2044
1136; RV32I-ILP32E-NEXT:    sw ra, 2040(sp) # 4-byte Folded Spill
1137; RV32I-ILP32E-NEXT:    sw s0, 2036(sp) # 4-byte Folded Spill
1138; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
1139; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
1140; RV32I-ILP32E-NEXT:    addi s0, sp, 2044
1141; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
1142; RV32I-ILP32E-NEXT:    addi sp, sp, -2048
1143; RV32I-ILP32E-NEXT:    addi sp, sp, -4
1144; RV32I-ILP32E-NEXT:    andi sp, sp, -2048
1145; RV32I-ILP32E-NEXT:    addi a0, sp, 2047
1146; RV32I-ILP32E-NEXT:    addi a0, a0, 1
1147; RV32I-ILP32E-NEXT:    call callee
1148; RV32I-ILP32E-NEXT:    addi sp, s0, -2044
1149; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 2044
1150; RV32I-ILP32E-NEXT:    lw ra, 2040(sp) # 4-byte Folded Reload
1151; RV32I-ILP32E-NEXT:    lw s0, 2036(sp) # 4-byte Folded Reload
1152; RV32I-ILP32E-NEXT:    .cfi_restore ra
1153; RV32I-ILP32E-NEXT:    .cfi_restore s0
1154; RV32I-ILP32E-NEXT:    addi sp, sp, 2044
1155; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
1156; RV32I-ILP32E-NEXT:    ret
1157;
1158; RV64I-LABEL: caller2048:
1159; RV64I:       # %bb.0:
1160; RV64I-NEXT:    addi sp, sp, -2032
1161; RV64I-NEXT:    .cfi_def_cfa_offset 2032
1162; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
1163; RV64I-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill
1164; RV64I-NEXT:    .cfi_offset ra, -8
1165; RV64I-NEXT:    .cfi_offset s0, -16
1166; RV64I-NEXT:    addi s0, sp, 2032
1167; RV64I-NEXT:    .cfi_def_cfa s0, 0
1168; RV64I-NEXT:    addi sp, sp, -2048
1169; RV64I-NEXT:    addi sp, sp, -16
1170; RV64I-NEXT:    andi sp, sp, -2048
1171; RV64I-NEXT:    addi a0, sp, 2047
1172; RV64I-NEXT:    addi a0, a0, 1
1173; RV64I-NEXT:    call callee
1174; RV64I-NEXT:    addi sp, s0, -2032
1175; RV64I-NEXT:    .cfi_def_cfa sp, 2032
1176; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
1177; RV64I-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload
1178; RV64I-NEXT:    .cfi_restore ra
1179; RV64I-NEXT:    .cfi_restore s0
1180; RV64I-NEXT:    addi sp, sp, 2032
1181; RV64I-NEXT:    .cfi_def_cfa_offset 0
1182; RV64I-NEXT:    ret
1183;
1184; RV64I-LP64E-LABEL: caller2048:
1185; RV64I-LP64E:       # %bb.0:
1186; RV64I-LP64E-NEXT:    addi sp, sp, -2040
1187; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 2040
1188; RV64I-LP64E-NEXT:    sd ra, 2032(sp) # 8-byte Folded Spill
1189; RV64I-LP64E-NEXT:    sd s0, 2024(sp) # 8-byte Folded Spill
1190; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1191; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
1192; RV64I-LP64E-NEXT:    addi s0, sp, 2040
1193; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
1194; RV64I-LP64E-NEXT:    addi sp, sp, -2048
1195; RV64I-LP64E-NEXT:    addi sp, sp, -8
1196; RV64I-LP64E-NEXT:    andi sp, sp, -2048
1197; RV64I-LP64E-NEXT:    addi a0, sp, 2047
1198; RV64I-LP64E-NEXT:    addi a0, a0, 1
1199; RV64I-LP64E-NEXT:    call callee
1200; RV64I-LP64E-NEXT:    addi sp, s0, -2040
1201; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 2040
1202; RV64I-LP64E-NEXT:    ld ra, 2032(sp) # 8-byte Folded Reload
1203; RV64I-LP64E-NEXT:    ld s0, 2024(sp) # 8-byte Folded Reload
1204; RV64I-LP64E-NEXT:    .cfi_restore ra
1205; RV64I-LP64E-NEXT:    .cfi_restore s0
1206; RV64I-LP64E-NEXT:    addi sp, sp, 2040
1207; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1208; RV64I-LP64E-NEXT:    ret
1209  %1 = alloca i8, align 2048
1210  call void @callee(ptr %1)
1211  ret void
1212}
1213
1214define void @caller_no_realign2048() "no-realign-stack" {
1215; RV32I-LABEL: caller_no_realign2048:
1216; RV32I:       # %bb.0:
1217; RV32I-NEXT:    addi sp, sp, -16
1218; RV32I-NEXT:    .cfi_def_cfa_offset 16
1219; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1220; RV32I-NEXT:    .cfi_offset ra, -4
1221; RV32I-NEXT:    mv a0, sp
1222; RV32I-NEXT:    call callee
1223; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1224; RV32I-NEXT:    .cfi_restore ra
1225; RV32I-NEXT:    addi sp, sp, 16
1226; RV32I-NEXT:    .cfi_def_cfa_offset 0
1227; RV32I-NEXT:    ret
1228;
1229; RV32I-ILP32E-LABEL: caller_no_realign2048:
1230; RV32I-ILP32E:       # %bb.0:
1231; RV32I-ILP32E-NEXT:    addi sp, sp, -8
1232; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
1233; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1234; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
1235; RV32I-ILP32E-NEXT:    mv a0, sp
1236; RV32I-ILP32E-NEXT:    call callee
1237; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1238; RV32I-ILP32E-NEXT:    .cfi_restore ra
1239; RV32I-ILP32E-NEXT:    addi sp, sp, 8
1240; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
1241; RV32I-ILP32E-NEXT:    ret
1242;
1243; RV64I-LABEL: caller_no_realign2048:
1244; RV64I:       # %bb.0:
1245; RV64I-NEXT:    addi sp, sp, -16
1246; RV64I-NEXT:    .cfi_def_cfa_offset 16
1247; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1248; RV64I-NEXT:    .cfi_offset ra, -8
1249; RV64I-NEXT:    mv a0, sp
1250; RV64I-NEXT:    call callee
1251; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1252; RV64I-NEXT:    .cfi_restore ra
1253; RV64I-NEXT:    addi sp, sp, 16
1254; RV64I-NEXT:    .cfi_def_cfa_offset 0
1255; RV64I-NEXT:    ret
1256;
1257; RV64I-LP64E-LABEL: caller_no_realign2048:
1258; RV64I-LP64E:       # %bb.0:
1259; RV64I-LP64E-NEXT:    addi sp, sp, -16
1260; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
1261; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1262; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1263; RV64I-LP64E-NEXT:    mv a0, sp
1264; RV64I-LP64E-NEXT:    call callee
1265; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1266; RV64I-LP64E-NEXT:    .cfi_restore ra
1267; RV64I-LP64E-NEXT:    addi sp, sp, 16
1268; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1269; RV64I-LP64E-NEXT:    ret
1270  %1 = alloca i8, align 2048
1271  call void @callee(ptr %1)
1272  ret void
1273}
1274
1275define void @caller4096() {
1276; RV32I-LABEL: caller4096:
1277; RV32I:       # %bb.0:
1278; RV32I-NEXT:    addi sp, sp, -2032
1279; RV32I-NEXT:    .cfi_def_cfa_offset 2032
1280; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
1281; RV32I-NEXT:    sw s0, 2024(sp) # 4-byte Folded Spill
1282; RV32I-NEXT:    .cfi_offset ra, -4
1283; RV32I-NEXT:    .cfi_offset s0, -8
1284; RV32I-NEXT:    addi s0, sp, 2032
1285; RV32I-NEXT:    .cfi_def_cfa s0, 0
1286; RV32I-NEXT:    lui a0, 2
1287; RV32I-NEXT:    addi a0, a0, -2032
1288; RV32I-NEXT:    sub sp, sp, a0
1289; RV32I-NEXT:    srli a0, sp, 12
1290; RV32I-NEXT:    slli sp, a0, 12
1291; RV32I-NEXT:    lui a0, 1
1292; RV32I-NEXT:    add a0, sp, a0
1293; RV32I-NEXT:    call callee
1294; RV32I-NEXT:    addi sp, s0, -2032
1295; RV32I-NEXT:    .cfi_def_cfa sp, 2032
1296; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
1297; RV32I-NEXT:    lw s0, 2024(sp) # 4-byte Folded Reload
1298; RV32I-NEXT:    .cfi_restore ra
1299; RV32I-NEXT:    .cfi_restore s0
1300; RV32I-NEXT:    addi sp, sp, 2032
1301; RV32I-NEXT:    .cfi_def_cfa_offset 0
1302; RV32I-NEXT:    ret
1303;
1304; RV32I-ILP32E-LABEL: caller4096:
1305; RV32I-ILP32E:       # %bb.0:
1306; RV32I-ILP32E-NEXT:    addi sp, sp, -2044
1307; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 2044
1308; RV32I-ILP32E-NEXT:    sw ra, 2040(sp) # 4-byte Folded Spill
1309; RV32I-ILP32E-NEXT:    sw s0, 2036(sp) # 4-byte Folded Spill
1310; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
1311; RV32I-ILP32E-NEXT:    .cfi_offset s0, -8
1312; RV32I-ILP32E-NEXT:    addi s0, sp, 2044
1313; RV32I-ILP32E-NEXT:    .cfi_def_cfa s0, 0
1314; RV32I-ILP32E-NEXT:    lui a0, 2
1315; RV32I-ILP32E-NEXT:    addi a0, a0, -2044
1316; RV32I-ILP32E-NEXT:    sub sp, sp, a0
1317; RV32I-ILP32E-NEXT:    srli a0, sp, 12
1318; RV32I-ILP32E-NEXT:    slli sp, a0, 12
1319; RV32I-ILP32E-NEXT:    lui a0, 1
1320; RV32I-ILP32E-NEXT:    add a0, sp, a0
1321; RV32I-ILP32E-NEXT:    call callee
1322; RV32I-ILP32E-NEXT:    addi sp, s0, -2044
1323; RV32I-ILP32E-NEXT:    .cfi_def_cfa sp, 2044
1324; RV32I-ILP32E-NEXT:    lw ra, 2040(sp) # 4-byte Folded Reload
1325; RV32I-ILP32E-NEXT:    lw s0, 2036(sp) # 4-byte Folded Reload
1326; RV32I-ILP32E-NEXT:    .cfi_restore ra
1327; RV32I-ILP32E-NEXT:    .cfi_restore s0
1328; RV32I-ILP32E-NEXT:    addi sp, sp, 2044
1329; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
1330; RV32I-ILP32E-NEXT:    ret
1331;
1332; RV64I-LABEL: caller4096:
1333; RV64I:       # %bb.0:
1334; RV64I-NEXT:    addi sp, sp, -2032
1335; RV64I-NEXT:    .cfi_def_cfa_offset 2032
1336; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
1337; RV64I-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill
1338; RV64I-NEXT:    .cfi_offset ra, -8
1339; RV64I-NEXT:    .cfi_offset s0, -16
1340; RV64I-NEXT:    addi s0, sp, 2032
1341; RV64I-NEXT:    .cfi_def_cfa s0, 0
1342; RV64I-NEXT:    lui a0, 2
1343; RV64I-NEXT:    addiw a0, a0, -2032
1344; RV64I-NEXT:    sub sp, sp, a0
1345; RV64I-NEXT:    srli a0, sp, 12
1346; RV64I-NEXT:    slli sp, a0, 12
1347; RV64I-NEXT:    lui a0, 1
1348; RV64I-NEXT:    add a0, sp, a0
1349; RV64I-NEXT:    call callee
1350; RV64I-NEXT:    addi sp, s0, -2032
1351; RV64I-NEXT:    .cfi_def_cfa sp, 2032
1352; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
1353; RV64I-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload
1354; RV64I-NEXT:    .cfi_restore ra
1355; RV64I-NEXT:    .cfi_restore s0
1356; RV64I-NEXT:    addi sp, sp, 2032
1357; RV64I-NEXT:    .cfi_def_cfa_offset 0
1358; RV64I-NEXT:    ret
1359;
1360; RV64I-LP64E-LABEL: caller4096:
1361; RV64I-LP64E:       # %bb.0:
1362; RV64I-LP64E-NEXT:    addi sp, sp, -2040
1363; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 2040
1364; RV64I-LP64E-NEXT:    sd ra, 2032(sp) # 8-byte Folded Spill
1365; RV64I-LP64E-NEXT:    sd s0, 2024(sp) # 8-byte Folded Spill
1366; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1367; RV64I-LP64E-NEXT:    .cfi_offset s0, -16
1368; RV64I-LP64E-NEXT:    addi s0, sp, 2040
1369; RV64I-LP64E-NEXT:    .cfi_def_cfa s0, 0
1370; RV64I-LP64E-NEXT:    lui a0, 2
1371; RV64I-LP64E-NEXT:    addiw a0, a0, -2040
1372; RV64I-LP64E-NEXT:    sub sp, sp, a0
1373; RV64I-LP64E-NEXT:    srli a0, sp, 12
1374; RV64I-LP64E-NEXT:    slli sp, a0, 12
1375; RV64I-LP64E-NEXT:    lui a0, 1
1376; RV64I-LP64E-NEXT:    add a0, sp, a0
1377; RV64I-LP64E-NEXT:    call callee
1378; RV64I-LP64E-NEXT:    addi sp, s0, -2040
1379; RV64I-LP64E-NEXT:    .cfi_def_cfa sp, 2040
1380; RV64I-LP64E-NEXT:    ld ra, 2032(sp) # 8-byte Folded Reload
1381; RV64I-LP64E-NEXT:    ld s0, 2024(sp) # 8-byte Folded Reload
1382; RV64I-LP64E-NEXT:    .cfi_restore ra
1383; RV64I-LP64E-NEXT:    .cfi_restore s0
1384; RV64I-LP64E-NEXT:    addi sp, sp, 2040
1385; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1386; RV64I-LP64E-NEXT:    ret
1387  %1 = alloca i8, align 4096
1388  call void @callee(ptr %1)
1389  ret void
1390}
1391
1392define void @caller_no_realign4096() "no-realign-stack" {
1393; RV32I-LABEL: caller_no_realign4096:
1394; RV32I:       # %bb.0:
1395; RV32I-NEXT:    addi sp, sp, -16
1396; RV32I-NEXT:    .cfi_def_cfa_offset 16
1397; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1398; RV32I-NEXT:    .cfi_offset ra, -4
1399; RV32I-NEXT:    mv a0, sp
1400; RV32I-NEXT:    call callee
1401; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1402; RV32I-NEXT:    .cfi_restore ra
1403; RV32I-NEXT:    addi sp, sp, 16
1404; RV32I-NEXT:    .cfi_def_cfa_offset 0
1405; RV32I-NEXT:    ret
1406;
1407; RV32I-ILP32E-LABEL: caller_no_realign4096:
1408; RV32I-ILP32E:       # %bb.0:
1409; RV32I-ILP32E-NEXT:    addi sp, sp, -8
1410; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 8
1411; RV32I-ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1412; RV32I-ILP32E-NEXT:    .cfi_offset ra, -4
1413; RV32I-ILP32E-NEXT:    mv a0, sp
1414; RV32I-ILP32E-NEXT:    call callee
1415; RV32I-ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1416; RV32I-ILP32E-NEXT:    .cfi_restore ra
1417; RV32I-ILP32E-NEXT:    addi sp, sp, 8
1418; RV32I-ILP32E-NEXT:    .cfi_def_cfa_offset 0
1419; RV32I-ILP32E-NEXT:    ret
1420;
1421; RV64I-LABEL: caller_no_realign4096:
1422; RV64I:       # %bb.0:
1423; RV64I-NEXT:    addi sp, sp, -16
1424; RV64I-NEXT:    .cfi_def_cfa_offset 16
1425; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1426; RV64I-NEXT:    .cfi_offset ra, -8
1427; RV64I-NEXT:    mv a0, sp
1428; RV64I-NEXT:    call callee
1429; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1430; RV64I-NEXT:    .cfi_restore ra
1431; RV64I-NEXT:    addi sp, sp, 16
1432; RV64I-NEXT:    .cfi_def_cfa_offset 0
1433; RV64I-NEXT:    ret
1434;
1435; RV64I-LP64E-LABEL: caller_no_realign4096:
1436; RV64I-LP64E:       # %bb.0:
1437; RV64I-LP64E-NEXT:    addi sp, sp, -16
1438; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 16
1439; RV64I-LP64E-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1440; RV64I-LP64E-NEXT:    .cfi_offset ra, -8
1441; RV64I-LP64E-NEXT:    mv a0, sp
1442; RV64I-LP64E-NEXT:    call callee
1443; RV64I-LP64E-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1444; RV64I-LP64E-NEXT:    .cfi_restore ra
1445; RV64I-LP64E-NEXT:    addi sp, sp, 16
1446; RV64I-LP64E-NEXT:    .cfi_def_cfa_offset 0
1447; RV64I-LP64E-NEXT:    ret
1448  %1 = alloca i8, align 4096
1449  call void @callee(ptr %1)
1450  ret void
1451}
1452