1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 < %s \ 3; RUN: | FileCheck -check-prefix=RV32 %s 4; RUN: llc -mtriple=riscv64 < %s \ 5; RUN: | FileCheck -check-prefix=RV64 %s 6; RUN: llc -mtriple=riscv32 -frame-pointer=all -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV32-WITHFP %s 8; RUN: llc -mtriple=riscv64 -frame-pointer=all -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64-WITHFP %s 10 11define void @trivial() { 12; RV32-LABEL: trivial: 13; RV32: # %bb.0: 14; RV32-NEXT: ret 15; 16; RV64-LABEL: trivial: 17; RV64: # %bb.0: 18; RV64-NEXT: ret 19; 20; RV32-WITHFP-LABEL: trivial: 21; RV32-WITHFP: # %bb.0: 22; RV32-WITHFP-NEXT: addi sp, sp, -16 23; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 24; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 25; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 26; RV32-WITHFP-NEXT: .cfi_offset ra, -4 27; RV32-WITHFP-NEXT: .cfi_offset s0, -8 28; RV32-WITHFP-NEXT: addi s0, sp, 16 29; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 30; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 31; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 32; RV32-WITHFP-NEXT: addi sp, sp, 16 33; RV32-WITHFP-NEXT: ret 34; 35; RV64-WITHFP-LABEL: trivial: 36; RV64-WITHFP: # %bb.0: 37; RV64-WITHFP-NEXT: addi sp, sp, -16 38; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 39; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 40; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 41; RV64-WITHFP-NEXT: .cfi_offset ra, -8 42; RV64-WITHFP-NEXT: .cfi_offset s0, -16 43; RV64-WITHFP-NEXT: addi s0, sp, 16 44; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 45; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 46; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 47; RV64-WITHFP-NEXT: addi sp, sp, 16 48; RV64-WITHFP-NEXT: ret 49 ret void 50} 51 52define void @stack_alloc(i32 signext %size) { 53; RV32-LABEL: stack_alloc: 54; RV32: # %bb.0: # %entry 55; RV32-NEXT: addi sp, sp, -16 56; RV32-NEXT: .cfi_def_cfa_offset 16 57; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 58; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 59; RV32-NEXT: .cfi_offset ra, -4 60; RV32-NEXT: .cfi_offset s0, -8 61; RV32-NEXT: addi s0, sp, 16 62; RV32-NEXT: .cfi_def_cfa s0, 0 63; RV32-NEXT: addi a0, a0, 15 64; RV32-NEXT: andi a0, a0, -16 65; RV32-NEXT: sub a0, sp, a0 66; RV32-NEXT: mv sp, a0 67; RV32-NEXT: call callee_with_args@plt 68; RV32-NEXT: addi sp, s0, -16 69; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 70; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 71; RV32-NEXT: addi sp, sp, 16 72; RV32-NEXT: ret 73; 74; RV64-LABEL: stack_alloc: 75; RV64: # %bb.0: # %entry 76; RV64-NEXT: addi sp, sp, -16 77; RV64-NEXT: .cfi_def_cfa_offset 16 78; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 79; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 80; RV64-NEXT: .cfi_offset ra, -8 81; RV64-NEXT: .cfi_offset s0, -16 82; RV64-NEXT: addi s0, sp, 16 83; RV64-NEXT: .cfi_def_cfa s0, 0 84; RV64-NEXT: slli a0, a0, 32 85; RV64-NEXT: srli a0, a0, 32 86; RV64-NEXT: addi a0, a0, 15 87; RV64-NEXT: andi a0, a0, -16 88; RV64-NEXT: sub a0, sp, a0 89; RV64-NEXT: mv sp, a0 90; RV64-NEXT: call callee_with_args@plt 91; RV64-NEXT: addi sp, s0, -16 92; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 93; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 94; RV64-NEXT: addi sp, sp, 16 95; RV64-NEXT: ret 96; 97; RV32-WITHFP-LABEL: stack_alloc: 98; RV32-WITHFP: # %bb.0: # %entry 99; RV32-WITHFP-NEXT: addi sp, sp, -16 100; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 101; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 102; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 103; RV32-WITHFP-NEXT: .cfi_offset ra, -4 104; RV32-WITHFP-NEXT: .cfi_offset s0, -8 105; RV32-WITHFP-NEXT: addi s0, sp, 16 106; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 107; RV32-WITHFP-NEXT: addi a0, a0, 15 108; RV32-WITHFP-NEXT: andi a0, a0, -16 109; RV32-WITHFP-NEXT: sub a0, sp, a0 110; RV32-WITHFP-NEXT: mv sp, a0 111; RV32-WITHFP-NEXT: call callee_with_args@plt 112; RV32-WITHFP-NEXT: addi sp, s0, -16 113; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 114; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 115; RV32-WITHFP-NEXT: addi sp, sp, 16 116; RV32-WITHFP-NEXT: ret 117; 118; RV64-WITHFP-LABEL: stack_alloc: 119; RV64-WITHFP: # %bb.0: # %entry 120; RV64-WITHFP-NEXT: addi sp, sp, -16 121; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 122; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 123; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 124; RV64-WITHFP-NEXT: .cfi_offset ra, -8 125; RV64-WITHFP-NEXT: .cfi_offset s0, -16 126; RV64-WITHFP-NEXT: addi s0, sp, 16 127; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 128; RV64-WITHFP-NEXT: slli a0, a0, 32 129; RV64-WITHFP-NEXT: srli a0, a0, 32 130; RV64-WITHFP-NEXT: addi a0, a0, 15 131; RV64-WITHFP-NEXT: andi a0, a0, -16 132; RV64-WITHFP-NEXT: sub a0, sp, a0 133; RV64-WITHFP-NEXT: mv sp, a0 134; RV64-WITHFP-NEXT: call callee_with_args@plt 135; RV64-WITHFP-NEXT: addi sp, s0, -16 136; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 137; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 138; RV64-WITHFP-NEXT: addi sp, sp, 16 139; RV64-WITHFP-NEXT: ret 140entry: 141 %0 = alloca i8, i32 %size, align 16 142 call void @callee_with_args(i8* nonnull %0) 143 ret void 144} 145 146define void @branch_and_tail_call(i1 %a) { 147; RV32-LABEL: branch_and_tail_call: 148; RV32: # %bb.0: 149; RV32-NEXT: andi a0, a0, 1 150; RV32-NEXT: beqz a0, .LBB2_2 151; RV32-NEXT: # %bb.1: # %blue_pill 152; RV32-NEXT: tail callee1@plt 153; RV32-NEXT: .LBB2_2: # %red_pill 154; RV32-NEXT: addi sp, sp, -16 155; RV32-NEXT: .cfi_def_cfa_offset 16 156; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 157; RV32-NEXT: .cfi_offset ra, -4 158; RV32-NEXT: call callee2@plt 159; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 160; RV32-NEXT: addi sp, sp, 16 161; RV32-NEXT: ret 162; 163; RV64-LABEL: branch_and_tail_call: 164; RV64: # %bb.0: 165; RV64-NEXT: andi a0, a0, 1 166; RV64-NEXT: beqz a0, .LBB2_2 167; RV64-NEXT: # %bb.1: # %blue_pill 168; RV64-NEXT: tail callee1@plt 169; RV64-NEXT: .LBB2_2: # %red_pill 170; RV64-NEXT: addi sp, sp, -16 171; RV64-NEXT: .cfi_def_cfa_offset 16 172; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 173; RV64-NEXT: .cfi_offset ra, -8 174; RV64-NEXT: call callee2@plt 175; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 176; RV64-NEXT: addi sp, sp, 16 177; RV64-NEXT: ret 178; 179; RV32-WITHFP-LABEL: branch_and_tail_call: 180; RV32-WITHFP: # %bb.0: 181; RV32-WITHFP-NEXT: andi a0, a0, 1 182; RV32-WITHFP-NEXT: beqz a0, .LBB2_2 183; RV32-WITHFP-NEXT: # %bb.1: # %blue_pill 184; RV32-WITHFP-NEXT: tail callee1@plt 185; RV32-WITHFP-NEXT: .LBB2_2: # %red_pill 186; RV32-WITHFP-NEXT: addi sp, sp, -16 187; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 188; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 189; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 190; RV32-WITHFP-NEXT: .cfi_offset ra, -4 191; RV32-WITHFP-NEXT: .cfi_offset s0, -8 192; RV32-WITHFP-NEXT: addi s0, sp, 16 193; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 194; RV32-WITHFP-NEXT: call callee2@plt 195; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 196; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 197; RV32-WITHFP-NEXT: addi sp, sp, 16 198; RV32-WITHFP-NEXT: ret 199; 200; RV64-WITHFP-LABEL: branch_and_tail_call: 201; RV64-WITHFP: # %bb.0: 202; RV64-WITHFP-NEXT: andi a0, a0, 1 203; RV64-WITHFP-NEXT: beqz a0, .LBB2_2 204; RV64-WITHFP-NEXT: # %bb.1: # %blue_pill 205; RV64-WITHFP-NEXT: tail callee1@plt 206; RV64-WITHFP-NEXT: .LBB2_2: # %red_pill 207; RV64-WITHFP-NEXT: addi sp, sp, -16 208; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 209; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 210; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 211; RV64-WITHFP-NEXT: .cfi_offset ra, -8 212; RV64-WITHFP-NEXT: .cfi_offset s0, -16 213; RV64-WITHFP-NEXT: addi s0, sp, 16 214; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 215; RV64-WITHFP-NEXT: call callee2@plt 216; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 217; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 218; RV64-WITHFP-NEXT: addi sp, sp, 16 219; RV64-WITHFP-NEXT: ret 220 br i1 %a, label %blue_pill, label %red_pill 221blue_pill: 222 tail call void @callee1() 223 ret void 224red_pill: 225 call void @callee2() 226 ret void 227} 228 229declare void @callee1() 230declare void @callee2() 231declare void @callee_with_args(i8*) 232