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 11; RUN: llc -mtriple=riscv32 --enable-shrink-wrap=false < %s \ 12; RUN: | FileCheck -check-prefix=RV32-DISABLESW %s 13; RUN: llc -mtriple=riscv64 --enable-shrink-wrap=false < %s \ 14; RUN: | FileCheck -check-prefix=RV64-DISABLESW %s 15; RUN: llc -mtriple=riscv32 -frame-pointer=all --enable-shrink-wrap=false -verify-machineinstrs < %s \ 16; RUN: | FileCheck -check-prefix=RV32-WITHFP-DISABLESW %s 17; RUN: llc -mtriple=riscv64 -frame-pointer=all --enable-shrink-wrap=false -verify-machineinstrs < %s \ 18; RUN: | FileCheck -check-prefix=RV64-WITHFP-DISABLESW %s 19 20define void @trivial() { 21; RV32-LABEL: trivial: 22; RV32: # %bb.0: 23; RV32-NEXT: ret 24; 25; RV64-LABEL: trivial: 26; RV64: # %bb.0: 27; RV64-NEXT: ret 28; 29; RV32-WITHFP-LABEL: trivial: 30; RV32-WITHFP: # %bb.0: 31; RV32-WITHFP-NEXT: addi sp, sp, -16 32; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 33; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 34; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 35; RV32-WITHFP-NEXT: .cfi_offset ra, -4 36; RV32-WITHFP-NEXT: .cfi_offset s0, -8 37; RV32-WITHFP-NEXT: addi s0, sp, 16 38; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 39; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16 40; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 41; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 42; RV32-WITHFP-NEXT: .cfi_restore ra 43; RV32-WITHFP-NEXT: .cfi_restore s0 44; RV32-WITHFP-NEXT: addi sp, sp, 16 45; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0 46; RV32-WITHFP-NEXT: ret 47; 48; RV64-WITHFP-LABEL: trivial: 49; RV64-WITHFP: # %bb.0: 50; RV64-WITHFP-NEXT: addi sp, sp, -16 51; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 52; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 53; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 54; RV64-WITHFP-NEXT: .cfi_offset ra, -8 55; RV64-WITHFP-NEXT: .cfi_offset s0, -16 56; RV64-WITHFP-NEXT: addi s0, sp, 16 57; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 58; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16 59; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 60; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 61; RV64-WITHFP-NEXT: .cfi_restore ra 62; RV64-WITHFP-NEXT: .cfi_restore s0 63; RV64-WITHFP-NEXT: addi sp, sp, 16 64; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0 65; RV64-WITHFP-NEXT: ret 66; 67; RV32-DISABLESW-LABEL: trivial: 68; RV32-DISABLESW: # %bb.0: 69; RV32-DISABLESW-NEXT: ret 70; 71; RV64-DISABLESW-LABEL: trivial: 72; RV64-DISABLESW: # %bb.0: 73; RV64-DISABLESW-NEXT: ret 74; 75; RV32-WITHFP-DISABLESW-LABEL: trivial: 76; RV32-WITHFP-DISABLESW: # %bb.0: 77; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 78; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 79; RV32-WITHFP-DISABLESW-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 80; RV32-WITHFP-DISABLESW-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 81; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -4 82; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -8 83; RV32-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 84; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 85; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 86; RV32-WITHFP-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 87; RV32-WITHFP-DISABLESW-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 88; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore ra 89; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore s0 90; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 91; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 92; RV32-WITHFP-DISABLESW-NEXT: ret 93; 94; RV64-WITHFP-DISABLESW-LABEL: trivial: 95; RV64-WITHFP-DISABLESW: # %bb.0: 96; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 97; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 98; RV64-WITHFP-DISABLESW-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 99; RV64-WITHFP-DISABLESW-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 100; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -8 101; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -16 102; RV64-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 103; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 104; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 105; RV64-WITHFP-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 106; RV64-WITHFP-DISABLESW-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 107; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore ra 108; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore s0 109; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 110; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 111; RV64-WITHFP-DISABLESW-NEXT: ret 112 ret void 113} 114 115define void @stack_alloc(i32 signext %size) { 116; RV32-LABEL: stack_alloc: 117; RV32: # %bb.0: # %entry 118; RV32-NEXT: addi sp, sp, -16 119; RV32-NEXT: .cfi_def_cfa_offset 16 120; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 121; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 122; RV32-NEXT: .cfi_offset ra, -4 123; RV32-NEXT: .cfi_offset s0, -8 124; RV32-NEXT: addi s0, sp, 16 125; RV32-NEXT: .cfi_def_cfa s0, 0 126; RV32-NEXT: addi a0, a0, 15 127; RV32-NEXT: andi a0, a0, -16 128; RV32-NEXT: sub a0, sp, a0 129; RV32-NEXT: mv sp, a0 130; RV32-NEXT: call callee_with_args 131; RV32-NEXT: addi sp, s0, -16 132; RV32-NEXT: .cfi_def_cfa sp, 16 133; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 134; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 135; RV32-NEXT: .cfi_restore ra 136; RV32-NEXT: .cfi_restore s0 137; RV32-NEXT: addi sp, sp, 16 138; RV32-NEXT: .cfi_def_cfa_offset 0 139; RV32-NEXT: ret 140; 141; RV64-LABEL: stack_alloc: 142; RV64: # %bb.0: # %entry 143; RV64-NEXT: addi sp, sp, -16 144; RV64-NEXT: .cfi_def_cfa_offset 16 145; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 146; RV64-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 147; RV64-NEXT: .cfi_offset ra, -8 148; RV64-NEXT: .cfi_offset s0, -16 149; RV64-NEXT: addi s0, sp, 16 150; RV64-NEXT: .cfi_def_cfa s0, 0 151; RV64-NEXT: slli a0, a0, 32 152; RV64-NEXT: srli a0, a0, 32 153; RV64-NEXT: addi a0, a0, 15 154; RV64-NEXT: andi a0, a0, -16 155; RV64-NEXT: sub a0, sp, a0 156; RV64-NEXT: mv sp, a0 157; RV64-NEXT: call callee_with_args 158; RV64-NEXT: addi sp, s0, -16 159; RV64-NEXT: .cfi_def_cfa sp, 16 160; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 161; RV64-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 162; RV64-NEXT: .cfi_restore ra 163; RV64-NEXT: .cfi_restore s0 164; RV64-NEXT: addi sp, sp, 16 165; RV64-NEXT: .cfi_def_cfa_offset 0 166; RV64-NEXT: ret 167; 168; RV32-WITHFP-LABEL: stack_alloc: 169; RV32-WITHFP: # %bb.0: # %entry 170; RV32-WITHFP-NEXT: addi sp, sp, -16 171; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 172; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 173; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 174; RV32-WITHFP-NEXT: .cfi_offset ra, -4 175; RV32-WITHFP-NEXT: .cfi_offset s0, -8 176; RV32-WITHFP-NEXT: addi s0, sp, 16 177; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 178; RV32-WITHFP-NEXT: addi a0, a0, 15 179; RV32-WITHFP-NEXT: andi a0, a0, -16 180; RV32-WITHFP-NEXT: sub a0, sp, a0 181; RV32-WITHFP-NEXT: mv sp, a0 182; RV32-WITHFP-NEXT: call callee_with_args 183; RV32-WITHFP-NEXT: addi sp, s0, -16 184; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16 185; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 186; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 187; RV32-WITHFP-NEXT: .cfi_restore ra 188; RV32-WITHFP-NEXT: .cfi_restore s0 189; RV32-WITHFP-NEXT: addi sp, sp, 16 190; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0 191; RV32-WITHFP-NEXT: ret 192; 193; RV64-WITHFP-LABEL: stack_alloc: 194; RV64-WITHFP: # %bb.0: # %entry 195; RV64-WITHFP-NEXT: addi sp, sp, -16 196; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 197; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 198; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 199; RV64-WITHFP-NEXT: .cfi_offset ra, -8 200; RV64-WITHFP-NEXT: .cfi_offset s0, -16 201; RV64-WITHFP-NEXT: addi s0, sp, 16 202; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 203; RV64-WITHFP-NEXT: slli a0, a0, 32 204; RV64-WITHFP-NEXT: srli a0, a0, 32 205; RV64-WITHFP-NEXT: addi a0, a0, 15 206; RV64-WITHFP-NEXT: andi a0, a0, -16 207; RV64-WITHFP-NEXT: sub a0, sp, a0 208; RV64-WITHFP-NEXT: mv sp, a0 209; RV64-WITHFP-NEXT: call callee_with_args 210; RV64-WITHFP-NEXT: addi sp, s0, -16 211; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16 212; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 213; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 214; RV64-WITHFP-NEXT: .cfi_restore ra 215; RV64-WITHFP-NEXT: .cfi_restore s0 216; RV64-WITHFP-NEXT: addi sp, sp, 16 217; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0 218; RV64-WITHFP-NEXT: ret 219; 220; RV32-DISABLESW-LABEL: stack_alloc: 221; RV32-DISABLESW: # %bb.0: # %entry 222; RV32-DISABLESW-NEXT: addi sp, sp, -16 223; RV32-DISABLESW-NEXT: .cfi_def_cfa_offset 16 224; RV32-DISABLESW-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 225; RV32-DISABLESW-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 226; RV32-DISABLESW-NEXT: .cfi_offset ra, -4 227; RV32-DISABLESW-NEXT: .cfi_offset s0, -8 228; RV32-DISABLESW-NEXT: addi s0, sp, 16 229; RV32-DISABLESW-NEXT: .cfi_def_cfa s0, 0 230; RV32-DISABLESW-NEXT: addi a0, a0, 15 231; RV32-DISABLESW-NEXT: andi a0, a0, -16 232; RV32-DISABLESW-NEXT: sub a0, sp, a0 233; RV32-DISABLESW-NEXT: mv sp, a0 234; RV32-DISABLESW-NEXT: call callee_with_args 235; RV32-DISABLESW-NEXT: addi sp, s0, -16 236; RV32-DISABLESW-NEXT: .cfi_def_cfa sp, 16 237; RV32-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 238; RV32-DISABLESW-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 239; RV32-DISABLESW-NEXT: .cfi_restore ra 240; RV32-DISABLESW-NEXT: .cfi_restore s0 241; RV32-DISABLESW-NEXT: addi sp, sp, 16 242; RV32-DISABLESW-NEXT: .cfi_def_cfa_offset 0 243; RV32-DISABLESW-NEXT: ret 244; 245; RV64-DISABLESW-LABEL: stack_alloc: 246; RV64-DISABLESW: # %bb.0: # %entry 247; RV64-DISABLESW-NEXT: addi sp, sp, -16 248; RV64-DISABLESW-NEXT: .cfi_def_cfa_offset 16 249; RV64-DISABLESW-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 250; RV64-DISABLESW-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 251; RV64-DISABLESW-NEXT: .cfi_offset ra, -8 252; RV64-DISABLESW-NEXT: .cfi_offset s0, -16 253; RV64-DISABLESW-NEXT: addi s0, sp, 16 254; RV64-DISABLESW-NEXT: .cfi_def_cfa s0, 0 255; RV64-DISABLESW-NEXT: slli a0, a0, 32 256; RV64-DISABLESW-NEXT: srli a0, a0, 32 257; RV64-DISABLESW-NEXT: addi a0, a0, 15 258; RV64-DISABLESW-NEXT: andi a0, a0, -16 259; RV64-DISABLESW-NEXT: sub a0, sp, a0 260; RV64-DISABLESW-NEXT: mv sp, a0 261; RV64-DISABLESW-NEXT: call callee_with_args 262; RV64-DISABLESW-NEXT: addi sp, s0, -16 263; RV64-DISABLESW-NEXT: .cfi_def_cfa sp, 16 264; RV64-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 265; RV64-DISABLESW-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 266; RV64-DISABLESW-NEXT: .cfi_restore ra 267; RV64-DISABLESW-NEXT: .cfi_restore s0 268; RV64-DISABLESW-NEXT: addi sp, sp, 16 269; RV64-DISABLESW-NEXT: .cfi_def_cfa_offset 0 270; RV64-DISABLESW-NEXT: ret 271; 272; RV32-WITHFP-DISABLESW-LABEL: stack_alloc: 273; RV32-WITHFP-DISABLESW: # %bb.0: # %entry 274; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 275; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 276; RV32-WITHFP-DISABLESW-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 277; RV32-WITHFP-DISABLESW-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 278; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -4 279; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -8 280; RV32-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 281; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 282; RV32-WITHFP-DISABLESW-NEXT: addi a0, a0, 15 283; RV32-WITHFP-DISABLESW-NEXT: andi a0, a0, -16 284; RV32-WITHFP-DISABLESW-NEXT: sub a0, sp, a0 285; RV32-WITHFP-DISABLESW-NEXT: mv sp, a0 286; RV32-WITHFP-DISABLESW-NEXT: call callee_with_args 287; RV32-WITHFP-DISABLESW-NEXT: addi sp, s0, -16 288; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 289; RV32-WITHFP-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 290; RV32-WITHFP-DISABLESW-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 291; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore ra 292; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore s0 293; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 294; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 295; RV32-WITHFP-DISABLESW-NEXT: ret 296; 297; RV64-WITHFP-DISABLESW-LABEL: stack_alloc: 298; RV64-WITHFP-DISABLESW: # %bb.0: # %entry 299; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 300; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 301; RV64-WITHFP-DISABLESW-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 302; RV64-WITHFP-DISABLESW-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 303; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -8 304; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -16 305; RV64-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 306; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 307; RV64-WITHFP-DISABLESW-NEXT: slli a0, a0, 32 308; RV64-WITHFP-DISABLESW-NEXT: srli a0, a0, 32 309; RV64-WITHFP-DISABLESW-NEXT: addi a0, a0, 15 310; RV64-WITHFP-DISABLESW-NEXT: andi a0, a0, -16 311; RV64-WITHFP-DISABLESW-NEXT: sub a0, sp, a0 312; RV64-WITHFP-DISABLESW-NEXT: mv sp, a0 313; RV64-WITHFP-DISABLESW-NEXT: call callee_with_args 314; RV64-WITHFP-DISABLESW-NEXT: addi sp, s0, -16 315; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 316; RV64-WITHFP-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 317; RV64-WITHFP-DISABLESW-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 318; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore ra 319; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore s0 320; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 321; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 322; RV64-WITHFP-DISABLESW-NEXT: ret 323entry: 324 %0 = alloca i8, i32 %size, align 16 325 call void @callee_with_args(ptr nonnull %0) 326 ret void 327} 328 329define void @branch_and_tail_call(i1 %a) { 330; RV32-LABEL: branch_and_tail_call: 331; RV32: # %bb.0: 332; RV32-NEXT: andi a0, a0, 1 333; RV32-NEXT: beqz a0, .LBB2_2 334; RV32-NEXT: # %bb.1: # %blue_pill 335; RV32-NEXT: tail callee1 336; RV32-NEXT: .LBB2_2: # %red_pill 337; RV32-NEXT: addi sp, sp, -16 338; RV32-NEXT: .cfi_def_cfa_offset 16 339; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 340; RV32-NEXT: .cfi_offset ra, -4 341; RV32-NEXT: call callee2 342; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 343; RV32-NEXT: .cfi_restore ra 344; RV32-NEXT: addi sp, sp, 16 345; RV32-NEXT: .cfi_def_cfa_offset 0 346; RV32-NEXT: ret 347; 348; RV64-LABEL: branch_and_tail_call: 349; RV64: # %bb.0: 350; RV64-NEXT: andi a0, a0, 1 351; RV64-NEXT: beqz a0, .LBB2_2 352; RV64-NEXT: # %bb.1: # %blue_pill 353; RV64-NEXT: tail callee1 354; RV64-NEXT: .LBB2_2: # %red_pill 355; RV64-NEXT: addi sp, sp, -16 356; RV64-NEXT: .cfi_def_cfa_offset 16 357; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 358; RV64-NEXT: .cfi_offset ra, -8 359; RV64-NEXT: call callee2 360; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 361; RV64-NEXT: .cfi_restore ra 362; RV64-NEXT: addi sp, sp, 16 363; RV64-NEXT: .cfi_def_cfa_offset 0 364; RV64-NEXT: ret 365; 366; RV32-WITHFP-LABEL: branch_and_tail_call: 367; RV32-WITHFP: # %bb.0: 368; RV32-WITHFP-NEXT: andi a0, a0, 1 369; RV32-WITHFP-NEXT: beqz a0, .LBB2_2 370; RV32-WITHFP-NEXT: # %bb.1: # %blue_pill 371; RV32-WITHFP-NEXT: tail callee1 372; RV32-WITHFP-NEXT: .LBB2_2: # %red_pill 373; RV32-WITHFP-NEXT: addi sp, sp, -16 374; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16 375; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 376; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 377; RV32-WITHFP-NEXT: .cfi_offset ra, -4 378; RV32-WITHFP-NEXT: .cfi_offset s0, -8 379; RV32-WITHFP-NEXT: addi s0, sp, 16 380; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0 381; RV32-WITHFP-NEXT: call callee2 382; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16 383; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 384; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 385; RV32-WITHFP-NEXT: .cfi_restore ra 386; RV32-WITHFP-NEXT: .cfi_restore s0 387; RV32-WITHFP-NEXT: addi sp, sp, 16 388; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0 389; RV32-WITHFP-NEXT: ret 390; 391; RV64-WITHFP-LABEL: branch_and_tail_call: 392; RV64-WITHFP: # %bb.0: 393; RV64-WITHFP-NEXT: andi a0, a0, 1 394; RV64-WITHFP-NEXT: beqz a0, .LBB2_2 395; RV64-WITHFP-NEXT: # %bb.1: # %blue_pill 396; RV64-WITHFP-NEXT: tail callee1 397; RV64-WITHFP-NEXT: .LBB2_2: # %red_pill 398; RV64-WITHFP-NEXT: addi sp, sp, -16 399; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16 400; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 401; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 402; RV64-WITHFP-NEXT: .cfi_offset ra, -8 403; RV64-WITHFP-NEXT: .cfi_offset s0, -16 404; RV64-WITHFP-NEXT: addi s0, sp, 16 405; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0 406; RV64-WITHFP-NEXT: call callee2 407; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16 408; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 409; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 410; RV64-WITHFP-NEXT: .cfi_restore ra 411; RV64-WITHFP-NEXT: .cfi_restore s0 412; RV64-WITHFP-NEXT: addi sp, sp, 16 413; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0 414; RV64-WITHFP-NEXT: ret 415; 416; RV32-DISABLESW-LABEL: branch_and_tail_call: 417; RV32-DISABLESW: # %bb.0: 418; RV32-DISABLESW-NEXT: addi sp, sp, -16 419; RV32-DISABLESW-NEXT: .cfi_def_cfa_offset 16 420; RV32-DISABLESW-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 421; RV32-DISABLESW-NEXT: .cfi_offset ra, -4 422; RV32-DISABLESW-NEXT: .cfi_remember_state 423; RV32-DISABLESW-NEXT: andi a0, a0, 1 424; RV32-DISABLESW-NEXT: beqz a0, .LBB2_2 425; RV32-DISABLESW-NEXT: # %bb.1: # %blue_pill 426; RV32-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 427; RV32-DISABLESW-NEXT: .cfi_restore ra 428; RV32-DISABLESW-NEXT: addi sp, sp, 16 429; RV32-DISABLESW-NEXT: .cfi_def_cfa_offset 0 430; RV32-DISABLESW-NEXT: tail callee1 431; RV32-DISABLESW-NEXT: .LBB2_2: # %red_pill 432; RV32-DISABLESW-NEXT: .cfi_restore_state 433; RV32-DISABLESW-NEXT: call callee2 434; RV32-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 435; RV32-DISABLESW-NEXT: .cfi_restore ra 436; RV32-DISABLESW-NEXT: addi sp, sp, 16 437; RV32-DISABLESW-NEXT: .cfi_def_cfa_offset 0 438; RV32-DISABLESW-NEXT: ret 439; 440; RV64-DISABLESW-LABEL: branch_and_tail_call: 441; RV64-DISABLESW: # %bb.0: 442; RV64-DISABLESW-NEXT: addi sp, sp, -16 443; RV64-DISABLESW-NEXT: .cfi_def_cfa_offset 16 444; RV64-DISABLESW-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 445; RV64-DISABLESW-NEXT: .cfi_offset ra, -8 446; RV64-DISABLESW-NEXT: .cfi_remember_state 447; RV64-DISABLESW-NEXT: andi a0, a0, 1 448; RV64-DISABLESW-NEXT: beqz a0, .LBB2_2 449; RV64-DISABLESW-NEXT: # %bb.1: # %blue_pill 450; RV64-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 451; RV64-DISABLESW-NEXT: .cfi_restore ra 452; RV64-DISABLESW-NEXT: addi sp, sp, 16 453; RV64-DISABLESW-NEXT: .cfi_def_cfa_offset 0 454; RV64-DISABLESW-NEXT: tail callee1 455; RV64-DISABLESW-NEXT: .LBB2_2: # %red_pill 456; RV64-DISABLESW-NEXT: .cfi_restore_state 457; RV64-DISABLESW-NEXT: call callee2 458; RV64-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 459; RV64-DISABLESW-NEXT: .cfi_restore ra 460; RV64-DISABLESW-NEXT: addi sp, sp, 16 461; RV64-DISABLESW-NEXT: .cfi_def_cfa_offset 0 462; RV64-DISABLESW-NEXT: ret 463; 464; RV32-WITHFP-DISABLESW-LABEL: branch_and_tail_call: 465; RV32-WITHFP-DISABLESW: # %bb.0: 466; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 467; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 468; RV32-WITHFP-DISABLESW-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 469; RV32-WITHFP-DISABLESW-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 470; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -4 471; RV32-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -8 472; RV32-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 473; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 474; RV32-WITHFP-DISABLESW-NEXT: .cfi_remember_state 475; RV32-WITHFP-DISABLESW-NEXT: andi a0, a0, 1 476; RV32-WITHFP-DISABLESW-NEXT: beqz a0, .LBB2_2 477; RV32-WITHFP-DISABLESW-NEXT: # %bb.1: # %blue_pill 478; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 479; RV32-WITHFP-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 480; RV32-WITHFP-DISABLESW-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 481; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore ra 482; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore s0 483; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 484; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 485; RV32-WITHFP-DISABLESW-NEXT: tail callee1 486; RV32-WITHFP-DISABLESW-NEXT: .LBB2_2: # %red_pill 487; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore_state 488; RV32-WITHFP-DISABLESW-NEXT: call callee2 489; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 490; RV32-WITHFP-DISABLESW-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 491; RV32-WITHFP-DISABLESW-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 492; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore ra 493; RV32-WITHFP-DISABLESW-NEXT: .cfi_restore s0 494; RV32-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 495; RV32-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 496; RV32-WITHFP-DISABLESW-NEXT: ret 497; 498; RV64-WITHFP-DISABLESW-LABEL: branch_and_tail_call: 499; RV64-WITHFP-DISABLESW: # %bb.0: 500; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, -16 501; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 16 502; RV64-WITHFP-DISABLESW-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 503; RV64-WITHFP-DISABLESW-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 504; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset ra, -8 505; RV64-WITHFP-DISABLESW-NEXT: .cfi_offset s0, -16 506; RV64-WITHFP-DISABLESW-NEXT: addi s0, sp, 16 507; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa s0, 0 508; RV64-WITHFP-DISABLESW-NEXT: .cfi_remember_state 509; RV64-WITHFP-DISABLESW-NEXT: andi a0, a0, 1 510; RV64-WITHFP-DISABLESW-NEXT: beqz a0, .LBB2_2 511; RV64-WITHFP-DISABLESW-NEXT: # %bb.1: # %blue_pill 512; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 513; RV64-WITHFP-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 514; RV64-WITHFP-DISABLESW-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 515; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore ra 516; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore s0 517; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 518; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 519; RV64-WITHFP-DISABLESW-NEXT: tail callee1 520; RV64-WITHFP-DISABLESW-NEXT: .LBB2_2: # %red_pill 521; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore_state 522; RV64-WITHFP-DISABLESW-NEXT: call callee2 523; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa sp, 16 524; RV64-WITHFP-DISABLESW-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 525; RV64-WITHFP-DISABLESW-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 526; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore ra 527; RV64-WITHFP-DISABLESW-NEXT: .cfi_restore s0 528; RV64-WITHFP-DISABLESW-NEXT: addi sp, sp, 16 529; RV64-WITHFP-DISABLESW-NEXT: .cfi_def_cfa_offset 0 530; RV64-WITHFP-DISABLESW-NEXT: ret 531 br i1 %a, label %blue_pill, label %red_pill 532blue_pill: 533 tail call void @callee1() 534 ret void 535red_pill: 536 call void @callee2() 537 ret void 538} 539 540declare void @callee1() 541declare void @callee2() 542declare void @callee_with_args(ptr) 543