xref: /llvm-project/llvm/test/CodeGen/RISCV/GlobalISel/stacksave-stackrestore.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
16e410bc9SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
26e410bc9SCraig Topper; RUN: llc -global-isel=1 -mtriple=riscv32 -o - %s | FileCheck %s --check-prefix=RV32
36e410bc9SCraig Topper; RUN: llc -global-isel=1 -mtriple=riscv64 -o - %s | FileCheck %s --check-prefix=RV64
46e410bc9SCraig Topper
56e410bc9SCraig Topperdeclare void @use_addr(ptr)
66e410bc9SCraig Topper
76e410bc9SCraig Topperdefine void @test_scoped_alloca(i64 %n) {
86e410bc9SCraig Topper; RV32-LABEL: test_scoped_alloca:
96e410bc9SCraig Topper; RV32:       # %bb.0:
106e410bc9SCraig Topper; RV32-NEXT:    addi sp, sp, -16
116e410bc9SCraig Topper; RV32-NEXT:    .cfi_def_cfa_offset 16
126e410bc9SCraig Topper; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
136e410bc9SCraig Topper; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
146e410bc9SCraig Topper; RV32-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
156e410bc9SCraig Topper; RV32-NEXT:    .cfi_offset ra, -4
166e410bc9SCraig Topper; RV32-NEXT:    .cfi_offset s0, -8
176e410bc9SCraig Topper; RV32-NEXT:    .cfi_offset s1, -12
186e410bc9SCraig Topper; RV32-NEXT:    addi s0, sp, 16
196e410bc9SCraig Topper; RV32-NEXT:    .cfi_def_cfa s0, 0
206e410bc9SCraig Topper; RV32-NEXT:    addi a0, a0, 15
216e410bc9SCraig Topper; RV32-NEXT:    andi a0, a0, -16
226e410bc9SCraig Topper; RV32-NEXT:    sub a0, sp, a0
236e410bc9SCraig Topper; RV32-NEXT:    mv s1, sp
246e410bc9SCraig Topper; RV32-NEXT:    mv sp, a0
256e410bc9SCraig Topper; RV32-NEXT:    call use_addr
266e410bc9SCraig Topper; RV32-NEXT:    mv sp, s1
276e410bc9SCraig Topper; RV32-NEXT:    addi sp, s0, -16
28*97982a8cSdlav-sc; RV32-NEXT:    .cfi_def_cfa sp, 16
296e410bc9SCraig Topper; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
306e410bc9SCraig Topper; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
316e410bc9SCraig Topper; RV32-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
32*97982a8cSdlav-sc; RV32-NEXT:    .cfi_restore ra
33*97982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s0
34*97982a8cSdlav-sc; RV32-NEXT:    .cfi_restore s1
356e410bc9SCraig Topper; RV32-NEXT:    addi sp, sp, 16
36*97982a8cSdlav-sc; RV32-NEXT:    .cfi_def_cfa_offset 0
376e410bc9SCraig Topper; RV32-NEXT:    ret
386e410bc9SCraig Topper;
396e410bc9SCraig Topper; RV64-LABEL: test_scoped_alloca:
406e410bc9SCraig Topper; RV64:       # %bb.0:
416e410bc9SCraig Topper; RV64-NEXT:    addi sp, sp, -32
426e410bc9SCraig Topper; RV64-NEXT:    .cfi_def_cfa_offset 32
436e410bc9SCraig Topper; RV64-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
446e410bc9SCraig Topper; RV64-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
456e410bc9SCraig Topper; RV64-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
466e410bc9SCraig Topper; RV64-NEXT:    .cfi_offset ra, -8
476e410bc9SCraig Topper; RV64-NEXT:    .cfi_offset s0, -16
486e410bc9SCraig Topper; RV64-NEXT:    .cfi_offset s1, -24
496e410bc9SCraig Topper; RV64-NEXT:    addi s0, sp, 32
506e410bc9SCraig Topper; RV64-NEXT:    .cfi_def_cfa s0, 0
516e410bc9SCraig Topper; RV64-NEXT:    addi a0, a0, 15
526e410bc9SCraig Topper; RV64-NEXT:    andi a0, a0, -16
536e410bc9SCraig Topper; RV64-NEXT:    sub a0, sp, a0
546e410bc9SCraig Topper; RV64-NEXT:    mv s1, sp
556e410bc9SCraig Topper; RV64-NEXT:    mv sp, a0
566e410bc9SCraig Topper; RV64-NEXT:    call use_addr
576e410bc9SCraig Topper; RV64-NEXT:    mv sp, s1
586e410bc9SCraig Topper; RV64-NEXT:    addi sp, s0, -32
59*97982a8cSdlav-sc; RV64-NEXT:    .cfi_def_cfa sp, 32
606e410bc9SCraig Topper; RV64-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
616e410bc9SCraig Topper; RV64-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
626e410bc9SCraig Topper; RV64-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
63*97982a8cSdlav-sc; RV64-NEXT:    .cfi_restore ra
64*97982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s0
65*97982a8cSdlav-sc; RV64-NEXT:    .cfi_restore s1
666e410bc9SCraig Topper; RV64-NEXT:    addi sp, sp, 32
67*97982a8cSdlav-sc; RV64-NEXT:    .cfi_def_cfa_offset 0
686e410bc9SCraig Topper; RV64-NEXT:    ret
696e410bc9SCraig Topper  %sp = call ptr @llvm.stacksave.p0()
706e410bc9SCraig Topper  %addr = alloca i8, i64 %n
716e410bc9SCraig Topper  call void @use_addr(ptr %addr)
726e410bc9SCraig Topper  call void @llvm.stackrestore.p0(ptr %sp)
736e410bc9SCraig Topper  ret void
746e410bc9SCraig Topper}
75