xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/stack-probing-dynamic.ll (revision 01d7f434d21a70158094a9c7da971ce9e0d0915c)
1*01d7f434SRaphael Moreira Zinsly; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*01d7f434SRaphael Moreira Zinsly; RUN: llc -mtriple=riscv64 -mattr=+m,+v -O2 < %s \
3*01d7f434SRaphael Moreira Zinsly; RUN:   | FileCheck %s -check-prefix=RV64I
4*01d7f434SRaphael Moreira Zinsly; RUN: llc -mtriple=riscv32 -mattr=+m,+v -O2 < %s \
5*01d7f434SRaphael Moreira Zinsly; RUN:   | FileCheck %s -check-prefix=RV32I
6*01d7f434SRaphael Moreira Zinsly
7*01d7f434SRaphael Moreira Zinsly; Tests copied from AArch64.
8*01d7f434SRaphael Moreira Zinsly
9*01d7f434SRaphael Moreira Zinsly; Dynamically-sized allocation, needs a loop which can handle any size at
10*01d7f434SRaphael Moreira Zinsly; runtime. The final iteration of the loop will temporarily put SP below the
11*01d7f434SRaphael Moreira Zinsly; target address, but this doesn't break any of the ABI constraints on the
12*01d7f434SRaphael Moreira Zinsly; stack, and also doesn't probe below the target SP value.
13*01d7f434SRaphael Moreira Zinslydefine void @dynamic(i64 %size, ptr %out) #0 {
14*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: dynamic:
15*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0:
16*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -16
17*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 16
18*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
19*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
20*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
21*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
22*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
23*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 16
24*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
25*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, a0, 15
26*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -16
27*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
28*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
29*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
30*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
31*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
32*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB0_1
33*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2:
34*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
35*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a0, 0(a1)
36*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -16
37*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 16
38*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
39*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
40*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
41*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
42*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 16
43*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
44*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
45*01d7f434SRaphael Moreira Zinsly;
46*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: dynamic:
47*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0:
48*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -16
49*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 16
50*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
51*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
52*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
53*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
54*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
55*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 16
56*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
57*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, a0, 15
58*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -16
59*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
60*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
61*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=1
62*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
63*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
64*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB0_1
65*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2:
66*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
67*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a0, 0(a2)
68*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -16
69*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 16
70*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
71*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
72*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
73*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
74*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 16
75*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
76*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
77*01d7f434SRaphael Moreira Zinsly  %v = alloca i8, i64 %size, align 1
78*01d7f434SRaphael Moreira Zinsly  store ptr %v, ptr %out, align 8
79*01d7f434SRaphael Moreira Zinsly  ret void
80*01d7f434SRaphael Moreira Zinsly}
81*01d7f434SRaphael Moreira Zinsly
82*01d7f434SRaphael Moreira Zinsly; This function has a fixed-size stack slot and a dynamic one. The fixed size
83*01d7f434SRaphael Moreira Zinsly; slot isn't large enough that we would normally probe it, but we need to do so
84*01d7f434SRaphael Moreira Zinsly; here otherwise the gap between the CSR save and the first probe of the
85*01d7f434SRaphael Moreira Zinsly; dynamic allocation could be too far apart when the size of the dynamic
86*01d7f434SRaphael Moreira Zinsly; allocation is close to the guard size.
87*01d7f434SRaphael Moreira Zinslydefine void @dynamic_fixed(i64 %size, ptr %out1, ptr %out2) #0 {
88*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: dynamic_fixed:
89*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0:
90*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -80
91*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 80
92*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
93*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 72(sp) # 8-byte Folded Spill
94*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 64(sp) # 8-byte Folded Spill
95*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
96*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
97*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 80
98*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
99*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a3, s0, -80
100*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, a0, 15
101*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a3, 0(a1)
102*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -16
103*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
104*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a1, 1
105*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
106*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a1
107*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
108*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB1_1
109*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2:
110*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
111*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a0, 0(a2)
112*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -80
113*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 80
114*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 72(sp) # 8-byte Folded Reload
115*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 64(sp) # 8-byte Folded Reload
116*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
117*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
118*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 80
119*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
120*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
121*01d7f434SRaphael Moreira Zinsly;
122*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: dynamic_fixed:
123*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0:
124*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -80
125*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 80
126*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
127*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 76(sp) # 4-byte Folded Spill
128*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 72(sp) # 4-byte Folded Spill
129*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
130*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
131*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 80
132*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
133*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a1, s0, -72
134*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, a0, 15
135*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a1, 0(a2)
136*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -16
137*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
138*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
139*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1
140*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
141*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
142*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB1_1
143*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2:
144*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
145*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a0, 0(a3)
146*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -80
147*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 80
148*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 76(sp) # 4-byte Folded Reload
149*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 72(sp) # 4-byte Folded Reload
150*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
151*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
152*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 80
153*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
154*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
155*01d7f434SRaphael Moreira Zinsly  %v1 = alloca i8, i64 64, align 1
156*01d7f434SRaphael Moreira Zinsly  store ptr %v1, ptr %out1, align 8
157*01d7f434SRaphael Moreira Zinsly  %v2 = alloca i8, i64 %size, align 1
158*01d7f434SRaphael Moreira Zinsly  store ptr %v2, ptr %out2, align 8
159*01d7f434SRaphael Moreira Zinsly  ret void
160*01d7f434SRaphael Moreira Zinsly}
161*01d7f434SRaphael Moreira Zinsly
162*01d7f434SRaphael Moreira Zinsly; Dynamic allocation, with an alignment requirement greater than the alignment
163*01d7f434SRaphael Moreira Zinsly; of SP. Done by ANDing the target SP with a constant to align it down, then
164*01d7f434SRaphael Moreira Zinsly; doing the loop as normal. Note that we also re-align the stack in the prolog,
165*01d7f434SRaphael Moreira Zinsly; which isn't actually needed because the only aligned allocations are dynamic,
166*01d7f434SRaphael Moreira Zinsly; this is done even without stack probing.
167*01d7f434SRaphael Moreira Zinslydefine void @dynamic_align_64(i64 %size, ptr %out) #0 {
168*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: dynamic_align_64:
169*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0:
170*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -64
171*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 64
172*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
173*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
174*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
175*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s1, 40(sp) # 8-byte Folded Spill
176*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
177*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
178*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s1, -24
179*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 64
180*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
181*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi sp, sp, -64
182*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv s1, sp
183*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, a0, 15
184*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -16
185*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
186*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -64
187*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
188*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
189*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
190*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
191*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB2_1
192*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2:
193*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
194*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a0, 0(a1)
195*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -64
196*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 64
197*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
198*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
199*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s1, 40(sp) # 8-byte Folded Reload
200*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
201*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
202*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s1
203*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 64
204*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
205*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
206*01d7f434SRaphael Moreira Zinsly;
207*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: dynamic_align_64:
208*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0:
209*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -64
210*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 64
211*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
212*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
213*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
214*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s1, 52(sp) # 4-byte Folded Spill
215*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
216*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
217*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s1, -12
218*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 64
219*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
220*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi sp, sp, -64
221*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv s1, sp
222*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, a0, 15
223*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -16
224*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
225*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -64
226*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
227*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1
228*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
229*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
230*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB2_1
231*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2:
232*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
233*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a0, 0(a2)
234*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -64
235*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 64
236*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
237*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
238*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s1, 52(sp) # 4-byte Folded Reload
239*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
240*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
241*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s1
242*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 64
243*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
244*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
245*01d7f434SRaphael Moreira Zinsly  %v = alloca i8, i64 %size, align 64
246*01d7f434SRaphael Moreira Zinsly  store ptr %v, ptr %out, align 8
247*01d7f434SRaphael Moreira Zinsly  ret void
248*01d7f434SRaphael Moreira Zinsly}
249*01d7f434SRaphael Moreira Zinsly
250*01d7f434SRaphael Moreira Zinsly; Dynamic allocation, with an alignment greater than the stack guard size. The
251*01d7f434SRaphael Moreira Zinsly; only difference to the dynamic allocation is the constant used for aligning
252*01d7f434SRaphael Moreira Zinsly; the target SP, the loop will probe the whole allocation without needing to
253*01d7f434SRaphael Moreira Zinsly; know about the alignment padding.
254*01d7f434SRaphael Moreira Zinslydefine void @dynamic_align_8192(i64 %size, ptr %out) #0 {
255*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: dynamic_align_8192:
256*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0:
257*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -2032
258*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 2032
259*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
260*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill
261*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill
262*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s1, 2008(sp) # 8-byte Folded Spill
263*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
264*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
265*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s1, -24
266*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 2032
267*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
268*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
269*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
270*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
271*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
272*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
273*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
274*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
275*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -2048
276*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -16
277*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
278*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    srli a2, sp, 13
279*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    slli sp, a2, 13
280*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv s1, sp
281*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, a0, 15
282*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1048574
283*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -16
284*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
285*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    and a0, a0, a2
286*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
287*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
288*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
289*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
290*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB3_1
291*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2:
292*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
293*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a0, 0(a1)
294*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -2032
295*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 2032
296*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload
297*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload
298*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s1, 2008(sp) # 8-byte Folded Reload
299*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
300*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
301*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s1
302*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 2032
303*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
304*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
305*01d7f434SRaphael Moreira Zinsly;
306*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: dynamic_align_8192:
307*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0:
308*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -2032
309*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 2032
310*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
311*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill
312*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 2024(sp) # 4-byte Folded Spill
313*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s1, 2020(sp) # 4-byte Folded Spill
314*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
315*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
316*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s1, -12
317*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 2032
318*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
319*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
320*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
321*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
322*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
323*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
324*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
325*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
326*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -2048
327*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -16
328*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
329*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    srli a1, sp, 13
330*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    slli sp, a1, 13
331*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv s1, sp
332*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, a0, 15
333*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1048574
334*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -16
335*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
336*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    and a0, a0, a1
337*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
338*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1
339*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
340*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
341*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB3_1
342*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2:
343*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
344*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a0, 0(a2)
345*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -2032
346*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 2032
347*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload
348*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 2024(sp) # 4-byte Folded Reload
349*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s1, 2020(sp) # 4-byte Folded Reload
350*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
351*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
352*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s1
353*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 2032
354*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
355*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
356*01d7f434SRaphael Moreira Zinsly  %v = alloca i8, i64 %size, align 8192
357*01d7f434SRaphael Moreira Zinsly  store ptr %v, ptr %out, align 8
358*01d7f434SRaphael Moreira Zinsly  ret void
359*01d7f434SRaphael Moreira Zinsly}
360*01d7f434SRaphael Moreira Zinsly
361*01d7f434SRaphael Moreira Zinsly; If a function has variable-sized stack objects, then any function calls which
362*01d7f434SRaphael Moreira Zinsly; need to pass arguments on the stack must allocate the stack space for them
363*01d7f434SRaphael Moreira Zinsly; dynamically, to ensure they are at the bottom of the frame.
364*01d7f434SRaphael Moreira Zinslydefine void @no_reserved_call_frame(i64 %n, i32 %dummy) #0 {
365*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: no_reserved_call_frame:
366*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0: # %entry
367*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -16
368*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 16
369*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
370*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
371*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
372*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
373*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
374*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 16
375*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
376*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    slli a0, a0, 2
377*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, a0, 15
378*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    andi a0, a0, -16
379*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
380*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
381*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB4_1: # %entry
382*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1
383*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
384*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
385*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB4_1
386*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2: # %entry
387*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
388*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    call callee_stack_args
389*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -16
390*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 16
391*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
392*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
393*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
394*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
395*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 16
396*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
397*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
398*01d7f434SRaphael Moreira Zinsly;
399*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: no_reserved_call_frame:
400*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0: # %entry
401*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -16
402*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 16
403*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
404*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
405*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
406*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
407*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
408*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 16
409*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
410*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv a1, a2
411*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    slli a0, a0, 2
412*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, a0, 15
413*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    andi a0, a0, -16
414*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
415*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a2, 1
416*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB4_1: # %entry
417*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1
418*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a2
419*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
420*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB4_1
421*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2: # %entry
422*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
423*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    call callee_stack_args
424*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -16
425*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 16
426*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
427*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
428*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
429*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
430*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 16
431*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
432*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
433*01d7f434SRaphael Moreira Zinslyentry:
434*01d7f434SRaphael Moreira Zinsly  %v = alloca i32, i64 %n
435*01d7f434SRaphael Moreira Zinsly  call void @callee_stack_args(ptr %v, i32 %dummy)
436*01d7f434SRaphael Moreira Zinsly  ret void
437*01d7f434SRaphael Moreira Zinsly}
438*01d7f434SRaphael Moreira Zinsly
439*01d7f434SRaphael Moreira Zinsly; Same as above but without a variable-sized allocation, so the reserved call
440*01d7f434SRaphael Moreira Zinsly; frame can be folded into the fixed-size allocation in the prologue.
441*01d7f434SRaphael Moreira Zinslydefine void @reserved_call_frame(i64 %n, i32 %dummy) #0 {
442*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: reserved_call_frame:
443*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0: # %entry
444*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -416
445*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 416
446*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 408(sp) # 8-byte Folded Spill
447*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
448*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi a0, sp, 8
449*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    call callee_stack_args
450*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 408(sp) # 8-byte Folded Reload
451*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
452*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 416
453*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
454*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
455*01d7f434SRaphael Moreira Zinsly;
456*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: reserved_call_frame:
457*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0: # %entry
458*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -416
459*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 416
460*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 412(sp) # 4-byte Folded Spill
461*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
462*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv a1, a2
463*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi a0, sp, 12
464*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    call callee_stack_args
465*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 412(sp) # 4-byte Folded Reload
466*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
467*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 416
468*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
469*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
470*01d7f434SRaphael Moreira Zinslyentry:
471*01d7f434SRaphael Moreira Zinsly  %v = alloca i32, i64 100
472*01d7f434SRaphael Moreira Zinsly  call void @callee_stack_args(ptr %v, i32 %dummy)
473*01d7f434SRaphael Moreira Zinsly  ret void
474*01d7f434SRaphael Moreira Zinsly}
475*01d7f434SRaphael Moreira Zinsly
476*01d7f434SRaphael Moreira Zinslydeclare void @callee_stack_args(ptr, i32)
477*01d7f434SRaphael Moreira Zinsly
478*01d7f434SRaphael Moreira Zinsly; Dynamic allocation of vectors
479*01d7f434SRaphael Moreira Zinslydefine void @dynamic_vector(i64 %size, ptr %out) #0 {
480*01d7f434SRaphael Moreira Zinsly; RV64I-LABEL: dynamic_vector:
481*01d7f434SRaphael Moreira Zinsly; RV64I:       # %bb.0:
482*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, -16
483*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 16
484*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
485*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
486*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
487*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset ra, -8
488*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_offset s0, -16
489*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi s0, sp, 16
490*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa s0, 0
491*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    csrr a2, vlenb
492*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mul a0, a2, a0
493*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    slli a0, a0, 1
494*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub a0, sp, a0
495*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    lui a2, 1
496*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
497*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sub sp, sp, a2
498*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd zero, 0(sp)
499*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    blt a0, sp, .LBB6_1
500*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:  # %bb.2:
501*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    mv sp, a0
502*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    sd a0, 0(a1)
503*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, s0, -16
504*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa sp, 16
505*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
506*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
507*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore ra
508*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_restore s0
509*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    addi sp, sp, 16
510*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    .cfi_def_cfa_offset 0
511*01d7f434SRaphael Moreira Zinsly; RV64I-NEXT:    ret
512*01d7f434SRaphael Moreira Zinsly;
513*01d7f434SRaphael Moreira Zinsly; RV32I-LABEL: dynamic_vector:
514*01d7f434SRaphael Moreira Zinsly; RV32I:       # %bb.0:
515*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, -16
516*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 16
517*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
518*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
519*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
520*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset ra, -4
521*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_offset s0, -8
522*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi s0, sp, 16
523*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa s0, 0
524*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    csrr a1, vlenb
525*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mul a0, a1, a0
526*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    slli a0, a0, 1
527*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub a0, sp, a0
528*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lui a1, 1
529*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1
530*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sub sp, sp, a1
531*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw zero, 0(sp)
532*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    blt a0, sp, .LBB6_1
533*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:  # %bb.2:
534*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    mv sp, a0
535*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    sw a0, 0(a2)
536*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, s0, -16
537*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa sp, 16
538*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
539*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
540*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore ra
541*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_restore s0
542*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    addi sp, sp, 16
543*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    .cfi_def_cfa_offset 0
544*01d7f434SRaphael Moreira Zinsly; RV32I-NEXT:    ret
545*01d7f434SRaphael Moreira Zinsly  %v = alloca <vscale x 4 x float>, i64 %size, align 16
546*01d7f434SRaphael Moreira Zinsly  store ptr %v, ptr %out, align 8
547*01d7f434SRaphael Moreira Zinsly  ret void
548*01d7f434SRaphael Moreira Zinsly}
549*01d7f434SRaphael Moreira Zinsly
550*01d7f434SRaphael Moreira Zinslyattributes #0 = { uwtable(async) "probe-stack"="inline-asm" "frame-pointer"="none" }
551