blob: 7815866f5c43688aa2ecadc0f3e1f246aec93070 [file] [log] [blame]
Alex Bradburybfb00d42017-12-11 12:38:17 +00001; 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
5declare void @notdead(i8*)
6
7; These tests must ensure the stack pointer is restored using the frame
8; pointer
9
10define void @simple_alloca(i32 %n) nounwind {
11; RV32I-LABEL: simple_alloca:
12; RV32I: # %bb.0:
13; RV32I-NEXT: addi sp, sp, -16
14; RV32I-NEXT: sw ra, 12(sp)
15; RV32I-NEXT: sw s0, 8(sp)
16; RV32I-NEXT: addi s0, sp, 16
17; RV32I-NEXT: addi a0, a0, 15
18; RV32I-NEXT: andi a0, a0, -16
19; RV32I-NEXT: sub a0, sp, a0
20; RV32I-NEXT: addi sp, a0, 0
21; RV32I-NEXT: lui a1, %hi(notdead)
22; RV32I-NEXT: addi a1, a1, %lo(notdead)
23; RV32I-NEXT: jalr ra, a1, 0
24; RV32I-NEXT: addi sp, s0, -16
25; RV32I-NEXT: lw s0, 8(sp)
26; RV32I-NEXT: lw ra, 12(sp)
27; RV32I-NEXT: addi sp, sp, 16
28; RV32I-NEXT: jalr zero, ra, 0
29 %1 = alloca i8, i32 %n
30 call void @notdead(i8* %1)
31 ret void
32}
33
34declare i8* @llvm.stacksave()
35declare void @llvm.stackrestore(i8*)
36
37define void @scoped_alloca(i32 %n) nounwind {
38; RV32I-LABEL: scoped_alloca:
39; RV32I: # %bb.0:
40; RV32I-NEXT: addi sp, sp, -16
41; RV32I-NEXT: sw ra, 12(sp)
42; RV32I-NEXT: sw s0, 8(sp)
43; RV32I-NEXT: sw s1, 4(sp)
44; RV32I-NEXT: addi s0, sp, 16
45; RV32I-NEXT: addi s1, sp, 0
46; RV32I-NEXT: addi a0, a0, 15
47; RV32I-NEXT: andi a0, a0, -16
48; RV32I-NEXT: sub a0, sp, a0
49; RV32I-NEXT: addi sp, a0, 0
50; RV32I-NEXT: lui a1, %hi(notdead)
51; RV32I-NEXT: addi a1, a1, %lo(notdead)
52; RV32I-NEXT: jalr ra, a1, 0
53; RV32I-NEXT: addi sp, s1, 0
54; RV32I-NEXT: addi sp, s0, -16
55; RV32I-NEXT: lw s1, 4(sp)
56; RV32I-NEXT: lw s0, 8(sp)
57; RV32I-NEXT: lw ra, 12(sp)
58; RV32I-NEXT: addi sp, sp, 16
59; RV32I-NEXT: jalr zero, ra, 0
60 %sp = call i8* @llvm.stacksave()
61 %addr = alloca i8, i32 %n
62 call void @notdead(i8* %addr)
63 call void @llvm.stackrestore(i8* %sp)
64 ret void
65}