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