brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.5 KiB · c79fb0f Raw
585 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+m,+v -O2 < %s \3; RUN:   | FileCheck %s -check-prefix=RV64I4; RUN: llc -mtriple=riscv32 -mattr=+m,+v -O2 < %s \5; RUN:   | FileCheck %s -check-prefix=RV32I6 7; Tests copied from AArch64.8 9; Dynamically-sized allocation, needs a loop which can handle any size at10; runtime. The final iteration of the loop will temporarily put SP below the11; target address, but this doesn't break any of the ABI constraints on the12; stack, and also doesn't probe below the target SP value.13define void @dynamic(i64 %size, ptr %out) #0 {14; RV64I-LABEL: dynamic:15; RV64I:       # %bb.0:16; RV64I-NEXT:    addi sp, sp, -1617; RV64I-NEXT:    .cfi_def_cfa_offset 1618; RV64I-NEXT:    sd zero, 0(sp)19; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill20; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill21; RV64I-NEXT:    .cfi_offset ra, -822; RV64I-NEXT:    .cfi_offset s0, -1623; RV64I-NEXT:    addi s0, sp, 1624; RV64I-NEXT:    .cfi_def_cfa s0, 025; RV64I-NEXT:    addi a0, a0, 1526; RV64I-NEXT:    andi a0, a0, -1627; RV64I-NEXT:    sub a0, sp, a028; RV64I-NEXT:    lui a2, 129; RV64I-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=130; RV64I-NEXT:    sub sp, sp, a231; RV64I-NEXT:    sd zero, 0(sp)32; RV64I-NEXT:    blt a0, sp, .LBB0_133; RV64I-NEXT:  # %bb.2:34; RV64I-NEXT:    mv sp, a035; RV64I-NEXT:    sd a0, 0(a1)36; RV64I-NEXT:    addi sp, s0, -1637; RV64I-NEXT:    .cfi_def_cfa sp, 1638; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload39; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload40; RV64I-NEXT:    .cfi_restore ra41; RV64I-NEXT:    .cfi_restore s042; RV64I-NEXT:    addi sp, sp, 1643; RV64I-NEXT:    .cfi_def_cfa_offset 044; RV64I-NEXT:    ret45;46; RV32I-LABEL: dynamic:47; RV32I:       # %bb.0:48; RV32I-NEXT:    addi sp, sp, -1649; RV32I-NEXT:    .cfi_def_cfa_offset 1650; RV32I-NEXT:    sw zero, 0(sp)51; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill52; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill53; RV32I-NEXT:    .cfi_offset ra, -454; RV32I-NEXT:    .cfi_offset s0, -855; RV32I-NEXT:    addi s0, sp, 1656; RV32I-NEXT:    .cfi_def_cfa s0, 057; RV32I-NEXT:    addi a0, a0, 1558; RV32I-NEXT:    andi a0, a0, -1659; RV32I-NEXT:    sub a0, sp, a060; RV32I-NEXT:    lui a1, 161; RV32I-NEXT:  .LBB0_1: # =>This Inner Loop Header: Depth=162; RV32I-NEXT:    sub sp, sp, a163; RV32I-NEXT:    sw zero, 0(sp)64; RV32I-NEXT:    blt a0, sp, .LBB0_165; RV32I-NEXT:  # %bb.2:66; RV32I-NEXT:    mv sp, a067; RV32I-NEXT:    sw a0, 0(a2)68; RV32I-NEXT:    addi sp, s0, -1669; RV32I-NEXT:    .cfi_def_cfa sp, 1670; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload71; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload72; RV32I-NEXT:    .cfi_restore ra73; RV32I-NEXT:    .cfi_restore s074; RV32I-NEXT:    addi sp, sp, 1675; RV32I-NEXT:    .cfi_def_cfa_offset 076; RV32I-NEXT:    ret77  %v = alloca i8, i64 %size, align 178  store ptr %v, ptr %out, align 879  ret void80}81 82; This function has a fixed-size stack slot and a dynamic one. The fixed size83; slot isn't large enough that we would normally probe it, but we need to do so84; here otherwise the gap between the CSR save and the first probe of the85; dynamic allocation could be too far apart when the size of the dynamic86; allocation is close to the guard size.87define void @dynamic_fixed(i64 %size, ptr %out1, ptr %out2) #0 {88; RV64I-LABEL: dynamic_fixed:89; RV64I:       # %bb.0:90; RV64I-NEXT:    addi sp, sp, -8091; RV64I-NEXT:    .cfi_def_cfa_offset 8092; RV64I-NEXT:    sd zero, 0(sp)93; RV64I-NEXT:    sd ra, 72(sp) # 8-byte Folded Spill94; RV64I-NEXT:    sd s0, 64(sp) # 8-byte Folded Spill95; RV64I-NEXT:    .cfi_offset ra, -896; RV64I-NEXT:    .cfi_offset s0, -1697; RV64I-NEXT:    addi s0, sp, 8098; RV64I-NEXT:    .cfi_def_cfa s0, 099; RV64I-NEXT:    addi a3, s0, -80100; RV64I-NEXT:    addi a0, a0, 15101; RV64I-NEXT:    sd a3, 0(a1)102; RV64I-NEXT:    andi a0, a0, -16103; RV64I-NEXT:    sub a0, sp, a0104; RV64I-NEXT:    lui a1, 1105; RV64I-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1106; RV64I-NEXT:    sub sp, sp, a1107; RV64I-NEXT:    sd zero, 0(sp)108; RV64I-NEXT:    blt a0, sp, .LBB1_1109; RV64I-NEXT:  # %bb.2:110; RV64I-NEXT:    mv sp, a0111; RV64I-NEXT:    sd a0, 0(a2)112; RV64I-NEXT:    addi sp, s0, -80113; RV64I-NEXT:    .cfi_def_cfa sp, 80114; RV64I-NEXT:    ld ra, 72(sp) # 8-byte Folded Reload115; RV64I-NEXT:    ld s0, 64(sp) # 8-byte Folded Reload116; RV64I-NEXT:    .cfi_restore ra117; RV64I-NEXT:    .cfi_restore s0118; RV64I-NEXT:    addi sp, sp, 80119; RV64I-NEXT:    .cfi_def_cfa_offset 0120; RV64I-NEXT:    ret121;122; RV32I-LABEL: dynamic_fixed:123; RV32I:       # %bb.0:124; RV32I-NEXT:    addi sp, sp, -80125; RV32I-NEXT:    .cfi_def_cfa_offset 80126; RV32I-NEXT:    sw zero, 0(sp)127; RV32I-NEXT:    sw ra, 76(sp) # 4-byte Folded Spill128; RV32I-NEXT:    sw s0, 72(sp) # 4-byte Folded Spill129; RV32I-NEXT:    .cfi_offset ra, -4130; RV32I-NEXT:    .cfi_offset s0, -8131; RV32I-NEXT:    addi s0, sp, 80132; RV32I-NEXT:    .cfi_def_cfa s0, 0133; RV32I-NEXT:    addi a1, s0, -72134; RV32I-NEXT:    addi a0, a0, 15135; RV32I-NEXT:    sw a1, 0(a2)136; RV32I-NEXT:    andi a0, a0, -16137; RV32I-NEXT:    sub a0, sp, a0138; RV32I-NEXT:    lui a1, 1139; RV32I-NEXT:  .LBB1_1: # =>This Inner Loop Header: Depth=1140; RV32I-NEXT:    sub sp, sp, a1141; RV32I-NEXT:    sw zero, 0(sp)142; RV32I-NEXT:    blt a0, sp, .LBB1_1143; RV32I-NEXT:  # %bb.2:144; RV32I-NEXT:    mv sp, a0145; RV32I-NEXT:    sw a0, 0(a3)146; RV32I-NEXT:    addi sp, s0, -80147; RV32I-NEXT:    .cfi_def_cfa sp, 80148; RV32I-NEXT:    lw ra, 76(sp) # 4-byte Folded Reload149; RV32I-NEXT:    lw s0, 72(sp) # 4-byte Folded Reload150; RV32I-NEXT:    .cfi_restore ra151; RV32I-NEXT:    .cfi_restore s0152; RV32I-NEXT:    addi sp, sp, 80153; RV32I-NEXT:    .cfi_def_cfa_offset 0154; RV32I-NEXT:    ret155  %v1 = alloca i8, i64 64, align 1156  store ptr %v1, ptr %out1, align 8157  %v2 = alloca i8, i64 %size, align 1158  store ptr %v2, ptr %out2, align 8159  ret void160}161 162; Dynamic allocation, with an alignment requirement greater than the alignment163; of SP. Done by ANDing the target SP with a constant to align it down, then164; doing the loop as normal. Note that we also re-align the stack in the prolog,165; which isn't actually needed because the only aligned allocations are dynamic,166; this is done even without stack probing.167define void @dynamic_align_64(i64 %size, ptr %out) #0 {168; RV64I-LABEL: dynamic_align_64:169; RV64I:       # %bb.0:170; RV64I-NEXT:    addi sp, sp, -64171; RV64I-NEXT:    .cfi_def_cfa_offset 64172; RV64I-NEXT:    sd zero, 0(sp)173; RV64I-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill174; RV64I-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill175; RV64I-NEXT:    sd s1, 40(sp) # 8-byte Folded Spill176; RV64I-NEXT:    .cfi_offset ra, -8177; RV64I-NEXT:    .cfi_offset s0, -16178; RV64I-NEXT:    .cfi_offset s1, -24179; RV64I-NEXT:    addi s0, sp, 64180; RV64I-NEXT:    .cfi_def_cfa s0, 0181; RV64I-NEXT:    andi sp, sp, -64182; RV64I-NEXT:    mv s1, sp183; RV64I-NEXT:    addi a0, a0, 15184; RV64I-NEXT:    andi a0, a0, -16185; RV64I-NEXT:    sub a0, sp, a0186; RV64I-NEXT:    andi a0, a0, -64187; RV64I-NEXT:    lui a2, 1188; RV64I-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1189; RV64I-NEXT:    sub sp, sp, a2190; RV64I-NEXT:    sd zero, 0(sp)191; RV64I-NEXT:    blt a0, sp, .LBB2_1192; RV64I-NEXT:  # %bb.2:193; RV64I-NEXT:    mv sp, a0194; RV64I-NEXT:    sd a0, 0(a1)195; RV64I-NEXT:    addi sp, s0, -64196; RV64I-NEXT:    .cfi_def_cfa sp, 64197; RV64I-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload198; RV64I-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload199; RV64I-NEXT:    ld s1, 40(sp) # 8-byte Folded Reload200; RV64I-NEXT:    .cfi_restore ra201; RV64I-NEXT:    .cfi_restore s0202; RV64I-NEXT:    .cfi_restore s1203; RV64I-NEXT:    addi sp, sp, 64204; RV64I-NEXT:    .cfi_def_cfa_offset 0205; RV64I-NEXT:    ret206;207; RV32I-LABEL: dynamic_align_64:208; RV32I:       # %bb.0:209; RV32I-NEXT:    addi sp, sp, -64210; RV32I-NEXT:    .cfi_def_cfa_offset 64211; RV32I-NEXT:    sw zero, 0(sp)212; RV32I-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill213; RV32I-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill214; RV32I-NEXT:    sw s1, 52(sp) # 4-byte Folded Spill215; RV32I-NEXT:    .cfi_offset ra, -4216; RV32I-NEXT:    .cfi_offset s0, -8217; RV32I-NEXT:    .cfi_offset s1, -12218; RV32I-NEXT:    addi s0, sp, 64219; RV32I-NEXT:    .cfi_def_cfa s0, 0220; RV32I-NEXT:    andi sp, sp, -64221; RV32I-NEXT:    mv s1, sp222; RV32I-NEXT:    addi a0, a0, 15223; RV32I-NEXT:    andi a0, a0, -16224; RV32I-NEXT:    sub a0, sp, a0225; RV32I-NEXT:    andi a0, a0, -64226; RV32I-NEXT:    lui a1, 1227; RV32I-NEXT:  .LBB2_1: # =>This Inner Loop Header: Depth=1228; RV32I-NEXT:    sub sp, sp, a1229; RV32I-NEXT:    sw zero, 0(sp)230; RV32I-NEXT:    blt a0, sp, .LBB2_1231; RV32I-NEXT:  # %bb.2:232; RV32I-NEXT:    mv sp, a0233; RV32I-NEXT:    sw a0, 0(a2)234; RV32I-NEXT:    addi sp, s0, -64235; RV32I-NEXT:    .cfi_def_cfa sp, 64236; RV32I-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload237; RV32I-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload238; RV32I-NEXT:    lw s1, 52(sp) # 4-byte Folded Reload239; RV32I-NEXT:    .cfi_restore ra240; RV32I-NEXT:    .cfi_restore s0241; RV32I-NEXT:    .cfi_restore s1242; RV32I-NEXT:    addi sp, sp, 64243; RV32I-NEXT:    .cfi_def_cfa_offset 0244; RV32I-NEXT:    ret245  %v = alloca i8, i64 %size, align 64246  store ptr %v, ptr %out, align 8247  ret void248}249 250; Dynamic allocation, with an alignment greater than the stack guard size. The251; only difference to the dynamic allocation is the constant used for aligning252; the target SP, the loop will probe the whole allocation without needing to253; know about the alignment padding.254define void @dynamic_align_8192(i64 %size, ptr %out) #0 {255; RV64I-LABEL: dynamic_align_8192:256; RV64I:       # %bb.0:257; RV64I-NEXT:    addi sp, sp, -2032258; RV64I-NEXT:    .cfi_def_cfa_offset 2032259; RV64I-NEXT:    sd zero, 0(sp)260; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill261; RV64I-NEXT:    sd s0, 2016(sp) # 8-byte Folded Spill262; RV64I-NEXT:    sd s1, 2008(sp) # 8-byte Folded Spill263; RV64I-NEXT:    .cfi_offset ra, -8264; RV64I-NEXT:    .cfi_offset s0, -16265; RV64I-NEXT:    .cfi_offset s1, -24266; RV64I-NEXT:    addi s0, sp, 2032267; RV64I-NEXT:    .cfi_def_cfa s0, 0268; RV64I-NEXT:    lui a2, 1269; RV64I-NEXT:    sub sp, sp, a2270; RV64I-NEXT:    sd zero, 0(sp)271; RV64I-NEXT:    sub sp, sp, a2272; RV64I-NEXT:    sd zero, 0(sp)273; RV64I-NEXT:    sub sp, sp, a2274; RV64I-NEXT:    sd zero, 0(sp)275; RV64I-NEXT:    addi sp, sp, -2048276; RV64I-NEXT:    addi sp, sp, -16277; RV64I-NEXT:    sd zero, 0(sp)278; RV64I-NEXT:    srli a2, sp, 13279; RV64I-NEXT:    slli sp, a2, 13280; RV64I-NEXT:    mv s1, sp281; RV64I-NEXT:    addi a0, a0, 15282; RV64I-NEXT:    lui a2, 1048574283; RV64I-NEXT:    andi a0, a0, -16284; RV64I-NEXT:    sub a0, sp, a0285; RV64I-NEXT:    and a0, a0, a2286; RV64I-NEXT:    lui a2, 1287; RV64I-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1288; RV64I-NEXT:    sub sp, sp, a2289; RV64I-NEXT:    sd zero, 0(sp)290; RV64I-NEXT:    blt a0, sp, .LBB3_1291; RV64I-NEXT:  # %bb.2:292; RV64I-NEXT:    mv sp, a0293; RV64I-NEXT:    sd a0, 0(a1)294; RV64I-NEXT:    addi sp, s0, -2032295; RV64I-NEXT:    .cfi_def_cfa sp, 2032296; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload297; RV64I-NEXT:    ld s0, 2016(sp) # 8-byte Folded Reload298; RV64I-NEXT:    ld s1, 2008(sp) # 8-byte Folded Reload299; RV64I-NEXT:    .cfi_restore ra300; RV64I-NEXT:    .cfi_restore s0301; RV64I-NEXT:    .cfi_restore s1302; RV64I-NEXT:    addi sp, sp, 2032303; RV64I-NEXT:    .cfi_def_cfa_offset 0304; RV64I-NEXT:    ret305;306; RV32I-LABEL: dynamic_align_8192:307; RV32I:       # %bb.0:308; RV32I-NEXT:    addi sp, sp, -2032309; RV32I-NEXT:    .cfi_def_cfa_offset 2032310; RV32I-NEXT:    sw zero, 0(sp)311; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill312; RV32I-NEXT:    sw s0, 2024(sp) # 4-byte Folded Spill313; RV32I-NEXT:    sw s1, 2020(sp) # 4-byte Folded Spill314; RV32I-NEXT:    .cfi_offset ra, -4315; RV32I-NEXT:    .cfi_offset s0, -8316; RV32I-NEXT:    .cfi_offset s1, -12317; RV32I-NEXT:    addi s0, sp, 2032318; RV32I-NEXT:    .cfi_def_cfa s0, 0319; RV32I-NEXT:    lui a1, 1320; RV32I-NEXT:    sub sp, sp, a1321; RV32I-NEXT:    sw zero, 0(sp)322; RV32I-NEXT:    sub sp, sp, a1323; RV32I-NEXT:    sw zero, 0(sp)324; RV32I-NEXT:    sub sp, sp, a1325; RV32I-NEXT:    sw zero, 0(sp)326; RV32I-NEXT:    addi sp, sp, -2048327; RV32I-NEXT:    addi sp, sp, -16328; RV32I-NEXT:    sw zero, 0(sp)329; RV32I-NEXT:    srli a1, sp, 13330; RV32I-NEXT:    slli sp, a1, 13331; RV32I-NEXT:    mv s1, sp332; RV32I-NEXT:    addi a0, a0, 15333; RV32I-NEXT:    lui a1, 1048574334; RV32I-NEXT:    andi a0, a0, -16335; RV32I-NEXT:    sub a0, sp, a0336; RV32I-NEXT:    and a0, a0, a1337; RV32I-NEXT:    lui a1, 1338; RV32I-NEXT:  .LBB3_1: # =>This Inner Loop Header: Depth=1339; RV32I-NEXT:    sub sp, sp, a1340; RV32I-NEXT:    sw zero, 0(sp)341; RV32I-NEXT:    blt a0, sp, .LBB3_1342; RV32I-NEXT:  # %bb.2:343; RV32I-NEXT:    mv sp, a0344; RV32I-NEXT:    sw a0, 0(a2)345; RV32I-NEXT:    addi sp, s0, -2032346; RV32I-NEXT:    .cfi_def_cfa sp, 2032347; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload348; RV32I-NEXT:    lw s0, 2024(sp) # 4-byte Folded Reload349; RV32I-NEXT:    lw s1, 2020(sp) # 4-byte Folded Reload350; RV32I-NEXT:    .cfi_restore ra351; RV32I-NEXT:    .cfi_restore s0352; RV32I-NEXT:    .cfi_restore s1353; RV32I-NEXT:    addi sp, sp, 2032354; RV32I-NEXT:    .cfi_def_cfa_offset 0355; RV32I-NEXT:    ret356  %v = alloca i8, i64 %size, align 8192357  store ptr %v, ptr %out, align 8358  ret void359}360 361; If a function has variable-sized stack objects, then any function calls which362; need to pass arguments on the stack must allocate the stack space for them363; dynamically, to ensure they are at the bottom of the frame.364define void @no_reserved_call_frame(i64 %n) #0 {365; RV64I-LABEL: no_reserved_call_frame:366; RV64I:       # %bb.0: # %entry367; RV64I-NEXT:    addi sp, sp, -16368; RV64I-NEXT:    .cfi_def_cfa_offset 16369; RV64I-NEXT:    sd zero, 0(sp)370; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill371; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill372; RV64I-NEXT:    .cfi_offset ra, -8373; RV64I-NEXT:    .cfi_offset s0, -16374; RV64I-NEXT:    addi s0, sp, 16375; RV64I-NEXT:    .cfi_def_cfa s0, 0376; RV64I-NEXT:    slli a0, a0, 2377; RV64I-NEXT:    addi a0, a0, 15378; RV64I-NEXT:    andi a0, a0, -16379; RV64I-NEXT:    sub a0, sp, a0380; RV64I-NEXT:    lui a1, 1381; RV64I-NEXT:  .LBB4_1: # %entry382; RV64I-NEXT:    # =>This Inner Loop Header: Depth=1383; RV64I-NEXT:    sub sp, sp, a1384; RV64I-NEXT:    sd zero, 0(sp)385; RV64I-NEXT:    blt a0, sp, .LBB4_1386; RV64I-NEXT:  # %bb.2: # %entry387; RV64I-NEXT:    mv sp, a0388; RV64I-NEXT:    lui a1, 1389; RV64I-NEXT:    sub sp, sp, a1390; RV64I-NEXT:    sd zero, 0(sp)391; RV64I-NEXT:    call callee_stack_args392; RV64I-NEXT:    lui a0, 1393; RV64I-NEXT:    add sp, sp, a0394; RV64I-NEXT:    addi sp, s0, -16395; RV64I-NEXT:    .cfi_def_cfa sp, 16396; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload397; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload398; RV64I-NEXT:    .cfi_restore ra399; RV64I-NEXT:    .cfi_restore s0400; RV64I-NEXT:    addi sp, sp, 16401; RV64I-NEXT:    .cfi_def_cfa_offset 0402; RV64I-NEXT:    ret403;404; RV32I-LABEL: no_reserved_call_frame:405; RV32I:       # %bb.0: # %entry406; RV32I-NEXT:    addi sp, sp, -16407; RV32I-NEXT:    .cfi_def_cfa_offset 16408; RV32I-NEXT:    sw zero, 0(sp)409; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill410; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill411; RV32I-NEXT:    .cfi_offset ra, -4412; RV32I-NEXT:    .cfi_offset s0, -8413; RV32I-NEXT:    addi s0, sp, 16414; RV32I-NEXT:    .cfi_def_cfa s0, 0415; RV32I-NEXT:    slli a0, a0, 2416; RV32I-NEXT:    addi a0, a0, 15417; RV32I-NEXT:    andi a0, a0, -16418; RV32I-NEXT:    sub a0, sp, a0419; RV32I-NEXT:    lui a1, 1420; RV32I-NEXT:  .LBB4_1: # %entry421; RV32I-NEXT:    # =>This Inner Loop Header: Depth=1422; RV32I-NEXT:    sub sp, sp, a1423; RV32I-NEXT:    sw zero, 0(sp)424; RV32I-NEXT:    blt a0, sp, .LBB4_1425; RV32I-NEXT:  # %bb.2: # %entry426; RV32I-NEXT:    mv sp, a0427; RV32I-NEXT:    lui a1, 1428; RV32I-NEXT:    sub sp, sp, a1429; RV32I-NEXT:    sw zero, 0(sp)430; RV32I-NEXT:    addi sp, sp, -32431; RV32I-NEXT:    sw zero, 0(sp)432; RV32I-NEXT:    call callee_stack_args433; RV32I-NEXT:    lui a0, 1434; RV32I-NEXT:    addi a0, a0, 32435; RV32I-NEXT:    add sp, sp, a0436; RV32I-NEXT:    addi sp, s0, -16437; RV32I-NEXT:    .cfi_def_cfa sp, 16438; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload439; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload440; RV32I-NEXT:    .cfi_restore ra441; RV32I-NEXT:    .cfi_restore s0442; RV32I-NEXT:    addi sp, sp, 16443; RV32I-NEXT:    .cfi_def_cfa_offset 0444; RV32I-NEXT:    ret445entry:446  %v = alloca i32, i64 %n447  call void @callee_stack_args(ptr %v, [518 x i64] poison)448  ret void449}450 451; Same as above but without a variable-sized allocation, so the reserved call452; frame can be folded into the fixed-size allocation in the prologue.453define void @reserved_call_frame(i64 %n) #0 {454; RV64I-LABEL: reserved_call_frame:455; RV64I:       # %bb.0: # %entry456; RV64I-NEXT:    addi sp, sp, -2032457; RV64I-NEXT:    .cfi_def_cfa_offset 2032458; RV64I-NEXT:    sd ra, 2024(sp) # 8-byte Folded Spill459; RV64I-NEXT:    .cfi_offset ra, -8460; RV64I-NEXT:    lui a0, 1461; RV64I-NEXT:    sub sp, sp, a0462; RV64I-NEXT:    sd zero, 0(sp)463; RV64I-NEXT:    .cfi_def_cfa_offset 6128464; RV64I-NEXT:    addi sp, sp, -48465; RV64I-NEXT:    .cfi_def_cfa_offset 6176466; RV64I-NEXT:    lui a0, 1467; RV64I-NEXT:    add a0, sp, a0468; RV64I-NEXT:    call callee_stack_args469; RV64I-NEXT:    lui a0, 1470; RV64I-NEXT:    addi a0, a0, 48471; RV64I-NEXT:    add sp, sp, a0472; RV64I-NEXT:    .cfi_def_cfa_offset 2032473; RV64I-NEXT:    ld ra, 2024(sp) # 8-byte Folded Reload474; RV64I-NEXT:    .cfi_restore ra475; RV64I-NEXT:    addi sp, sp, 2032476; RV64I-NEXT:    .cfi_def_cfa_offset 0477; RV64I-NEXT:    ret478;479; RV32I-LABEL: reserved_call_frame:480; RV32I:       # %bb.0: # %entry481; RV32I-NEXT:    addi sp, sp, -2032482; RV32I-NEXT:    .cfi_def_cfa_offset 2032483; RV32I-NEXT:    sw ra, 2028(sp) # 4-byte Folded Spill484; RV32I-NEXT:    .cfi_offset ra, -4485; RV32I-NEXT:    lui a0, 1486; RV32I-NEXT:    sub sp, sp, a0487; RV32I-NEXT:    sw zero, 0(sp)488; RV32I-NEXT:    .cfi_def_cfa_offset 6128489; RV32I-NEXT:    addi sp, sp, -80490; RV32I-NEXT:    .cfi_def_cfa_offset 6208491; RV32I-NEXT:    lui a0, 1492; RV32I-NEXT:    addi a0, a0, 36493; RV32I-NEXT:    add a0, sp, a0494; RV32I-NEXT:    call callee_stack_args495; RV32I-NEXT:    lui a0, 1496; RV32I-NEXT:    addi a0, a0, 80497; RV32I-NEXT:    add sp, sp, a0498; RV32I-NEXT:    .cfi_def_cfa_offset 2032499; RV32I-NEXT:    lw ra, 2028(sp) # 4-byte Folded Reload500; RV32I-NEXT:    .cfi_restore ra501; RV32I-NEXT:    addi sp, sp, 2032502; RV32I-NEXT:    .cfi_def_cfa_offset 0503; RV32I-NEXT:    ret504entry:505  %v = alloca i32, i64 518506  call void @callee_stack_args(ptr %v, [518 x i64] poison)507  ret void508}509 510declare void @callee_stack_args(ptr, [518 x i64])511 512; Dynamic allocation of vectors513define void @dynamic_vector(i64 %size, ptr %out) #0 {514; RV64I-LABEL: dynamic_vector:515; RV64I:       # %bb.0:516; RV64I-NEXT:    addi sp, sp, -16517; RV64I-NEXT:    .cfi_def_cfa_offset 16518; RV64I-NEXT:    sd zero, 0(sp)519; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill520; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill521; RV64I-NEXT:    .cfi_offset ra, -8522; RV64I-NEXT:    .cfi_offset s0, -16523; RV64I-NEXT:    addi s0, sp, 16524; RV64I-NEXT:    .cfi_def_cfa s0, 0525; RV64I-NEXT:    csrr a2, vlenb526; RV64I-NEXT:    mul a0, a2, a0527; RV64I-NEXT:    slli a0, a0, 1528; RV64I-NEXT:    sub a0, sp, a0529; RV64I-NEXT:    lui a2, 1530; RV64I-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1531; RV64I-NEXT:    sub sp, sp, a2532; RV64I-NEXT:    sd zero, 0(sp)533; RV64I-NEXT:    blt a0, sp, .LBB6_1534; RV64I-NEXT:  # %bb.2:535; RV64I-NEXT:    mv sp, a0536; RV64I-NEXT:    sd a0, 0(a1)537; RV64I-NEXT:    addi sp, s0, -16538; RV64I-NEXT:    .cfi_def_cfa sp, 16539; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload540; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload541; RV64I-NEXT:    .cfi_restore ra542; RV64I-NEXT:    .cfi_restore s0543; RV64I-NEXT:    addi sp, sp, 16544; RV64I-NEXT:    .cfi_def_cfa_offset 0545; RV64I-NEXT:    ret546;547; RV32I-LABEL: dynamic_vector:548; RV32I:       # %bb.0:549; RV32I-NEXT:    addi sp, sp, -16550; RV32I-NEXT:    .cfi_def_cfa_offset 16551; RV32I-NEXT:    sw zero, 0(sp)552; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill553; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill554; RV32I-NEXT:    .cfi_offset ra, -4555; RV32I-NEXT:    .cfi_offset s0, -8556; RV32I-NEXT:    addi s0, sp, 16557; RV32I-NEXT:    .cfi_def_cfa s0, 0558; RV32I-NEXT:    csrr a1, vlenb559; RV32I-NEXT:    mul a0, a1, a0560; RV32I-NEXT:    slli a0, a0, 1561; RV32I-NEXT:    sub a0, sp, a0562; RV32I-NEXT:    lui a1, 1563; RV32I-NEXT:  .LBB6_1: # =>This Inner Loop Header: Depth=1564; RV32I-NEXT:    sub sp, sp, a1565; RV32I-NEXT:    sw zero, 0(sp)566; RV32I-NEXT:    blt a0, sp, .LBB6_1567; RV32I-NEXT:  # %bb.2:568; RV32I-NEXT:    mv sp, a0569; RV32I-NEXT:    sw a0, 0(a2)570; RV32I-NEXT:    addi sp, s0, -16571; RV32I-NEXT:    .cfi_def_cfa sp, 16572; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload573; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload574; RV32I-NEXT:    .cfi_restore ra575; RV32I-NEXT:    .cfi_restore s0576; RV32I-NEXT:    addi sp, sp, 16577; RV32I-NEXT:    .cfi_def_cfa_offset 0578; RV32I-NEXT:    ret579  %v = alloca <vscale x 4 x float>, i64 %size, align 16580  store ptr %v, ptr %out, align 8581  ret void582}583 584attributes #0 = { uwtable(async) "probe-stack"="inline-asm" "frame-pointer"="none" }585