brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.3 KiB · 6756fea Raw
636 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple riscv32-unknown-linux-gnu -o - %s | FileCheck %s3; RUN: llc -mtriple riscv32-unknown-linux-gnu -mattr=experimental-zicfilp \4; RUN:   -code-model=large -o - %s \5; RUN:   | FileCheck %s -check-prefix=CHECK-LARGE-ZICFILP6; RUN: llc -mtriple riscv32-unknown-elf       -o - %s | FileCheck %s7 8; Perform tail call optimization for global address.9declare i32 @callee_tail(i32 %i)10define i32 @caller_tail(i32 %i) nounwind {11; CHECK-LABEL: caller_tail:12; CHECK:       # %bb.0: # %entry13; CHECK-NEXT:    tail callee_tail14;15; CHECK-LARGE-ZICFILP-LABEL: caller_tail:16; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry17; CHECK-LARGE-ZICFILP-NEXT:    lpad 018; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi0:19; CHECK-LARGE-ZICFILP-NEXT:    auipc a1, %pcrel_hi(.LCPI0_0)20; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi0)(a1)21; CHECK-LARGE-ZICFILP-NEXT:    jr t222entry:23  %r = tail call i32 @callee_tail(i32 %i)24  ret i32 %r25}26 27; Perform tail call optimization for external symbol.28@dest = global [2 x i8] zeroinitializer29define void @caller_extern(ptr %src) optsize {30; CHECK-LABEL: caller_extern:31; CHECK:       # %bb.0: # %entry32; CHECK-NEXT:    lui a1, %hi(dest)33; CHECK-NEXT:    addi a1, a1, %lo(dest)34; CHECK-NEXT:    li a2, 735; CHECK-NEXT:    mv a3, a036; CHECK-NEXT:    mv a0, a137; CHECK-NEXT:    mv a1, a338; CHECK-NEXT:    tail memcpy39;40; CHECK-LARGE-ZICFILP-LABEL: caller_extern:41; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry42; CHECK-LARGE-ZICFILP-NEXT:    lpad 043; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi1:44; CHECK-LARGE-ZICFILP-NEXT:    auipc a1, %pcrel_hi(.LCPI1_0)45; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi2:46; CHECK-LARGE-ZICFILP-NEXT:    auipc a2, %pcrel_hi(.LCPI1_1)47; CHECK-LARGE-ZICFILP-NEXT:    lw a1, %pcrel_lo(.Lpcrel_hi1)(a1)48; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi2)(a2)49; CHECK-LARGE-ZICFILP-NEXT:    li a2, 750; CHECK-LARGE-ZICFILP-NEXT:    mv a3, a051; CHECK-LARGE-ZICFILP-NEXT:    mv a0, a152; CHECK-LARGE-ZICFILP-NEXT:    mv a1, a353; CHECK-LARGE-ZICFILP-NEXT:    jr t254entry:55  tail call void @llvm.memcpy.p0.p0.i32(ptr @dest, ptr %src, i32 7, i1 false)56  ret void57}58 59; Perform tail call optimization for external symbol.60@dest_pgso = global [2 x i8] zeroinitializer61define void @caller_extern_pgso(ptr %src) !prof !14 {62; CHECK-LABEL: caller_extern_pgso:63; CHECK:       # %bb.0: # %entry64; CHECK-NEXT:    lui a1, %hi(dest_pgso)65; CHECK-NEXT:    addi a1, a1, %lo(dest_pgso)66; CHECK-NEXT:    li a2, 767; CHECK-NEXT:    mv a3, a068; CHECK-NEXT:    mv a0, a169; CHECK-NEXT:    mv a1, a370; CHECK-NEXT:    tail memcpy71;72; CHECK-LARGE-ZICFILP-LABEL: caller_extern_pgso:73; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry74; CHECK-LARGE-ZICFILP-NEXT:    lpad 075; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi3:76; CHECK-LARGE-ZICFILP-NEXT:    auipc a1, %pcrel_hi(.LCPI2_0)77; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi4:78; CHECK-LARGE-ZICFILP-NEXT:    auipc a2, %pcrel_hi(.LCPI2_1)79; CHECK-LARGE-ZICFILP-NEXT:    lw a1, %pcrel_lo(.Lpcrel_hi3)(a1)80; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi4)(a2)81; CHECK-LARGE-ZICFILP-NEXT:    li a2, 782; CHECK-LARGE-ZICFILP-NEXT:    mv a3, a083; CHECK-LARGE-ZICFILP-NEXT:    mv a0, a184; CHECK-LARGE-ZICFILP-NEXT:    mv a1, a385; CHECK-LARGE-ZICFILP-NEXT:    jr t286entry:87  tail call void @llvm.memcpy.p0.p0.i32(ptr @dest_pgso, ptr %src, i32 7, i1 false)88  ret void89}90 91; Perform indirect tail call optimization (for function pointer call).92declare void @callee_indirect1()93declare void @callee_indirect2()94define void @caller_indirect_tail(i32 %a) nounwind {95; CHECK-LABEL: caller_indirect_tail:96; CHECK:       # %bb.0: # %entry97; CHECK-NEXT:    beqz a0, .LBB3_298; CHECK-NEXT:  # %bb.1: # %entry99; CHECK-NEXT:    lui t1, %hi(callee_indirect2)100; CHECK-NEXT:    addi t1, t1, %lo(callee_indirect2)101; CHECK-NEXT:    jr t1102; CHECK-NEXT:  .LBB3_2:103; CHECK-NEXT:    lui t1, %hi(callee_indirect1)104; CHECK-NEXT:    addi t1, t1, %lo(callee_indirect1)105; CHECK-NEXT:    jr t1106;107; CHECK-LARGE-ZICFILP-LABEL: caller_indirect_tail:108; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry109; CHECK-LARGE-ZICFILP-NEXT:    lpad 0110; CHECK-LARGE-ZICFILP-NEXT:    beqz a0, .LBB3_2111; CHECK-LARGE-ZICFILP-NEXT:  # %bb.1: # %entry112; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi6:113; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI3_0)114; CHECK-LARGE-ZICFILP-NEXT:    lw t1, %pcrel_lo(.Lpcrel_hi6)(a0)115; CHECK-LARGE-ZICFILP-NEXT:    jr t1116; CHECK-LARGE-ZICFILP-NEXT:  .LBB3_2:117; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi5:118; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI3_1)119; CHECK-LARGE-ZICFILP-NEXT:    lw t1, %pcrel_lo(.Lpcrel_hi5)(a0)120; CHECK-LARGE-ZICFILP-NEXT:    jr t1121entry:122  %tobool = icmp eq i32 %a, 0123  %callee = select i1 %tobool, ptr @callee_indirect1, ptr @callee_indirect2124  tail call void %callee()125  ret void126}127 128; Make sure we don't use t0 as the source for jr as that is a hint to pop the129; return address stack on some microarchitectures.130define i32 @caller_indirect_no_t0(ptr %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7) {131; CHECK-LABEL: caller_indirect_no_t0:132; CHECK:       # %bb.0:133; CHECK-NEXT:    mv t1, a0134; CHECK-NEXT:    mv a0, a1135; CHECK-NEXT:    mv a1, a2136; CHECK-NEXT:    mv a2, a3137; CHECK-NEXT:    mv a3, a4138; CHECK-NEXT:    mv a4, a5139; CHECK-NEXT:    mv a5, a6140; CHECK-NEXT:    mv a6, a7141; CHECK-NEXT:    jr t1142;143; CHECK-LARGE-ZICFILP-LABEL: caller_indirect_no_t0:144; CHECK-LARGE-ZICFILP:       # %bb.0:145; CHECK-LARGE-ZICFILP-NEXT:    lpad 0146; CHECK-LARGE-ZICFILP-NEXT:    mv t1, a0147; CHECK-LARGE-ZICFILP-NEXT:    mv a0, a1148; CHECK-LARGE-ZICFILP-NEXT:    mv a1, a2149; CHECK-LARGE-ZICFILP-NEXT:    mv a2, a3150; CHECK-LARGE-ZICFILP-NEXT:    mv a3, a4151; CHECK-LARGE-ZICFILP-NEXT:    mv a4, a5152; CHECK-LARGE-ZICFILP-NEXT:    mv a5, a6153; CHECK-LARGE-ZICFILP-NEXT:    mv a6, a7154; CHECK-LARGE-ZICFILP-NEXT:    jr t1155  %9 = tail call i32 %0(i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7)156  ret i32 %9157}158 159; Do not tail call optimize functions with varargs passed by stack.160declare i32 @callee_varargs(i32, ...)161define void @caller_varargs(i32 %a, i32 %b) nounwind {162; CHECK-LABEL: caller_varargs:163; CHECK:       # %bb.0: # %entry164; CHECK-NEXT:    addi sp, sp, -16165; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill166; CHECK-NEXT:    sw a0, 0(sp)167; CHECK-NEXT:    mv a2, a1168; CHECK-NEXT:    mv a3, a0169; CHECK-NEXT:    mv a4, a0170; CHECK-NEXT:    mv a5, a1171; CHECK-NEXT:    mv a6, a1172; CHECK-NEXT:    mv a7, a0173; CHECK-NEXT:    call callee_varargs174; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload175; CHECK-NEXT:    addi sp, sp, 16176; CHECK-NEXT:    ret177;178; CHECK-LARGE-ZICFILP-LABEL: caller_varargs:179; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry180; CHECK-LARGE-ZICFILP-NEXT:    lpad 0181; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -16182; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill183; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi7:184; CHECK-LARGE-ZICFILP-NEXT:    auipc a2, %pcrel_hi(.LCPI5_0)185; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi7)(a2)186; CHECK-LARGE-ZICFILP-NEXT:    sw a0, 0(sp)187; CHECK-LARGE-ZICFILP-NEXT:    mv a2, a1188; CHECK-LARGE-ZICFILP-NEXT:    mv a3, a0189; CHECK-LARGE-ZICFILP-NEXT:    mv a4, a0190; CHECK-LARGE-ZICFILP-NEXT:    mv a5, a1191; CHECK-LARGE-ZICFILP-NEXT:    mv a6, a1192; CHECK-LARGE-ZICFILP-NEXT:    mv a7, a0193; CHECK-LARGE-ZICFILP-NEXT:    jalr t2194; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload195; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 16196; CHECK-LARGE-ZICFILP-NEXT:    ret197entry:198  %call = tail call i32 (i32, ...) @callee_varargs(i32 %a, i32 %b, i32 %b, i32 %a, i32 %a, i32 %b, i32 %b, i32 %a, i32 %a)199  ret void200}201 202; Do not tail call optimize if stack is used to pass parameters.203declare i32 @callee_args(i32 %a, i32 %b, i32 %c, i32 %dd, i32 %e, i32 %ff, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n)204define i32 @caller_args(i32 %a, i32 %b, i32 %c, i32 %dd, i32 %e, i32 %ff, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n) nounwind {205; CHECK-LABEL: caller_args:206; CHECK:       # %bb.0: # %entry207; CHECK-NEXT:    addi sp, sp, -32208; CHECK-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill209; CHECK-NEXT:    lw t0, 32(sp)210; CHECK-NEXT:    lw t1, 36(sp)211; CHECK-NEXT:    lw t2, 40(sp)212; CHECK-NEXT:    lw t3, 44(sp)213; CHECK-NEXT:    lw t4, 48(sp)214; CHECK-NEXT:    lw t5, 52(sp)215; CHECK-NEXT:    sw t4, 16(sp)216; CHECK-NEXT:    sw t5, 20(sp)217; CHECK-NEXT:    sw t0, 0(sp)218; CHECK-NEXT:    sw t1, 4(sp)219; CHECK-NEXT:    sw t2, 8(sp)220; CHECK-NEXT:    sw t3, 12(sp)221; CHECK-NEXT:    call callee_args222; CHECK-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload223; CHECK-NEXT:    addi sp, sp, 32224; CHECK-NEXT:    ret225;226; CHECK-LARGE-ZICFILP-LABEL: caller_args:227; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry228; CHECK-LARGE-ZICFILP-NEXT:    lpad 0229; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -32230; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill231; CHECK-LARGE-ZICFILP-NEXT:    lw t0, 32(sp)232; CHECK-LARGE-ZICFILP-NEXT:    lw t1, 36(sp)233; CHECK-LARGE-ZICFILP-NEXT:    lw t3, 40(sp)234; CHECK-LARGE-ZICFILP-NEXT:    lw t4, 44(sp)235; CHECK-LARGE-ZICFILP-NEXT:    lw t2, 48(sp)236; CHECK-LARGE-ZICFILP-NEXT:    lw t5, 52(sp)237; CHECK-LARGE-ZICFILP-NEXT:    sw t2, 16(sp)238; CHECK-LARGE-ZICFILP-NEXT:    sw t5, 20(sp)239; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi8:240; CHECK-LARGE-ZICFILP-NEXT:    auipc t2, %pcrel_hi(.LCPI6_0)241; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi8)(t2)242; CHECK-LARGE-ZICFILP-NEXT:    sw t0, 0(sp)243; CHECK-LARGE-ZICFILP-NEXT:    sw t1, 4(sp)244; CHECK-LARGE-ZICFILP-NEXT:    sw t3, 8(sp)245; CHECK-LARGE-ZICFILP-NEXT:    sw t4, 12(sp)246; CHECK-LARGE-ZICFILP-NEXT:    jalr t2247; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload248; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 32249; CHECK-LARGE-ZICFILP-NEXT:    ret250entry:251  %r = tail call i32 @callee_args(i32 %a, i32 %b, i32 %c, i32 %dd, i32 %e, i32 %ff, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n)252  ret i32 %r253}254 255; Do not tail call optimize if parameters need to be passed indirectly.256declare i32 @callee_indirect_args(fp128 %a)257define void @caller_indirect_args() nounwind {258; CHECK-LABEL: caller_indirect_args:259; CHECK:       # %bb.0: # %entry260; CHECK-NEXT:    addi sp, sp, -32261; CHECK-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill262; CHECK-NEXT:    lui a1, 262128263; CHECK-NEXT:    mv a0, sp264; CHECK-NEXT:    sw zero, 0(sp)265; CHECK-NEXT:    sw zero, 4(sp)266; CHECK-NEXT:    sw zero, 8(sp)267; CHECK-NEXT:    sw a1, 12(sp)268; CHECK-NEXT:    call callee_indirect_args269; CHECK-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload270; CHECK-NEXT:    addi sp, sp, 32271; CHECK-NEXT:    ret272;273; CHECK-LARGE-ZICFILP-LABEL: caller_indirect_args:274; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry275; CHECK-LARGE-ZICFILP-NEXT:    lpad 0276; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -32277; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill278; CHECK-LARGE-ZICFILP-NEXT:    lui a1, 262128279; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi9:280; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI7_0)281; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi9)(a0)282; CHECK-LARGE-ZICFILP-NEXT:    mv a0, sp283; CHECK-LARGE-ZICFILP-NEXT:    sw zero, 0(sp)284; CHECK-LARGE-ZICFILP-NEXT:    sw zero, 4(sp)285; CHECK-LARGE-ZICFILP-NEXT:    sw zero, 8(sp)286; CHECK-LARGE-ZICFILP-NEXT:    sw a1, 12(sp)287; CHECK-LARGE-ZICFILP-NEXT:    jalr t2288; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload289; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 32290; CHECK-LARGE-ZICFILP-NEXT:    ret291entry:292  %call = tail call i32 @callee_indirect_args(fp128 0xL00000000000000003FFF000000000000)293  ret void294}295 296; Perform tail call optimization for external weak symbol.297declare extern_weak void @callee_weak()298define void @caller_weak() nounwind {299; CHECK-LABEL: caller_weak:300; CHECK:       # %bb.0: # %entry301; CHECK-NEXT:    tail callee_weak302;303; CHECK-LARGE-ZICFILP-LABEL: caller_weak:304; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry305; CHECK-LARGE-ZICFILP-NEXT:    lpad 0306; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi10:307; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI8_0)308; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi10)(a0)309; CHECK-LARGE-ZICFILP-NEXT:    jr t2310entry:311  tail call void @callee_weak()312  ret void313}314 315; Exception-handling functions need a special set of instructions to indicate a316; return to the hardware. Tail-calling another function would probably break317; this.318declare void @callee_irq()319define void @caller_irq() nounwind "interrupt"="machine" {320; CHECK-LABEL: caller_irq:321; CHECK:       # %bb.0: # %entry322; CHECK-NEXT:    addi sp, sp, -64323; CHECK-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill324; CHECK-NEXT:    sw t0, 56(sp) # 4-byte Folded Spill325; CHECK-NEXT:    sw t1, 52(sp) # 4-byte Folded Spill326; CHECK-NEXT:    sw t2, 48(sp) # 4-byte Folded Spill327; CHECK-NEXT:    sw a0, 44(sp) # 4-byte Folded Spill328; CHECK-NEXT:    sw a1, 40(sp) # 4-byte Folded Spill329; CHECK-NEXT:    sw a2, 36(sp) # 4-byte Folded Spill330; CHECK-NEXT:    sw a3, 32(sp) # 4-byte Folded Spill331; CHECK-NEXT:    sw a4, 28(sp) # 4-byte Folded Spill332; CHECK-NEXT:    sw a5, 24(sp) # 4-byte Folded Spill333; CHECK-NEXT:    sw a6, 20(sp) # 4-byte Folded Spill334; CHECK-NEXT:    sw a7, 16(sp) # 4-byte Folded Spill335; CHECK-NEXT:    sw t3, 12(sp) # 4-byte Folded Spill336; CHECK-NEXT:    sw t4, 8(sp) # 4-byte Folded Spill337; CHECK-NEXT:    sw t5, 4(sp) # 4-byte Folded Spill338; CHECK-NEXT:    sw t6, 0(sp) # 4-byte Folded Spill339; CHECK-NEXT:    call callee_irq340; CHECK-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload341; CHECK-NEXT:    lw t0, 56(sp) # 4-byte Folded Reload342; CHECK-NEXT:    lw t1, 52(sp) # 4-byte Folded Reload343; CHECK-NEXT:    lw t2, 48(sp) # 4-byte Folded Reload344; CHECK-NEXT:    lw a0, 44(sp) # 4-byte Folded Reload345; CHECK-NEXT:    lw a1, 40(sp) # 4-byte Folded Reload346; CHECK-NEXT:    lw a2, 36(sp) # 4-byte Folded Reload347; CHECK-NEXT:    lw a3, 32(sp) # 4-byte Folded Reload348; CHECK-NEXT:    lw a4, 28(sp) # 4-byte Folded Reload349; CHECK-NEXT:    lw a5, 24(sp) # 4-byte Folded Reload350; CHECK-NEXT:    lw a6, 20(sp) # 4-byte Folded Reload351; CHECK-NEXT:    lw a7, 16(sp) # 4-byte Folded Reload352; CHECK-NEXT:    lw t3, 12(sp) # 4-byte Folded Reload353; CHECK-NEXT:    lw t4, 8(sp) # 4-byte Folded Reload354; CHECK-NEXT:    lw t5, 4(sp) # 4-byte Folded Reload355; CHECK-NEXT:    lw t6, 0(sp) # 4-byte Folded Reload356; CHECK-NEXT:    addi sp, sp, 64357; CHECK-NEXT:    mret358;359; CHECK-LARGE-ZICFILP-LABEL: caller_irq:360; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry361; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -64362; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill363; CHECK-LARGE-ZICFILP-NEXT:    sw t0, 56(sp) # 4-byte Folded Spill364; CHECK-LARGE-ZICFILP-NEXT:    sw t1, 52(sp) # 4-byte Folded Spill365; CHECK-LARGE-ZICFILP-NEXT:    sw t2, 48(sp) # 4-byte Folded Spill366; CHECK-LARGE-ZICFILP-NEXT:    sw a0, 44(sp) # 4-byte Folded Spill367; CHECK-LARGE-ZICFILP-NEXT:    sw a1, 40(sp) # 4-byte Folded Spill368; CHECK-LARGE-ZICFILP-NEXT:    sw a2, 36(sp) # 4-byte Folded Spill369; CHECK-LARGE-ZICFILP-NEXT:    sw a3, 32(sp) # 4-byte Folded Spill370; CHECK-LARGE-ZICFILP-NEXT:    sw a4, 28(sp) # 4-byte Folded Spill371; CHECK-LARGE-ZICFILP-NEXT:    sw a5, 24(sp) # 4-byte Folded Spill372; CHECK-LARGE-ZICFILP-NEXT:    sw a6, 20(sp) # 4-byte Folded Spill373; CHECK-LARGE-ZICFILP-NEXT:    sw a7, 16(sp) # 4-byte Folded Spill374; CHECK-LARGE-ZICFILP-NEXT:    sw t3, 12(sp) # 4-byte Folded Spill375; CHECK-LARGE-ZICFILP-NEXT:    sw t4, 8(sp) # 4-byte Folded Spill376; CHECK-LARGE-ZICFILP-NEXT:    sw t5, 4(sp) # 4-byte Folded Spill377; CHECK-LARGE-ZICFILP-NEXT:    sw t6, 0(sp) # 4-byte Folded Spill378; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi11:379; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI9_0)380; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi11)(a0)381; CHECK-LARGE-ZICFILP-NEXT:    jalr t2382; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload383; CHECK-LARGE-ZICFILP-NEXT:    lw t0, 56(sp) # 4-byte Folded Reload384; CHECK-LARGE-ZICFILP-NEXT:    lw t1, 52(sp) # 4-byte Folded Reload385; CHECK-LARGE-ZICFILP-NEXT:    lw t2, 48(sp) # 4-byte Folded Reload386; CHECK-LARGE-ZICFILP-NEXT:    lw a0, 44(sp) # 4-byte Folded Reload387; CHECK-LARGE-ZICFILP-NEXT:    lw a1, 40(sp) # 4-byte Folded Reload388; CHECK-LARGE-ZICFILP-NEXT:    lw a2, 36(sp) # 4-byte Folded Reload389; CHECK-LARGE-ZICFILP-NEXT:    lw a3, 32(sp) # 4-byte Folded Reload390; CHECK-LARGE-ZICFILP-NEXT:    lw a4, 28(sp) # 4-byte Folded Reload391; CHECK-LARGE-ZICFILP-NEXT:    lw a5, 24(sp) # 4-byte Folded Reload392; CHECK-LARGE-ZICFILP-NEXT:    lw a6, 20(sp) # 4-byte Folded Reload393; CHECK-LARGE-ZICFILP-NEXT:    lw a7, 16(sp) # 4-byte Folded Reload394; CHECK-LARGE-ZICFILP-NEXT:    lw t3, 12(sp) # 4-byte Folded Reload395; CHECK-LARGE-ZICFILP-NEXT:    lw t4, 8(sp) # 4-byte Folded Reload396; CHECK-LARGE-ZICFILP-NEXT:    lw t5, 4(sp) # 4-byte Folded Reload397; CHECK-LARGE-ZICFILP-NEXT:    lw t6, 0(sp) # 4-byte Folded Reload398; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 64399; CHECK-LARGE-ZICFILP-NEXT:    mret400entry:401  tail call void @callee_irq()402  ret void403}404 405; Byval parameters hand the function a pointer directly into the stack area406; we want to reuse during a tail call. Do not tail call optimize functions with407; byval parameters.408declare i32 @callee_byval(ptr byval(ptr) %a)409define i32 @caller_byval() nounwind {410; CHECK-LABEL: caller_byval:411; CHECK:       # %bb.0: # %entry412; CHECK-NEXT:    addi sp, sp, -16413; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill414; CHECK-NEXT:    lw a0, 8(sp)415; CHECK-NEXT:    sw a0, 4(sp)416; CHECK-NEXT:    addi a0, sp, 4417; CHECK-NEXT:    call callee_byval418; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload419; CHECK-NEXT:    addi sp, sp, 16420; CHECK-NEXT:    ret421;422; CHECK-LARGE-ZICFILP-LABEL: caller_byval:423; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry424; CHECK-LARGE-ZICFILP-NEXT:    lpad 0425; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -16426; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill427; CHECK-LARGE-ZICFILP-NEXT:    lw a0, 8(sp)428; CHECK-LARGE-ZICFILP-NEXT:    sw a0, 4(sp)429; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi12:430; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI10_0)431; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi12)(a0)432; CHECK-LARGE-ZICFILP-NEXT:    addi a0, sp, 4433; CHECK-LARGE-ZICFILP-NEXT:    jalr t2434; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload435; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 16436; CHECK-LARGE-ZICFILP-NEXT:    ret437entry:438  %a = alloca ptr439  %r = tail call i32 @callee_byval(ptr byval(ptr) %a)440  ret i32 %r441}442 443; Do not tail call optimize if callee uses structret semantics.444%struct.A = type { i32 }445@a = global %struct.A zeroinitializer446 447declare void @callee_struct(ptr sret(%struct.A) %a)448define void @caller_nostruct() nounwind {449; CHECK-LABEL: caller_nostruct:450; CHECK:       # %bb.0: # %entry451; CHECK-NEXT:    addi sp, sp, -16452; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill453; CHECK-NEXT:    lui a0, %hi(a)454; CHECK-NEXT:    addi a0, a0, %lo(a)455; CHECK-NEXT:    call callee_struct456; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload457; CHECK-NEXT:    addi sp, sp, 16458; CHECK-NEXT:    ret459;460; CHECK-LARGE-ZICFILP-LABEL: caller_nostruct:461; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry462; CHECK-LARGE-ZICFILP-NEXT:    lpad 0463; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -16464; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill465; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi13:466; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI11_0)467; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi14:468; CHECK-LARGE-ZICFILP-NEXT:    auipc a1, %pcrel_hi(.LCPI11_1)469; CHECK-LARGE-ZICFILP-NEXT:    lw a0, %pcrel_lo(.Lpcrel_hi13)(a0)470; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi14)(a1)471; CHECK-LARGE-ZICFILP-NEXT:    jalr t2472; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload473; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 16474; CHECK-LARGE-ZICFILP-NEXT:    ret475entry:476  tail call void @callee_struct(ptr sret(%struct.A) @a)477  ret void478}479 480; Do not tail call optimize if caller uses structret semantics.481declare void @callee_nostruct()482define void @caller_struct(ptr sret(%struct.A) %a) nounwind {483; CHECK-LABEL: caller_struct:484; CHECK:       # %bb.0: # %entry485; CHECK-NEXT:    addi sp, sp, -16486; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill487; CHECK-NEXT:    call callee_nostruct488; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload489; CHECK-NEXT:    addi sp, sp, 16490; CHECK-NEXT:    ret491;492; CHECK-LARGE-ZICFILP-LABEL: caller_struct:493; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry494; CHECK-LARGE-ZICFILP-NEXT:    lpad 0495; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -16496; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill497; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi15:498; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI12_0)499; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi15)(a0)500; CHECK-LARGE-ZICFILP-NEXT:    jalr t2501; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload502; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 16503; CHECK-LARGE-ZICFILP-NEXT:    ret504entry:505  tail call void @callee_nostruct()506  ret void507}508 509; Do not tail call optimize if disabled.510define i32 @disable_tail_calls(i32 %i) nounwind "disable-tail-calls"="true" {511; CHECK-LABEL: disable_tail_calls:512; CHECK:       # %bb.0: # %entry513; CHECK-NEXT:    addi sp, sp, -16514; CHECK-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill515; CHECK-NEXT:    call callee_tail516; CHECK-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload517; CHECK-NEXT:    addi sp, sp, 16518; CHECK-NEXT:    ret519;520; CHECK-LARGE-ZICFILP-LABEL: disable_tail_calls:521; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry522; CHECK-LARGE-ZICFILP-NEXT:    lpad 0523; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, -16524; CHECK-LARGE-ZICFILP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill525; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi16:526; CHECK-LARGE-ZICFILP-NEXT:    auipc a1, %pcrel_hi(.LCPI13_0)527; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi16)(a1)528; CHECK-LARGE-ZICFILP-NEXT:    jalr t2529; CHECK-LARGE-ZICFILP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload530; CHECK-LARGE-ZICFILP-NEXT:    addi sp, sp, 16531; CHECK-LARGE-ZICFILP-NEXT:    ret532entry:533  %rv = tail call i32 @callee_tail(i32 %i)534  ret i32 %rv535}536 537; Duplicate returns to enable tail call optimizations.538declare i32 @test()539declare i32 @test1()540declare i32 @test2()541declare i32 @test3()542define i32 @duplicate_returns(i32 %a, i32 %b) nounwind {543; CHECK-LABEL: duplicate_returns:544; CHECK:       # %bb.0: # %entry545; CHECK-NEXT:    beqz a0, .LBB14_4546; CHECK-NEXT:  # %bb.1: # %if.else547; CHECK-NEXT:    beqz a1, .LBB14_5548; CHECK-NEXT:  # %bb.2: # %if.else4549; CHECK-NEXT:    bge a1, a0, .LBB14_6550; CHECK-NEXT:  # %bb.3: # %if.then6551; CHECK-NEXT:    tail test2552; CHECK-NEXT:  .LBB14_4: # %if.then553; CHECK-NEXT:    tail test554; CHECK-NEXT:  .LBB14_5: # %if.then2555; CHECK-NEXT:    tail test1556; CHECK-NEXT:  .LBB14_6: # %if.else8557; CHECK-NEXT:    tail test3558;559; CHECK-LARGE-ZICFILP-LABEL: duplicate_returns:560; CHECK-LARGE-ZICFILP:       # %bb.0: # %entry561; CHECK-LARGE-ZICFILP-NEXT:    lpad 0562; CHECK-LARGE-ZICFILP-NEXT:    beqz a0, .LBB14_4563; CHECK-LARGE-ZICFILP-NEXT:  # %bb.1: # %if.else564; CHECK-LARGE-ZICFILP-NEXT:    beqz a1, .LBB14_5565; CHECK-LARGE-ZICFILP-NEXT:  # %bb.2: # %if.else4566; CHECK-LARGE-ZICFILP-NEXT:    bge a1, a0, .LBB14_6567; CHECK-LARGE-ZICFILP-NEXT:  # %bb.3: # %if.then6568; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi19:569; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI14_1)570; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi19)(a0)571; CHECK-LARGE-ZICFILP-NEXT:    jr t2572; CHECK-LARGE-ZICFILP-NEXT:  .LBB14_4: # %if.then573; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi17:574; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI14_3)575; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi17)(a0)576; CHECK-LARGE-ZICFILP-NEXT:    jr t2577; CHECK-LARGE-ZICFILP-NEXT:  .LBB14_5: # %if.then2578; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi18:579; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI14_2)580; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi18)(a0)581; CHECK-LARGE-ZICFILP-NEXT:    jr t2582; CHECK-LARGE-ZICFILP-NEXT:  .LBB14_6: # %if.else8583; CHECK-LARGE-ZICFILP-NEXT:  .Lpcrel_hi20:584; CHECK-LARGE-ZICFILP-NEXT:    auipc a0, %pcrel_hi(.LCPI14_0)585; CHECK-LARGE-ZICFILP-NEXT:    lw t2, %pcrel_lo(.Lpcrel_hi20)(a0)586; CHECK-LARGE-ZICFILP-NEXT:    jr t2587entry:588  %cmp = icmp eq i32 %a, 0589  br i1 %cmp, label %if.then, label %if.else590 591if.then:                                          ; preds = %entry592  %call = tail call i32 @test()593  br label %return594 595if.else:                                          ; preds = %entry596  %cmp1 = icmp eq i32 %b, 0597  br i1 %cmp1, label %if.then2, label %if.else4598 599if.then2:                                         ; preds = %if.else600  %call3 = tail call i32 @test1()601  br label %return602 603if.else4:                                         ; preds = %if.else604  %cmp5 = icmp sgt i32 %a, %b605  br i1 %cmp5, label %if.then6, label %if.else8606 607if.then6:                                         ; preds = %if.else4608  %call7 = tail call i32 @test2()609  br label %return610 611if.else8:                                         ; preds = %if.else4612  %call9 = tail call i32 @test3()613  br label %return614 615return:                                           ; preds = %if.else8, %if.then6, %if.then2, %if.then616  %retval = phi i32 [ %call, %if.then ], [ %call3, %if.then2 ], [ %call7, %if.then6 ], [ %call9, %if.else8 ]617  ret i32 %retval618}619 620!llvm.module.flags = !{!0}621!0 = !{i32 1, !"ProfileSummary", !1}622!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}623!2 = !{!"ProfileFormat", !"InstrProf"}624!3 = !{!"TotalCount", i64 10000}625!4 = !{!"MaxCount", i64 10}626!5 = !{!"MaxInternalCount", i64 1}627!6 = !{!"MaxFunctionCount", i64 1000}628!7 = !{!"NumCounts", i64 3}629!8 = !{!"NumFunctions", i64 3}630!9 = !{!"DetailedSummary", !10}631!10 = !{!11, !12, !13}632!11 = !{i32 10000, i64 100, i32 1}633!12 = !{i32 999000, i64 100, i32 1}634!13 = !{i32 999999, i64 1, i32 2}635!14 = !{!"function_entry_count", i64 0}636