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:
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
25 ; RV64I-LABEL: caller32:
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
39 %1 = alloca i8, align 32
40 call void @callee(i8* %1)
44 define void @caller_no_realign32() nounwind "no-realign-stack" {
45 ; RV32I-LABEL: caller_no_realign32:
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
55 ; RV64I-LABEL: caller_no_realign32:
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
64 %1 = alloca i8, align 32
65 call void @callee(i8* %1)
69 define void @caller64() nounwind {
70 ; RV32I-LABEL: caller64:
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
85 ; RV64I-LABEL: caller64:
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
99 %1 = alloca i8, align 64
100 call void @callee(i8* %1)
104 define void @caller_no_realign64() nounwind "no-realign-stack" {
105 ; RV32I-LABEL: caller_no_realign64:
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
115 ; RV64I-LABEL: caller_no_realign64:
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
124 %1 = alloca i8, align 64
125 call void @callee(i8* %1)
129 define void @caller128() nounwind {
130 ; RV32I-LABEL: caller128:
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
145 ; RV64I-LABEL: caller128:
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
159 %1 = alloca i8, align 128
160 call void @callee(i8* %1)
164 define void @caller_no_realign128() nounwind "no-realign-stack" {
165 ; RV32I-LABEL: caller_no_realign128:
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
175 ; RV64I-LABEL: caller_no_realign128:
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
184 %1 = alloca i8, align 128
185 call void @callee(i8* %1)
189 define void @caller256() nounwind {
190 ; RV32I-LABEL: caller256:
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
205 ; RV64I-LABEL: caller256:
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
219 %1 = alloca i8, align 256
220 call void @callee(i8* %1)
224 define void @caller_no_realign256() nounwind "no-realign-stack" {
225 ; RV32I-LABEL: caller_no_realign256:
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
235 ; RV64I-LABEL: caller_no_realign256:
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
244 %1 = alloca i8, align 256
245 call void @callee(i8* %1)
249 define void @caller512() nounwind {
250 ; RV32I-LABEL: caller512:
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
265 ; RV64I-LABEL: caller512:
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
279 %1 = alloca i8, align 512
280 call void @callee(i8* %1)
284 define void @caller_no_realign512() nounwind "no-realign-stack" {
285 ; RV32I-LABEL: caller_no_realign512:
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
295 ; RV64I-LABEL: caller_no_realign512:
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
304 %1 = alloca i8, align 512
305 call void @callee(i8* %1)
309 define void @caller1024() nounwind {
310 ; RV32I-LABEL: caller1024:
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
348 ; RV64I-LABEL: caller1024:
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
385 %1 = alloca i8, align 1024
386 call void @callee(i8* %1)
390 define void @caller_no_realign1024() nounwind "no-realign-stack" {
391 ; RV32I-LABEL: caller_no_realign1024:
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
401 ; RV64I-LABEL: caller_no_realign1024:
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
410 %1 = alloca i8, align 1024
411 call void @callee(i8* %1)
415 define void @caller2048() nounwind {
416 ; RV32I-LABEL: caller2048:
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
454 ; RV64I-LABEL: caller2048:
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
491 %1 = alloca i8, align 2048
492 call void @callee(i8* %1)
496 define void @caller_no_realign2048() nounwind "no-realign-stack" {
497 ; RV32I-LABEL: caller_no_realign2048:
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
507 ; RV64I-LABEL: caller_no_realign2048:
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
516 %1 = alloca i8, align 2048
517 call void @callee(i8* %1)
521 define void @caller4096() nounwind {
522 ; RV32I-LABEL: caller4096:
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
561 ; RV64I-LABEL: caller4096:
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
599 %1 = alloca i8, align 4096
600 call void @callee(i8* %1)
604 define void @caller_no_realign4096() nounwind "no-realign-stack" {
605 ; RV32I-LABEL: caller_no_realign4096:
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
615 ; RV64I-LABEL: caller_no_realign4096:
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
624 %1 = alloca i8, align 4096
625 call void @callee(i8* %1)