[Alignment] Use llvm::Align in MachineFunction and TargetLowering - fixes mir parsing
[llvm-core.git] / test / CodeGen / RISCV / stack-realignment.ll
blob252a099d0986ced5c95126a7480543466026275e
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
7 declare void @callee(i8*)
9 define 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
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
44 define 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
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
69 define 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
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
104 define 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
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
129 define 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
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
164 define 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
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
189 define 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
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
224 define 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
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
249 define 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
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
284 define 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
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
309 define 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
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
390 define 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
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
415 define 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
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
496 define 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
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
521 define 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
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
604 define 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
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