1969 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -verify-machineinstrs \3; RUN: | FileCheck -check-prefixes=RV32,ILP32 %s4; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+d -verify-machineinstrs \5; RUN: | FileCheck -check-prefixes=RV32,RV32D-ILP32 %s6; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+d -target-abi ilp32f \7; RUN: -verify-machineinstrs \8; RUN: | FileCheck -check-prefixes=RV32,RV32D-ILP32F %s9; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel -mattr=+d -target-abi ilp32d \10; RUN: -verify-machineinstrs \11; RUN: | FileCheck -check-prefixes=RV32,RV32D-ILP32D %s12; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -verify-machineinstrs \13; RUN: | FileCheck -check-prefixes=RV64,LP64 %s14; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -mattr=+d -target-abi lp64f \15; RUN: -verify-machineinstrs \16; RUN: | FileCheck -check-prefixes=RV64,LP64F %s17; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel -mattr=+d -target-abi lp64d \18; RUN: -verify-machineinstrs \19; RUN: | FileCheck -check-prefixes=RV64,LP64D %s20; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -global-isel \21; RUN: -frame-pointer=all -target-abi ilp32 -verify-machineinstrs \22; RUN: | FileCheck -check-prefixes=RV32-WITHFP %s23; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -global-isel \24; RUN: -frame-pointer=all -target-abi lp64 -verify-machineinstrs \25; RUN: | FileCheck -check-prefixes=RV64-WITHFP %s26 27; The same vararg calling convention is used for ilp32/ilp32f/ilp32d and for28; lp64/lp64f/lp64d. Different CHECK lines are required due to slight29; codegen differences due to the way the f64 load operations are lowered and30; because the PseudoCALL specifies the calling convention.31; The nounwind attribute is omitted for some of the tests, to check that CFI32; directives are correctly generated.33 34declare void @notdead(ptr)35 36; Although frontends are recommended to not generate va_arg due to the lack of37; support for aggregate types, we test simple cases here to ensure they are38; lowered correctly39 40define i32 @va1(ptr %fmt, ...) {41; RV32-LABEL: va1:42; RV32: # %bb.0:43; RV32-NEXT: addi sp, sp, -4844; RV32-NEXT: .cfi_def_cfa_offset 4845; RV32-NEXT: sw a1, 20(sp)46; RV32-NEXT: sw a2, 24(sp)47; RV32-NEXT: sw a3, 28(sp)48; RV32-NEXT: sw a4, 32(sp)49; RV32-NEXT: addi a0, sp, 2050; RV32-NEXT: sw a0, 12(sp)51; RV32-NEXT: lw a0, 12(sp)52; RV32-NEXT: sw a5, 36(sp)53; RV32-NEXT: sw a6, 40(sp)54; RV32-NEXT: sw a7, 44(sp)55; RV32-NEXT: addi a1, a0, 456; RV32-NEXT: sw a1, 12(sp)57; RV32-NEXT: lw a0, 0(a0)58; RV32-NEXT: addi sp, sp, 4859; RV32-NEXT: .cfi_def_cfa_offset 060; RV32-NEXT: ret61;62; RV64-LABEL: va1:63; RV64: # %bb.0:64; RV64-NEXT: addi sp, sp, -8065; RV64-NEXT: .cfi_def_cfa_offset 8066; RV64-NEXT: sd a1, 24(sp)67; RV64-NEXT: sd a2, 32(sp)68; RV64-NEXT: sd a3, 40(sp)69; RV64-NEXT: sd a4, 48(sp)70; RV64-NEXT: addi a0, sp, 871; RV64-NEXT: addi a1, sp, 2472; RV64-NEXT: sd a1, 8(sp)73; RV64-NEXT: lw a0, 4(a0)74; RV64-NEXT: lwu a1, 8(sp)75; RV64-NEXT: sd a5, 56(sp)76; RV64-NEXT: sd a6, 64(sp)77; RV64-NEXT: sd a7, 72(sp)78; RV64-NEXT: slli a0, a0, 3279; RV64-NEXT: or a0, a0, a180; RV64-NEXT: addi a1, a0, 481; RV64-NEXT: srli a2, a1, 3282; RV64-NEXT: sw a1, 8(sp)83; RV64-NEXT: sw a2, 12(sp)84; RV64-NEXT: lw a0, 0(a0)85; RV64-NEXT: addi sp, sp, 8086; RV64-NEXT: .cfi_def_cfa_offset 087; RV64-NEXT: ret88;89; RV32-WITHFP-LABEL: va1:90; RV32-WITHFP: # %bb.0:91; RV32-WITHFP-NEXT: addi sp, sp, -4892; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 4893; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill94; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill95; RV32-WITHFP-NEXT: .cfi_offset ra, -3696; RV32-WITHFP-NEXT: .cfi_offset s0, -4097; RV32-WITHFP-NEXT: addi s0, sp, 1698; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 3299; RV32-WITHFP-NEXT: sw a1, 4(s0)100; RV32-WITHFP-NEXT: sw a2, 8(s0)101; RV32-WITHFP-NEXT: sw a3, 12(s0)102; RV32-WITHFP-NEXT: sw a4, 16(s0)103; RV32-WITHFP-NEXT: addi a0, s0, 4104; RV32-WITHFP-NEXT: sw a0, -12(s0)105; RV32-WITHFP-NEXT: lw a0, -12(s0)106; RV32-WITHFP-NEXT: sw a5, 20(s0)107; RV32-WITHFP-NEXT: sw a6, 24(s0)108; RV32-WITHFP-NEXT: sw a7, 28(s0)109; RV32-WITHFP-NEXT: addi a1, a0, 4110; RV32-WITHFP-NEXT: sw a1, -12(s0)111; RV32-WITHFP-NEXT: lw a0, 0(a0)112; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 48113; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload114; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload115; RV32-WITHFP-NEXT: .cfi_restore ra116; RV32-WITHFP-NEXT: .cfi_restore s0117; RV32-WITHFP-NEXT: addi sp, sp, 48118; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0119; RV32-WITHFP-NEXT: ret120;121; RV64-WITHFP-LABEL: va1:122; RV64-WITHFP: # %bb.0:123; RV64-WITHFP-NEXT: addi sp, sp, -96124; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 96125; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill126; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill127; RV64-WITHFP-NEXT: .cfi_offset ra, -72128; RV64-WITHFP-NEXT: .cfi_offset s0, -80129; RV64-WITHFP-NEXT: addi s0, sp, 32130; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 64131; RV64-WITHFP-NEXT: sd a1, 8(s0)132; RV64-WITHFP-NEXT: sd a2, 16(s0)133; RV64-WITHFP-NEXT: sd a3, 24(s0)134; RV64-WITHFP-NEXT: sd a4, 32(s0)135; RV64-WITHFP-NEXT: addi a0, s0, -24136; RV64-WITHFP-NEXT: addi a1, s0, 8137; RV64-WITHFP-NEXT: sd a1, -24(s0)138; RV64-WITHFP-NEXT: lw a0, 4(a0)139; RV64-WITHFP-NEXT: lwu a1, -24(s0)140; RV64-WITHFP-NEXT: sd a5, 40(s0)141; RV64-WITHFP-NEXT: sd a6, 48(s0)142; RV64-WITHFP-NEXT: sd a7, 56(s0)143; RV64-WITHFP-NEXT: slli a0, a0, 32144; RV64-WITHFP-NEXT: or a0, a0, a1145; RV64-WITHFP-NEXT: addi a1, a0, 4146; RV64-WITHFP-NEXT: srli a2, a1, 32147; RV64-WITHFP-NEXT: sw a1, -24(s0)148; RV64-WITHFP-NEXT: sw a2, -20(s0)149; RV64-WITHFP-NEXT: lw a0, 0(a0)150; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 96151; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload152; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload153; RV64-WITHFP-NEXT: .cfi_restore ra154; RV64-WITHFP-NEXT: .cfi_restore s0155; RV64-WITHFP-NEXT: addi sp, sp, 96156; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0157; RV64-WITHFP-NEXT: ret158 %va = alloca ptr159 call void @llvm.va_start(ptr %va)160 %argp.cur = load ptr, ptr %va, align 4161 %argp.next = getelementptr inbounds i8, ptr %argp.cur, i32 4162 store ptr %argp.next, ptr %va, align 4163 %1 = load i32, ptr %argp.cur, align 4164 call void @llvm.va_end(ptr %va)165 ret i32 %1166}167 168define iXLen @va1_va_arg(ptr %fmt, ...) nounwind {169; RV32-LABEL: va1_va_arg:170; RV32: # %bb.0:171; RV32-NEXT: addi sp, sp, -48172; RV32-NEXT: sw a1, 20(sp)173; RV32-NEXT: sw a2, 24(sp)174; RV32-NEXT: sw a3, 28(sp)175; RV32-NEXT: sw a4, 32(sp)176; RV32-NEXT: sw a5, 36(sp)177; RV32-NEXT: sw a6, 40(sp)178; RV32-NEXT: sw a7, 44(sp)179; RV32-NEXT: addi a0, sp, 20180; RV32-NEXT: sw a0, 12(sp)181; RV32-NEXT: lw a0, 12(sp)182; RV32-NEXT: addi a0, a0, 3183; RV32-NEXT: andi a0, a0, -4184; RV32-NEXT: addi a1, a0, 4185; RV32-NEXT: sw a1, 12(sp)186; RV32-NEXT: lw a0, 0(a0)187; RV32-NEXT: addi sp, sp, 48188; RV32-NEXT: ret189;190; RV64-LABEL: va1_va_arg:191; RV64: # %bb.0:192; RV64-NEXT: addi sp, sp, -80193; RV64-NEXT: sd a1, 24(sp)194; RV64-NEXT: sd a2, 32(sp)195; RV64-NEXT: sd a3, 40(sp)196; RV64-NEXT: sd a4, 48(sp)197; RV64-NEXT: sd a5, 56(sp)198; RV64-NEXT: sd a6, 64(sp)199; RV64-NEXT: sd a7, 72(sp)200; RV64-NEXT: addi a0, sp, 24201; RV64-NEXT: sd a0, 8(sp)202; RV64-NEXT: ld a0, 8(sp)203; RV64-NEXT: addi a0, a0, 7204; RV64-NEXT: andi a0, a0, -8205; RV64-NEXT: addi a1, a0, 8206; RV64-NEXT: sd a1, 8(sp)207; RV64-NEXT: ld a0, 0(a0)208; RV64-NEXT: addi sp, sp, 80209; RV64-NEXT: ret210;211; RV32-WITHFP-LABEL: va1_va_arg:212; RV32-WITHFP: # %bb.0:213; RV32-WITHFP-NEXT: addi sp, sp, -48214; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill215; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill216; RV32-WITHFP-NEXT: addi s0, sp, 16217; RV32-WITHFP-NEXT: sw a1, 4(s0)218; RV32-WITHFP-NEXT: sw a2, 8(s0)219; RV32-WITHFP-NEXT: sw a3, 12(s0)220; RV32-WITHFP-NEXT: sw a4, 16(s0)221; RV32-WITHFP-NEXT: sw a5, 20(s0)222; RV32-WITHFP-NEXT: sw a6, 24(s0)223; RV32-WITHFP-NEXT: sw a7, 28(s0)224; RV32-WITHFP-NEXT: addi a0, s0, 4225; RV32-WITHFP-NEXT: sw a0, -12(s0)226; RV32-WITHFP-NEXT: lw a0, -12(s0)227; RV32-WITHFP-NEXT: addi a0, a0, 3228; RV32-WITHFP-NEXT: andi a0, a0, -4229; RV32-WITHFP-NEXT: addi a1, a0, 4230; RV32-WITHFP-NEXT: sw a1, -12(s0)231; RV32-WITHFP-NEXT: lw a0, 0(a0)232; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload233; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload234; RV32-WITHFP-NEXT: addi sp, sp, 48235; RV32-WITHFP-NEXT: ret236;237; RV64-WITHFP-LABEL: va1_va_arg:238; RV64-WITHFP: # %bb.0:239; RV64-WITHFP-NEXT: addi sp, sp, -96240; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill241; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill242; RV64-WITHFP-NEXT: addi s0, sp, 32243; RV64-WITHFP-NEXT: sd a1, 8(s0)244; RV64-WITHFP-NEXT: sd a2, 16(s0)245; RV64-WITHFP-NEXT: sd a3, 24(s0)246; RV64-WITHFP-NEXT: sd a4, 32(s0)247; RV64-WITHFP-NEXT: sd a5, 40(s0)248; RV64-WITHFP-NEXT: sd a6, 48(s0)249; RV64-WITHFP-NEXT: sd a7, 56(s0)250; RV64-WITHFP-NEXT: addi a0, s0, 8251; RV64-WITHFP-NEXT: sd a0, -24(s0)252; RV64-WITHFP-NEXT: ld a0, -24(s0)253; RV64-WITHFP-NEXT: addi a0, a0, 7254; RV64-WITHFP-NEXT: andi a0, a0, -8255; RV64-WITHFP-NEXT: addi a1, a0, 8256; RV64-WITHFP-NEXT: sd a1, -24(s0)257; RV64-WITHFP-NEXT: ld a0, 0(a0)258; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload259; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload260; RV64-WITHFP-NEXT: addi sp, sp, 96261; RV64-WITHFP-NEXT: ret262 %va = alloca ptr263 call void @llvm.va_start(ptr %va)264 %1 = va_arg ptr %va, iXLen265 call void @llvm.va_end(ptr %va)266 ret iXLen %1267}268 269; Ensure the adjustment when restoring the stack pointer using the frame270; pointer is correct271define iXLen @va1_va_arg_alloca(ptr %fmt, ...) nounwind {272; RV32-LABEL: va1_va_arg_alloca:273; RV32: # %bb.0:274; RV32-NEXT: addi sp, sp, -48275; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill276; RV32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill277; RV32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill278; RV32-NEXT: addi s0, sp, 16279; RV32-NEXT: sw a1, 4(s0)280; RV32-NEXT: sw a2, 8(s0)281; RV32-NEXT: sw a3, 12(s0)282; RV32-NEXT: sw a4, 16(s0)283; RV32-NEXT: sw a5, 20(s0)284; RV32-NEXT: sw a6, 24(s0)285; RV32-NEXT: sw a7, 28(s0)286; RV32-NEXT: addi a0, s0, 4287; RV32-NEXT: sw a0, -16(s0)288; RV32-NEXT: lw a0, -16(s0)289; RV32-NEXT: addi a0, a0, 3290; RV32-NEXT: andi a0, a0, -4291; RV32-NEXT: addi a1, a0, 4292; RV32-NEXT: sw a1, -16(s0)293; RV32-NEXT: lw s1, 0(a0)294; RV32-NEXT: addi a0, s1, 15295; RV32-NEXT: andi a0, a0, -16296; RV32-NEXT: sub a0, sp, a0297; RV32-NEXT: mv sp, a0298; RV32-NEXT: call notdead299; RV32-NEXT: mv a0, s1300; RV32-NEXT: addi sp, s0, -16301; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload302; RV32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload303; RV32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload304; RV32-NEXT: addi sp, sp, 48305; RV32-NEXT: ret306;307; RV64-LABEL: va1_va_arg_alloca:308; RV64: # %bb.0:309; RV64-NEXT: addi sp, sp, -96310; RV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill311; RV64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill312; RV64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill313; RV64-NEXT: addi s0, sp, 32314; RV64-NEXT: sd a1, 8(s0)315; RV64-NEXT: sd a2, 16(s0)316; RV64-NEXT: sd a3, 24(s0)317; RV64-NEXT: sd a4, 32(s0)318; RV64-NEXT: sd a5, 40(s0)319; RV64-NEXT: sd a6, 48(s0)320; RV64-NEXT: sd a7, 56(s0)321; RV64-NEXT: addi a0, s0, 8322; RV64-NEXT: sd a0, -32(s0)323; RV64-NEXT: ld a0, -32(s0)324; RV64-NEXT: addi a0, a0, 7325; RV64-NEXT: andi a0, a0, -8326; RV64-NEXT: addi a1, a0, 8327; RV64-NEXT: sd a1, -32(s0)328; RV64-NEXT: ld s1, 0(a0)329; RV64-NEXT: addi a0, s1, 15330; RV64-NEXT: andi a0, a0, -16331; RV64-NEXT: sub a0, sp, a0332; RV64-NEXT: mv sp, a0333; RV64-NEXT: call notdead334; RV64-NEXT: mv a0, s1335; RV64-NEXT: addi sp, s0, -32336; RV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload337; RV64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload338; RV64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload339; RV64-NEXT: addi sp, sp, 96340; RV64-NEXT: ret341;342; RV32-WITHFP-LABEL: va1_va_arg_alloca:343; RV32-WITHFP: # %bb.0:344; RV32-WITHFP-NEXT: addi sp, sp, -48345; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill346; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill347; RV32-WITHFP-NEXT: sw s1, 4(sp) # 4-byte Folded Spill348; RV32-WITHFP-NEXT: addi s0, sp, 16349; RV32-WITHFP-NEXT: sw a1, 4(s0)350; RV32-WITHFP-NEXT: sw a2, 8(s0)351; RV32-WITHFP-NEXT: sw a3, 12(s0)352; RV32-WITHFP-NEXT: sw a4, 16(s0)353; RV32-WITHFP-NEXT: sw a5, 20(s0)354; RV32-WITHFP-NEXT: sw a6, 24(s0)355; RV32-WITHFP-NEXT: sw a7, 28(s0)356; RV32-WITHFP-NEXT: addi a0, s0, 4357; RV32-WITHFP-NEXT: sw a0, -16(s0)358; RV32-WITHFP-NEXT: lw a0, -16(s0)359; RV32-WITHFP-NEXT: addi a0, a0, 3360; RV32-WITHFP-NEXT: andi a0, a0, -4361; RV32-WITHFP-NEXT: addi a1, a0, 4362; RV32-WITHFP-NEXT: sw a1, -16(s0)363; RV32-WITHFP-NEXT: lw s1, 0(a0)364; RV32-WITHFP-NEXT: addi a0, s1, 15365; RV32-WITHFP-NEXT: andi a0, a0, -16366; RV32-WITHFP-NEXT: sub a0, sp, a0367; RV32-WITHFP-NEXT: mv sp, a0368; RV32-WITHFP-NEXT: call notdead369; RV32-WITHFP-NEXT: mv a0, s1370; RV32-WITHFP-NEXT: addi sp, s0, -16371; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload372; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload373; RV32-WITHFP-NEXT: lw s1, 4(sp) # 4-byte Folded Reload374; RV32-WITHFP-NEXT: addi sp, sp, 48375; RV32-WITHFP-NEXT: ret376;377; RV64-WITHFP-LABEL: va1_va_arg_alloca:378; RV64-WITHFP: # %bb.0:379; RV64-WITHFP-NEXT: addi sp, sp, -96380; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill381; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill382; RV64-WITHFP-NEXT: sd s1, 8(sp) # 8-byte Folded Spill383; RV64-WITHFP-NEXT: addi s0, sp, 32384; RV64-WITHFP-NEXT: sd a1, 8(s0)385; RV64-WITHFP-NEXT: sd a2, 16(s0)386; RV64-WITHFP-NEXT: sd a3, 24(s0)387; RV64-WITHFP-NEXT: sd a4, 32(s0)388; RV64-WITHFP-NEXT: sd a5, 40(s0)389; RV64-WITHFP-NEXT: sd a6, 48(s0)390; RV64-WITHFP-NEXT: sd a7, 56(s0)391; RV64-WITHFP-NEXT: addi a0, s0, 8392; RV64-WITHFP-NEXT: sd a0, -32(s0)393; RV64-WITHFP-NEXT: ld a0, -32(s0)394; RV64-WITHFP-NEXT: addi a0, a0, 7395; RV64-WITHFP-NEXT: andi a0, a0, -8396; RV64-WITHFP-NEXT: addi a1, a0, 8397; RV64-WITHFP-NEXT: sd a1, -32(s0)398; RV64-WITHFP-NEXT: ld s1, 0(a0)399; RV64-WITHFP-NEXT: addi a0, s1, 15400; RV64-WITHFP-NEXT: andi a0, a0, -16401; RV64-WITHFP-NEXT: sub a0, sp, a0402; RV64-WITHFP-NEXT: mv sp, a0403; RV64-WITHFP-NEXT: call notdead404; RV64-WITHFP-NEXT: mv a0, s1405; RV64-WITHFP-NEXT: addi sp, s0, -32406; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload407; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload408; RV64-WITHFP-NEXT: ld s1, 8(sp) # 8-byte Folded Reload409; RV64-WITHFP-NEXT: addi sp, sp, 96410; RV64-WITHFP-NEXT: ret411 %va = alloca ptr412 call void @llvm.va_start(ptr %va)413 %1 = va_arg ptr %va, iXLen414 %2 = alloca i8, iXLen %1415 call void @notdead(ptr %2)416 call void @llvm.va_end(ptr %va)417 ret iXLen %1418}419 420define void @va1_caller() nounwind {421; RV32-LABEL: va1_caller:422; RV32: # %bb.0:423; RV32-NEXT: addi sp, sp, -16424; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill425; RV32-NEXT: lui a3, 261888426; RV32-NEXT: li a4, 2427; RV32-NEXT: li a2, 0428; RV32-NEXT: call va1429; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload430; RV32-NEXT: addi sp, sp, 16431; RV32-NEXT: ret432;433; LP64-LABEL: va1_caller:434; LP64: # %bb.0:435; LP64-NEXT: addi sp, sp, -16436; LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill437; LP64-NEXT: li a1, 1023438; LP64-NEXT: slli a1, a1, 52439; LP64-NEXT: li a2, 2440; LP64-NEXT: call va1441; LP64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload442; LP64-NEXT: addi sp, sp, 16443; LP64-NEXT: ret444;445; LP64F-LABEL: va1_caller:446; LP64F: # %bb.0:447; LP64F-NEXT: addi sp, sp, -16448; LP64F-NEXT: sd ra, 8(sp) # 8-byte Folded Spill449; LP64F-NEXT: li a0, 1023450; LP64F-NEXT: slli a0, a0, 52451; LP64F-NEXT: fmv.d.x fa5, a0452; LP64F-NEXT: li a2, 2453; LP64F-NEXT: fmv.x.d a1, fa5454; LP64F-NEXT: call va1455; LP64F-NEXT: ld ra, 8(sp) # 8-byte Folded Reload456; LP64F-NEXT: addi sp, sp, 16457; LP64F-NEXT: ret458;459; LP64D-LABEL: va1_caller:460; LP64D: # %bb.0:461; LP64D-NEXT: addi sp, sp, -16462; LP64D-NEXT: sd ra, 8(sp) # 8-byte Folded Spill463; LP64D-NEXT: li a0, 1023464; LP64D-NEXT: slli a0, a0, 52465; LP64D-NEXT: fmv.d.x fa5, a0466; LP64D-NEXT: li a2, 2467; LP64D-NEXT: fmv.x.d a1, fa5468; LP64D-NEXT: call va1469; LP64D-NEXT: ld ra, 8(sp) # 8-byte Folded Reload470; LP64D-NEXT: addi sp, sp, 16471; LP64D-NEXT: ret472;473; RV32-WITHFP-LABEL: va1_caller:474; RV32-WITHFP: # %bb.0:475; RV32-WITHFP-NEXT: addi sp, sp, -16476; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill477; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill478; RV32-WITHFP-NEXT: addi s0, sp, 16479; RV32-WITHFP-NEXT: lui a3, 261888480; RV32-WITHFP-NEXT: li a4, 2481; RV32-WITHFP-NEXT: li a2, 0482; RV32-WITHFP-NEXT: call va1483; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload484; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload485; RV32-WITHFP-NEXT: addi sp, sp, 16486; RV32-WITHFP-NEXT: ret487;488; RV64-WITHFP-LABEL: va1_caller:489; RV64-WITHFP: # %bb.0:490; RV64-WITHFP-NEXT: addi sp, sp, -16491; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill492; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill493; RV64-WITHFP-NEXT: addi s0, sp, 16494; RV64-WITHFP-NEXT: li a1, 1023495; RV64-WITHFP-NEXT: slli a1, a1, 52496; RV64-WITHFP-NEXT: li a2, 2497; RV64-WITHFP-NEXT: call va1498; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload499; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload500; RV64-WITHFP-NEXT: addi sp, sp, 16501; RV64-WITHFP-NEXT: ret502 %1 = call i32 (ptr, ...) @va1(ptr poison, double 1.0, i32 2)503 ret void504}505 506; Ensure that 2x xlen size+alignment varargs are accessed via an "aligned"507; register pair (where the first register is even-numbered).508 509define i64 @va2(ptr %fmt, ...) nounwind {510; ILP32-LABEL: va2:511; ILP32: # %bb.0:512; ILP32-NEXT: addi sp, sp, -48513; ILP32-NEXT: sw a1, 20(sp)514; ILP32-NEXT: sw a2, 24(sp)515; ILP32-NEXT: sw a3, 28(sp)516; ILP32-NEXT: sw a4, 32(sp)517; ILP32-NEXT: addi a0, sp, 20518; ILP32-NEXT: sw a0, 12(sp)519; ILP32-NEXT: lw a0, 12(sp)520; ILP32-NEXT: sw a5, 36(sp)521; ILP32-NEXT: sw a6, 40(sp)522; ILP32-NEXT: sw a7, 44(sp)523; ILP32-NEXT: addi a1, a0, 7524; ILP32-NEXT: addi a0, a0, 15525; ILP32-NEXT: andi a1, a1, -8526; ILP32-NEXT: sw a0, 12(sp)527; ILP32-NEXT: lw a0, 0(a1)528; ILP32-NEXT: lw a1, 4(a1)529; ILP32-NEXT: addi sp, sp, 48530; ILP32-NEXT: ret531;532; RV32D-ILP32-LABEL: va2:533; RV32D-ILP32: # %bb.0:534; RV32D-ILP32-NEXT: addi sp, sp, -48535; RV32D-ILP32-NEXT: sw a1, 20(sp)536; RV32D-ILP32-NEXT: sw a2, 24(sp)537; RV32D-ILP32-NEXT: sw a3, 28(sp)538; RV32D-ILP32-NEXT: sw a4, 32(sp)539; RV32D-ILP32-NEXT: addi a0, sp, 20540; RV32D-ILP32-NEXT: sw a0, 12(sp)541; RV32D-ILP32-NEXT: lw a0, 12(sp)542; RV32D-ILP32-NEXT: sw a5, 36(sp)543; RV32D-ILP32-NEXT: sw a6, 40(sp)544; RV32D-ILP32-NEXT: sw a7, 44(sp)545; RV32D-ILP32-NEXT: addi a1, a0, 7546; RV32D-ILP32-NEXT: andi a1, a1, -8547; RV32D-ILP32-NEXT: fld fa5, 0(a1)548; RV32D-ILP32-NEXT: addi a0, a0, 15549; RV32D-ILP32-NEXT: sw a0, 12(sp)550; RV32D-ILP32-NEXT: fsd fa5, 0(sp)551; RV32D-ILP32-NEXT: lw a0, 0(sp)552; RV32D-ILP32-NEXT: lw a1, 4(sp)553; RV32D-ILP32-NEXT: addi sp, sp, 48554; RV32D-ILP32-NEXT: ret555;556; RV32D-ILP32F-LABEL: va2:557; RV32D-ILP32F: # %bb.0:558; RV32D-ILP32F-NEXT: addi sp, sp, -48559; RV32D-ILP32F-NEXT: sw a1, 20(sp)560; RV32D-ILP32F-NEXT: sw a2, 24(sp)561; RV32D-ILP32F-NEXT: sw a3, 28(sp)562; RV32D-ILP32F-NEXT: sw a4, 32(sp)563; RV32D-ILP32F-NEXT: addi a0, sp, 20564; RV32D-ILP32F-NEXT: sw a0, 12(sp)565; RV32D-ILP32F-NEXT: lw a0, 12(sp)566; RV32D-ILP32F-NEXT: sw a5, 36(sp)567; RV32D-ILP32F-NEXT: sw a6, 40(sp)568; RV32D-ILP32F-NEXT: sw a7, 44(sp)569; RV32D-ILP32F-NEXT: addi a1, a0, 7570; RV32D-ILP32F-NEXT: andi a1, a1, -8571; RV32D-ILP32F-NEXT: fld fa5, 0(a1)572; RV32D-ILP32F-NEXT: addi a0, a0, 15573; RV32D-ILP32F-NEXT: sw a0, 12(sp)574; RV32D-ILP32F-NEXT: fsd fa5, 0(sp)575; RV32D-ILP32F-NEXT: lw a0, 0(sp)576; RV32D-ILP32F-NEXT: lw a1, 4(sp)577; RV32D-ILP32F-NEXT: addi sp, sp, 48578; RV32D-ILP32F-NEXT: ret579;580; RV32D-ILP32D-LABEL: va2:581; RV32D-ILP32D: # %bb.0:582; RV32D-ILP32D-NEXT: addi sp, sp, -48583; RV32D-ILP32D-NEXT: sw a1, 20(sp)584; RV32D-ILP32D-NEXT: sw a2, 24(sp)585; RV32D-ILP32D-NEXT: sw a3, 28(sp)586; RV32D-ILP32D-NEXT: sw a4, 32(sp)587; RV32D-ILP32D-NEXT: addi a0, sp, 20588; RV32D-ILP32D-NEXT: sw a0, 12(sp)589; RV32D-ILP32D-NEXT: lw a0, 12(sp)590; RV32D-ILP32D-NEXT: sw a5, 36(sp)591; RV32D-ILP32D-NEXT: sw a6, 40(sp)592; RV32D-ILP32D-NEXT: sw a7, 44(sp)593; RV32D-ILP32D-NEXT: addi a1, a0, 7594; RV32D-ILP32D-NEXT: andi a1, a1, -8595; RV32D-ILP32D-NEXT: fld fa5, 0(a1)596; RV32D-ILP32D-NEXT: addi a0, a0, 15597; RV32D-ILP32D-NEXT: sw a0, 12(sp)598; RV32D-ILP32D-NEXT: fsd fa5, 0(sp)599; RV32D-ILP32D-NEXT: lw a0, 0(sp)600; RV32D-ILP32D-NEXT: lw a1, 4(sp)601; RV32D-ILP32D-NEXT: addi sp, sp, 48602; RV32D-ILP32D-NEXT: ret603;604; RV64-LABEL: va2:605; RV64: # %bb.0:606; RV64-NEXT: addi sp, sp, -80607; RV64-NEXT: sd a1, 24(sp)608; RV64-NEXT: sd a2, 32(sp)609; RV64-NEXT: sd a3, 40(sp)610; RV64-NEXT: sd a4, 48(sp)611; RV64-NEXT: addi a0, sp, 24612; RV64-NEXT: sd a0, 8(sp)613; RV64-NEXT: ld a0, 8(sp)614; RV64-NEXT: sd a5, 56(sp)615; RV64-NEXT: sd a6, 64(sp)616; RV64-NEXT: sd a7, 72(sp)617; RV64-NEXT: addi a1, a0, 7618; RV64-NEXT: addi a0, a0, 15619; RV64-NEXT: andi a1, a1, -8620; RV64-NEXT: sd a0, 8(sp)621; RV64-NEXT: ld a0, 0(a1)622; RV64-NEXT: addi sp, sp, 80623; RV64-NEXT: ret624;625; RV32-WITHFP-LABEL: va2:626; RV32-WITHFP: # %bb.0:627; RV32-WITHFP-NEXT: addi sp, sp, -48628; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill629; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill630; RV32-WITHFP-NEXT: addi s0, sp, 16631; RV32-WITHFP-NEXT: sw a1, 4(s0)632; RV32-WITHFP-NEXT: sw a2, 8(s0)633; RV32-WITHFP-NEXT: sw a3, 12(s0)634; RV32-WITHFP-NEXT: sw a4, 16(s0)635; RV32-WITHFP-NEXT: addi a0, s0, 4636; RV32-WITHFP-NEXT: sw a0, -12(s0)637; RV32-WITHFP-NEXT: lw a0, -12(s0)638; RV32-WITHFP-NEXT: sw a5, 20(s0)639; RV32-WITHFP-NEXT: sw a6, 24(s0)640; RV32-WITHFP-NEXT: sw a7, 28(s0)641; RV32-WITHFP-NEXT: addi a1, a0, 7642; RV32-WITHFP-NEXT: addi a0, a0, 15643; RV32-WITHFP-NEXT: andi a1, a1, -8644; RV32-WITHFP-NEXT: sw a0, -12(s0)645; RV32-WITHFP-NEXT: lw a0, 0(a1)646; RV32-WITHFP-NEXT: lw a1, 4(a1)647; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload648; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload649; RV32-WITHFP-NEXT: addi sp, sp, 48650; RV32-WITHFP-NEXT: ret651;652; RV64-WITHFP-LABEL: va2:653; RV64-WITHFP: # %bb.0:654; RV64-WITHFP-NEXT: addi sp, sp, -96655; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill656; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill657; RV64-WITHFP-NEXT: addi s0, sp, 32658; RV64-WITHFP-NEXT: sd a1, 8(s0)659; RV64-WITHFP-NEXT: sd a2, 16(s0)660; RV64-WITHFP-NEXT: sd a3, 24(s0)661; RV64-WITHFP-NEXT: sd a4, 32(s0)662; RV64-WITHFP-NEXT: addi a0, s0, 8663; RV64-WITHFP-NEXT: sd a0, -24(s0)664; RV64-WITHFP-NEXT: ld a0, -24(s0)665; RV64-WITHFP-NEXT: sd a5, 40(s0)666; RV64-WITHFP-NEXT: sd a6, 48(s0)667; RV64-WITHFP-NEXT: sd a7, 56(s0)668; RV64-WITHFP-NEXT: addi a1, a0, 7669; RV64-WITHFP-NEXT: addi a0, a0, 15670; RV64-WITHFP-NEXT: andi a1, a1, -8671; RV64-WITHFP-NEXT: sd a0, -24(s0)672; RV64-WITHFP-NEXT: ld a0, 0(a1)673; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload674; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload675; RV64-WITHFP-NEXT: addi sp, sp, 96676; RV64-WITHFP-NEXT: ret677 %va = alloca ptr678 call void @llvm.va_start(ptr %va)679 %argp.cur = load ptr, ptr %va680 %ptrint = ptrtoint ptr %argp.cur to iXLen681 %1 = add iXLen %ptrint, 7682 %2 = and iXLen %1, -8683 %argp.cur.aligned = inttoptr iXLen %1 to ptr684 %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8685 store ptr %argp.next, ptr %va686 %3 = inttoptr iXLen %2 to ptr687 %4 = load double, ptr %3, align 8688 %5 = bitcast double %4 to i64689 call void @llvm.va_end(ptr %va)690 ret i64 %5691}692 693; This test is slightly different than the SelectionDAG counterpart because694; narrowScalar and widenScalar for G_VAARG on types other than sXLen695; are not implemented yet.696define iXLen @va2_va_arg(ptr %fmt, ...) nounwind {697; RV32-LABEL: va2_va_arg:698; RV32: # %bb.0:699; RV32-NEXT: addi sp, sp, -48700; RV32-NEXT: sw a1, 20(sp)701; RV32-NEXT: sw a2, 24(sp)702; RV32-NEXT: sw a3, 28(sp)703; RV32-NEXT: sw a4, 32(sp)704; RV32-NEXT: sw a5, 36(sp)705; RV32-NEXT: sw a6, 40(sp)706; RV32-NEXT: sw a7, 44(sp)707; RV32-NEXT: addi a0, sp, 20708; RV32-NEXT: sw a0, 12(sp)709; RV32-NEXT: lw a0, 12(sp)710; RV32-NEXT: addi a0, a0, 3711; RV32-NEXT: andi a0, a0, -4712; RV32-NEXT: addi a1, a0, 4713; RV32-NEXT: sw a1, 12(sp)714; RV32-NEXT: lw a0, 0(a0)715; RV32-NEXT: addi sp, sp, 48716; RV32-NEXT: ret717;718; RV64-LABEL: va2_va_arg:719; RV64: # %bb.0:720; RV64-NEXT: addi sp, sp, -80721; RV64-NEXT: sd a1, 24(sp)722; RV64-NEXT: sd a2, 32(sp)723; RV64-NEXT: sd a3, 40(sp)724; RV64-NEXT: sd a4, 48(sp)725; RV64-NEXT: sd a5, 56(sp)726; RV64-NEXT: sd a6, 64(sp)727; RV64-NEXT: sd a7, 72(sp)728; RV64-NEXT: addi a0, sp, 24729; RV64-NEXT: sd a0, 8(sp)730; RV64-NEXT: ld a0, 8(sp)731; RV64-NEXT: addi a0, a0, 7732; RV64-NEXT: andi a0, a0, -8733; RV64-NEXT: addi a1, a0, 8734; RV64-NEXT: sd a1, 8(sp)735; RV64-NEXT: ld a0, 0(a0)736; RV64-NEXT: addi sp, sp, 80737; RV64-NEXT: ret738;739; RV32-WITHFP-LABEL: va2_va_arg:740; RV32-WITHFP: # %bb.0:741; RV32-WITHFP-NEXT: addi sp, sp, -48742; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill743; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill744; RV32-WITHFP-NEXT: addi s0, sp, 16745; RV32-WITHFP-NEXT: sw a1, 4(s0)746; RV32-WITHFP-NEXT: sw a2, 8(s0)747; RV32-WITHFP-NEXT: sw a3, 12(s0)748; RV32-WITHFP-NEXT: sw a4, 16(s0)749; RV32-WITHFP-NEXT: sw a5, 20(s0)750; RV32-WITHFP-NEXT: sw a6, 24(s0)751; RV32-WITHFP-NEXT: sw a7, 28(s0)752; RV32-WITHFP-NEXT: addi a0, s0, 4753; RV32-WITHFP-NEXT: sw a0, -12(s0)754; RV32-WITHFP-NEXT: lw a0, -12(s0)755; RV32-WITHFP-NEXT: addi a0, a0, 3756; RV32-WITHFP-NEXT: andi a0, a0, -4757; RV32-WITHFP-NEXT: addi a1, a0, 4758; RV32-WITHFP-NEXT: sw a1, -12(s0)759; RV32-WITHFP-NEXT: lw a0, 0(a0)760; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload761; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload762; RV32-WITHFP-NEXT: addi sp, sp, 48763; RV32-WITHFP-NEXT: ret764;765; RV64-WITHFP-LABEL: va2_va_arg:766; RV64-WITHFP: # %bb.0:767; RV64-WITHFP-NEXT: addi sp, sp, -96768; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill769; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill770; RV64-WITHFP-NEXT: addi s0, sp, 32771; RV64-WITHFP-NEXT: sd a1, 8(s0)772; RV64-WITHFP-NEXT: sd a2, 16(s0)773; RV64-WITHFP-NEXT: sd a3, 24(s0)774; RV64-WITHFP-NEXT: sd a4, 32(s0)775; RV64-WITHFP-NEXT: sd a5, 40(s0)776; RV64-WITHFP-NEXT: sd a6, 48(s0)777; RV64-WITHFP-NEXT: sd a7, 56(s0)778; RV64-WITHFP-NEXT: addi a0, s0, 8779; RV64-WITHFP-NEXT: sd a0, -24(s0)780; RV64-WITHFP-NEXT: ld a0, -24(s0)781; RV64-WITHFP-NEXT: addi a0, a0, 7782; RV64-WITHFP-NEXT: andi a0, a0, -8783; RV64-WITHFP-NEXT: addi a1, a0, 8784; RV64-WITHFP-NEXT: sd a1, -24(s0)785; RV64-WITHFP-NEXT: ld a0, 0(a0)786; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload787; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload788; RV64-WITHFP-NEXT: addi sp, sp, 96789; RV64-WITHFP-NEXT: ret790 %va = alloca ptr791 call void @llvm.va_start(ptr %va)792 %1 = va_arg ptr %va, iXLen793 call void @llvm.va_end(ptr %va)794 ret iXLen %1795}796 797define void @va2_caller() nounwind {798; RV32-LABEL: va2_caller:799; RV32: # %bb.0:800; RV32-NEXT: addi sp, sp, -16801; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill802; RV32-NEXT: li a1, 1803; RV32-NEXT: call va2804; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload805; RV32-NEXT: addi sp, sp, 16806; RV32-NEXT: ret807;808; RV64-LABEL: va2_caller:809; RV64: # %bb.0:810; RV64-NEXT: addi sp, sp, -16811; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill812; RV64-NEXT: li a1, 1813; RV64-NEXT: call va2814; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload815; RV64-NEXT: addi sp, sp, 16816; RV64-NEXT: ret817;818; RV32-WITHFP-LABEL: va2_caller:819; RV32-WITHFP: # %bb.0:820; RV32-WITHFP-NEXT: addi sp, sp, -16821; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill822; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill823; RV32-WITHFP-NEXT: addi s0, sp, 16824; RV32-WITHFP-NEXT: li a1, 1825; RV32-WITHFP-NEXT: call va2826; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload827; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload828; RV32-WITHFP-NEXT: addi sp, sp, 16829; RV32-WITHFP-NEXT: ret830;831; RV64-WITHFP-LABEL: va2_caller:832; RV64-WITHFP: # %bb.0:833; RV64-WITHFP-NEXT: addi sp, sp, -16834; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill835; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill836; RV64-WITHFP-NEXT: addi s0, sp, 16837; RV64-WITHFP-NEXT: li a1, 1838; RV64-WITHFP-NEXT: call va2839; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload840; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload841; RV64-WITHFP-NEXT: addi sp, sp, 16842; RV64-WITHFP-NEXT: ret843 %1 = call i64 (ptr, ...) @va2(ptr poison, i32 1)844 ret void845}846 847; On RV32, Ensure a named 2*xlen argument is passed in a1 and a2, while the848; vararg double is passed in a4 and a5 (rather than a3 and a4)849 850define i64 @va3(i32 %a, i64 %b, ...) nounwind {851; ILP32-LABEL: va3:852; ILP32: # %bb.0:853; ILP32-NEXT: addi sp, sp, -32854; ILP32-NEXT: addi a0, sp, 12855; ILP32-NEXT: sw a0, 4(sp)856; ILP32-NEXT: lw a0, 4(sp)857; ILP32-NEXT: sw a3, 12(sp)858; ILP32-NEXT: sw a4, 16(sp)859; ILP32-NEXT: sw a5, 20(sp)860; ILP32-NEXT: sw a6, 24(sp)861; ILP32-NEXT: sw a7, 28(sp)862; ILP32-NEXT: addi a3, a0, 7863; ILP32-NEXT: addi a0, a0, 15864; ILP32-NEXT: andi a3, a3, -8865; ILP32-NEXT: sw a0, 4(sp)866; ILP32-NEXT: lw a4, 0(a3)867; ILP32-NEXT: lw a3, 4(a3)868; ILP32-NEXT: add a0, a1, a4869; ILP32-NEXT: sltu a1, a0, a4870; ILP32-NEXT: add a2, a2, a3871; ILP32-NEXT: add a1, a2, a1872; ILP32-NEXT: addi sp, sp, 32873; ILP32-NEXT: ret874;875; RV32D-ILP32-LABEL: va3:876; RV32D-ILP32: # %bb.0:877; RV32D-ILP32-NEXT: addi sp, sp, -48878; RV32D-ILP32-NEXT: addi a0, sp, 28879; RV32D-ILP32-NEXT: sw a0, 20(sp)880; RV32D-ILP32-NEXT: lw a0, 20(sp)881; RV32D-ILP32-NEXT: sw a3, 28(sp)882; RV32D-ILP32-NEXT: sw a4, 32(sp)883; RV32D-ILP32-NEXT: sw a5, 36(sp)884; RV32D-ILP32-NEXT: sw a6, 40(sp)885; RV32D-ILP32-NEXT: sw a7, 44(sp)886; RV32D-ILP32-NEXT: addi a3, a0, 7887; RV32D-ILP32-NEXT: andi a3, a3, -8888; RV32D-ILP32-NEXT: fld fa5, 0(a3)889; RV32D-ILP32-NEXT: addi a0, a0, 15890; RV32D-ILP32-NEXT: sw a0, 20(sp)891; RV32D-ILP32-NEXT: fsd fa5, 8(sp)892; RV32D-ILP32-NEXT: lw a3, 8(sp)893; RV32D-ILP32-NEXT: lw a4, 12(sp)894; RV32D-ILP32-NEXT: add a0, a1, a3895; RV32D-ILP32-NEXT: sltu a1, a0, a3896; RV32D-ILP32-NEXT: add a2, a2, a4897; RV32D-ILP32-NEXT: add a1, a2, a1898; RV32D-ILP32-NEXT: addi sp, sp, 48899; RV32D-ILP32-NEXT: ret900;901; RV32D-ILP32F-LABEL: va3:902; RV32D-ILP32F: # %bb.0:903; RV32D-ILP32F-NEXT: addi sp, sp, -48904; RV32D-ILP32F-NEXT: addi a0, sp, 28905; RV32D-ILP32F-NEXT: sw a0, 20(sp)906; RV32D-ILP32F-NEXT: lw a0, 20(sp)907; RV32D-ILP32F-NEXT: sw a3, 28(sp)908; RV32D-ILP32F-NEXT: sw a4, 32(sp)909; RV32D-ILP32F-NEXT: sw a5, 36(sp)910; RV32D-ILP32F-NEXT: sw a6, 40(sp)911; RV32D-ILP32F-NEXT: sw a7, 44(sp)912; RV32D-ILP32F-NEXT: addi a3, a0, 7913; RV32D-ILP32F-NEXT: andi a3, a3, -8914; RV32D-ILP32F-NEXT: fld fa5, 0(a3)915; RV32D-ILP32F-NEXT: addi a0, a0, 15916; RV32D-ILP32F-NEXT: sw a0, 20(sp)917; RV32D-ILP32F-NEXT: fsd fa5, 8(sp)918; RV32D-ILP32F-NEXT: lw a3, 8(sp)919; RV32D-ILP32F-NEXT: lw a4, 12(sp)920; RV32D-ILP32F-NEXT: add a0, a1, a3921; RV32D-ILP32F-NEXT: sltu a1, a0, a3922; RV32D-ILP32F-NEXT: add a2, a2, a4923; RV32D-ILP32F-NEXT: add a1, a2, a1924; RV32D-ILP32F-NEXT: addi sp, sp, 48925; RV32D-ILP32F-NEXT: ret926;927; RV32D-ILP32D-LABEL: va3:928; RV32D-ILP32D: # %bb.0:929; RV32D-ILP32D-NEXT: addi sp, sp, -48930; RV32D-ILP32D-NEXT: addi a0, sp, 28931; RV32D-ILP32D-NEXT: sw a0, 20(sp)932; RV32D-ILP32D-NEXT: lw a0, 20(sp)933; RV32D-ILP32D-NEXT: sw a3, 28(sp)934; RV32D-ILP32D-NEXT: sw a4, 32(sp)935; RV32D-ILP32D-NEXT: sw a5, 36(sp)936; RV32D-ILP32D-NEXT: sw a6, 40(sp)937; RV32D-ILP32D-NEXT: sw a7, 44(sp)938; RV32D-ILP32D-NEXT: addi a3, a0, 7939; RV32D-ILP32D-NEXT: andi a3, a3, -8940; RV32D-ILP32D-NEXT: fld fa5, 0(a3)941; RV32D-ILP32D-NEXT: addi a0, a0, 15942; RV32D-ILP32D-NEXT: sw a0, 20(sp)943; RV32D-ILP32D-NEXT: fsd fa5, 8(sp)944; RV32D-ILP32D-NEXT: lw a3, 8(sp)945; RV32D-ILP32D-NEXT: lw a4, 12(sp)946; RV32D-ILP32D-NEXT: add a0, a1, a3947; RV32D-ILP32D-NEXT: sltu a1, a0, a3948; RV32D-ILP32D-NEXT: add a2, a2, a4949; RV32D-ILP32D-NEXT: add a1, a2, a1950; RV32D-ILP32D-NEXT: addi sp, sp, 48951; RV32D-ILP32D-NEXT: ret952;953; RV64-LABEL: va3:954; RV64: # %bb.0:955; RV64-NEXT: addi sp, sp, -64956; RV64-NEXT: addi a0, sp, 16957; RV64-NEXT: sd a0, 8(sp)958; RV64-NEXT: ld a0, 8(sp)959; RV64-NEXT: sd a2, 16(sp)960; RV64-NEXT: sd a3, 24(sp)961; RV64-NEXT: sd a4, 32(sp)962; RV64-NEXT: sd a5, 40(sp)963; RV64-NEXT: sd a6, 48(sp)964; RV64-NEXT: sd a7, 56(sp)965; RV64-NEXT: addi a2, a0, 7966; RV64-NEXT: addi a0, a0, 15967; RV64-NEXT: andi a2, a2, -8968; RV64-NEXT: sd a0, 8(sp)969; RV64-NEXT: ld a0, 0(a2)970; RV64-NEXT: add a0, a1, a0971; RV64-NEXT: addi sp, sp, 64972; RV64-NEXT: ret973;974; RV32-WITHFP-LABEL: va3:975; RV32-WITHFP: # %bb.0:976; RV32-WITHFP-NEXT: addi sp, sp, -48977; RV32-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill978; RV32-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill979; RV32-WITHFP-NEXT: addi s0, sp, 24980; RV32-WITHFP-NEXT: addi a0, s0, 4981; RV32-WITHFP-NEXT: sw a0, -12(s0)982; RV32-WITHFP-NEXT: lw a0, -12(s0)983; RV32-WITHFP-NEXT: sw a3, 4(s0)984; RV32-WITHFP-NEXT: sw a4, 8(s0)985; RV32-WITHFP-NEXT: sw a5, 12(s0)986; RV32-WITHFP-NEXT: sw a6, 16(s0)987; RV32-WITHFP-NEXT: sw a7, 20(s0)988; RV32-WITHFP-NEXT: addi a3, a0, 7989; RV32-WITHFP-NEXT: addi a0, a0, 15990; RV32-WITHFP-NEXT: andi a3, a3, -8991; RV32-WITHFP-NEXT: sw a0, -12(s0)992; RV32-WITHFP-NEXT: lw a4, 0(a3)993; RV32-WITHFP-NEXT: lw a3, 4(a3)994; RV32-WITHFP-NEXT: add a0, a1, a4995; RV32-WITHFP-NEXT: sltu a1, a0, a4996; RV32-WITHFP-NEXT: add a2, a2, a3997; RV32-WITHFP-NEXT: add a1, a2, a1998; RV32-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload999; RV32-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload1000; RV32-WITHFP-NEXT: addi sp, sp, 481001; RV32-WITHFP-NEXT: ret1002;1003; RV64-WITHFP-LABEL: va3:1004; RV64-WITHFP: # %bb.0:1005; RV64-WITHFP-NEXT: addi sp, sp, -801006; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1007; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1008; RV64-WITHFP-NEXT: addi s0, sp, 321009; RV64-WITHFP-NEXT: mv a0, s01010; RV64-WITHFP-NEXT: sd a0, -24(s0)1011; RV64-WITHFP-NEXT: ld a0, -24(s0)1012; RV64-WITHFP-NEXT: sd a2, 0(s0)1013; RV64-WITHFP-NEXT: sd a3, 8(s0)1014; RV64-WITHFP-NEXT: sd a4, 16(s0)1015; RV64-WITHFP-NEXT: sd a5, 24(s0)1016; RV64-WITHFP-NEXT: sd a6, 32(s0)1017; RV64-WITHFP-NEXT: sd a7, 40(s0)1018; RV64-WITHFP-NEXT: addi a2, a0, 71019; RV64-WITHFP-NEXT: addi a0, a0, 151020; RV64-WITHFP-NEXT: andi a2, a2, -81021; RV64-WITHFP-NEXT: sd a0, -24(s0)1022; RV64-WITHFP-NEXT: ld a0, 0(a2)1023; RV64-WITHFP-NEXT: add a0, a1, a01024; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1025; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1026; RV64-WITHFP-NEXT: addi sp, sp, 801027; RV64-WITHFP-NEXT: ret1028 %va = alloca ptr1029 call void @llvm.va_start(ptr %va)1030 %argp.cur = load ptr, ptr %va1031 %ptrint = ptrtoint ptr %argp.cur to iXLen1032 %1 = add iXLen %ptrint, 71033 %2 = and iXLen %1, -81034 %argp.cur.aligned = inttoptr iXLen %1 to ptr1035 %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 81036 store ptr %argp.next, ptr %va1037 %3 = inttoptr iXLen %2 to ptr1038 %4 = load double, ptr %3, align 81039 call void @llvm.va_end(ptr %va)1040 %5 = bitcast double %4 to i641041 %6 = add i64 %b, %51042 ret i64 %61043}1044 1045; This test is slightly different than the SelectionDAG counterpart because1046; narrowScalar and widenScalar for G_VAARG on types outside of [s32, sXLen]1047; are not implemented yet.1048define iXLen @va3_va_arg(iXLen %a, iXLen %b, ...) nounwind {1049; RV32-LABEL: va3_va_arg:1050; RV32: # %bb.0:1051; RV32-NEXT: addi sp, sp, -321052; RV32-NEXT: sw a2, 8(sp)1053; RV32-NEXT: sw a3, 12(sp)1054; RV32-NEXT: sw a4, 16(sp)1055; RV32-NEXT: sw a5, 20(sp)1056; RV32-NEXT: sw a6, 24(sp)1057; RV32-NEXT: sw a7, 28(sp)1058; RV32-NEXT: addi a0, sp, 81059; RV32-NEXT: sw a0, 4(sp)1060; RV32-NEXT: lw a0, 4(sp)1061; RV32-NEXT: addi a0, a0, 31062; RV32-NEXT: andi a0, a0, -41063; RV32-NEXT: addi a2, a0, 41064; RV32-NEXT: sw a2, 4(sp)1065; RV32-NEXT: lw a0, 0(a0)1066; RV32-NEXT: add a0, a1, a01067; RV32-NEXT: addi sp, sp, 321068; RV32-NEXT: ret1069;1070; RV64-LABEL: va3_va_arg:1071; RV64: # %bb.0:1072; RV64-NEXT: addi sp, sp, -641073; RV64-NEXT: sd a2, 16(sp)1074; RV64-NEXT: sd a3, 24(sp)1075; RV64-NEXT: sd a4, 32(sp)1076; RV64-NEXT: sd a5, 40(sp)1077; RV64-NEXT: sd a6, 48(sp)1078; RV64-NEXT: sd a7, 56(sp)1079; RV64-NEXT: addi a0, sp, 161080; RV64-NEXT: sd a0, 8(sp)1081; RV64-NEXT: ld a0, 8(sp)1082; RV64-NEXT: addi a0, a0, 71083; RV64-NEXT: andi a0, a0, -81084; RV64-NEXT: addi a2, a0, 81085; RV64-NEXT: sd a2, 8(sp)1086; RV64-NEXT: ld a0, 0(a0)1087; RV64-NEXT: add a0, a1, a01088; RV64-NEXT: addi sp, sp, 641089; RV64-NEXT: ret1090;1091; RV32-WITHFP-LABEL: va3_va_arg:1092; RV32-WITHFP: # %bb.0:1093; RV32-WITHFP-NEXT: addi sp, sp, -481094; RV32-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill1095; RV32-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill1096; RV32-WITHFP-NEXT: addi s0, sp, 241097; RV32-WITHFP-NEXT: sw a2, 0(s0)1098; RV32-WITHFP-NEXT: sw a3, 4(s0)1099; RV32-WITHFP-NEXT: sw a4, 8(s0)1100; RV32-WITHFP-NEXT: sw a5, 12(s0)1101; RV32-WITHFP-NEXT: sw a6, 16(s0)1102; RV32-WITHFP-NEXT: sw a7, 20(s0)1103; RV32-WITHFP-NEXT: mv a0, s01104; RV32-WITHFP-NEXT: sw a0, -12(s0)1105; RV32-WITHFP-NEXT: lw a0, -12(s0)1106; RV32-WITHFP-NEXT: addi a0, a0, 31107; RV32-WITHFP-NEXT: andi a0, a0, -41108; RV32-WITHFP-NEXT: addi a2, a0, 41109; RV32-WITHFP-NEXT: sw a2, -12(s0)1110; RV32-WITHFP-NEXT: lw a0, 0(a0)1111; RV32-WITHFP-NEXT: add a0, a1, a01112; RV32-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload1113; RV32-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload1114; RV32-WITHFP-NEXT: addi sp, sp, 481115; RV32-WITHFP-NEXT: ret1116;1117; RV64-WITHFP-LABEL: va3_va_arg:1118; RV64-WITHFP: # %bb.0:1119; RV64-WITHFP-NEXT: addi sp, sp, -801120; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1121; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1122; RV64-WITHFP-NEXT: addi s0, sp, 321123; RV64-WITHFP-NEXT: sd a2, 0(s0)1124; RV64-WITHFP-NEXT: sd a3, 8(s0)1125; RV64-WITHFP-NEXT: sd a4, 16(s0)1126; RV64-WITHFP-NEXT: sd a5, 24(s0)1127; RV64-WITHFP-NEXT: sd a6, 32(s0)1128; RV64-WITHFP-NEXT: sd a7, 40(s0)1129; RV64-WITHFP-NEXT: mv a0, s01130; RV64-WITHFP-NEXT: sd a0, -24(s0)1131; RV64-WITHFP-NEXT: ld a0, -24(s0)1132; RV64-WITHFP-NEXT: addi a0, a0, 71133; RV64-WITHFP-NEXT: andi a0, a0, -81134; RV64-WITHFP-NEXT: addi a2, a0, 81135; RV64-WITHFP-NEXT: sd a2, -24(s0)1136; RV64-WITHFP-NEXT: ld a0, 0(a0)1137; RV64-WITHFP-NEXT: add a0, a1, a01138; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1139; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1140; RV64-WITHFP-NEXT: addi sp, sp, 801141; RV64-WITHFP-NEXT: ret1142 %va = alloca ptr1143 call void @llvm.va_start(ptr %va)1144 %1 = va_arg ptr %va, iXLen1145 call void @llvm.va_end(ptr %va)1146 %3 = add iXLen %b, %11147 ret iXLen %31148}1149 1150define void @va3_caller() nounwind {1151; RV32-LABEL: va3_caller:1152; RV32: # %bb.0:1153; RV32-NEXT: addi sp, sp, -161154; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1155; RV32-NEXT: lui a3, 51156; RV32-NEXT: addi a3, a3, -4801157; RV32-NEXT: li a0, 21158; RV32-NEXT: li a1, 11111159; RV32-NEXT: li a2, 01160; RV32-NEXT: call va31161; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1162; RV32-NEXT: addi sp, sp, 161163; RV32-NEXT: ret1164;1165; RV64-LABEL: va3_caller:1166; RV64: # %bb.0:1167; RV64-NEXT: addi sp, sp, -161168; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1169; RV64-NEXT: lui a1, 51170; RV64-NEXT: li a0, 21171; RV64-NEXT: addi a2, a1, -4801172; RV64-NEXT: li a1, 11111173; RV64-NEXT: call va31174; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1175; RV64-NEXT: addi sp, sp, 161176; RV64-NEXT: ret1177;1178; RV32-WITHFP-LABEL: va3_caller:1179; RV32-WITHFP: # %bb.0:1180; RV32-WITHFP-NEXT: addi sp, sp, -161181; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1182; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1183; RV32-WITHFP-NEXT: addi s0, sp, 161184; RV32-WITHFP-NEXT: lui a3, 51185; RV32-WITHFP-NEXT: addi a3, a3, -4801186; RV32-WITHFP-NEXT: li a0, 21187; RV32-WITHFP-NEXT: li a1, 11111188; RV32-WITHFP-NEXT: li a2, 01189; RV32-WITHFP-NEXT: call va31190; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1191; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1192; RV32-WITHFP-NEXT: addi sp, sp, 161193; RV32-WITHFP-NEXT: ret1194;1195; RV64-WITHFP-LABEL: va3_caller:1196; RV64-WITHFP: # %bb.0:1197; RV64-WITHFP-NEXT: addi sp, sp, -161198; RV64-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1199; RV64-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill1200; RV64-WITHFP-NEXT: addi s0, sp, 161201; RV64-WITHFP-NEXT: lui a1, 51202; RV64-WITHFP-NEXT: li a0, 21203; RV64-WITHFP-NEXT: addi a2, a1, -4801204; RV64-WITHFP-NEXT: li a1, 11111205; RV64-WITHFP-NEXT: call va31206; RV64-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1207; RV64-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload1208; RV64-WITHFP-NEXT: addi sp, sp, 161209; RV64-WITHFP-NEXT: ret1210 %1 = call i64 (i32, i64, ...) @va3(i32 2, i64 1111, i32 20000)1211 ret void1212}1213 1214define iXLen @va4_va_copy(i32 %argno, ...) nounwind {1215; RV32-LABEL: va4_va_copy:1216; RV32: # %bb.0:1217; RV32-NEXT: addi sp, sp, -641218; RV32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1219; RV32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1220; RV32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1221; RV32-NEXT: sw a1, 36(sp)1222; RV32-NEXT: sw a2, 40(sp)1223; RV32-NEXT: sw a3, 44(sp)1224; RV32-NEXT: sw a4, 48(sp)1225; RV32-NEXT: sw a5, 52(sp)1226; RV32-NEXT: sw a6, 56(sp)1227; RV32-NEXT: sw a7, 60(sp)1228; RV32-NEXT: addi a0, sp, 361229; RV32-NEXT: sw a0, 16(sp)1230; RV32-NEXT: lw a0, 16(sp)1231; RV32-NEXT: addi a0, a0, 31232; RV32-NEXT: li s0, -41233; RV32-NEXT: and a0, a0, s01234; RV32-NEXT: addi a1, a0, 41235; RV32-NEXT: sw a1, 16(sp)1236; RV32-NEXT: lw a1, 16(sp)1237; RV32-NEXT: lw s1, 0(a0)1238; RV32-NEXT: sw a1, 12(sp)1239; RV32-NEXT: lw a0, 12(sp)1240; RV32-NEXT: call notdead1241; RV32-NEXT: lw a0, 16(sp)1242; RV32-NEXT: addi a0, a0, 31243; RV32-NEXT: and a0, a0, s01244; RV32-NEXT: addi a1, a0, 41245; RV32-NEXT: sw a1, 16(sp)1246; RV32-NEXT: lw a1, 16(sp)1247; RV32-NEXT: lw a0, 0(a0)1248; RV32-NEXT: addi a1, a1, 31249; RV32-NEXT: and a1, a1, s01250; RV32-NEXT: addi a2, a1, 41251; RV32-NEXT: sw a2, 16(sp)1252; RV32-NEXT: lw a2, 16(sp)1253; RV32-NEXT: lw a1, 0(a1)1254; RV32-NEXT: addi a2, a2, 31255; RV32-NEXT: andi a2, a2, -41256; RV32-NEXT: addi a3, a2, 41257; RV32-NEXT: sw a3, 16(sp)1258; RV32-NEXT: lw a2, 0(a2)1259; RV32-NEXT: add a0, a0, s11260; RV32-NEXT: add a1, a1, a21261; RV32-NEXT: add a0, a0, a11262; RV32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1263; RV32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1264; RV32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1265; RV32-NEXT: addi sp, sp, 641266; RV32-NEXT: ret1267;1268; RV64-LABEL: va4_va_copy:1269; RV64: # %bb.0:1270; RV64-NEXT: addi sp, sp, -1121271; RV64-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1272; RV64-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1273; RV64-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1274; RV64-NEXT: sd a1, 56(sp)1275; RV64-NEXT: sd a2, 64(sp)1276; RV64-NEXT: sd a3, 72(sp)1277; RV64-NEXT: sd a4, 80(sp)1278; RV64-NEXT: sd a5, 88(sp)1279; RV64-NEXT: sd a6, 96(sp)1280; RV64-NEXT: sd a7, 104(sp)1281; RV64-NEXT: addi a0, sp, 561282; RV64-NEXT: sd a0, 16(sp)1283; RV64-NEXT: ld a0, 16(sp)1284; RV64-NEXT: addi a0, a0, 71285; RV64-NEXT: li s0, -81286; RV64-NEXT: and a0, a0, s01287; RV64-NEXT: addi a1, a0, 81288; RV64-NEXT: sd a1, 16(sp)1289; RV64-NEXT: ld a1, 16(sp)1290; RV64-NEXT: ld s1, 0(a0)1291; RV64-NEXT: sd a1, 8(sp)1292; RV64-NEXT: lw a0, 12(sp)1293; RV64-NEXT: lwu a1, 8(sp)1294; RV64-NEXT: slli a0, a0, 321295; RV64-NEXT: or a0, a0, a11296; RV64-NEXT: call notdead1297; RV64-NEXT: ld a0, 16(sp)1298; RV64-NEXT: addi a0, a0, 71299; RV64-NEXT: and a0, a0, s01300; RV64-NEXT: addi a1, a0, 81301; RV64-NEXT: sd a1, 16(sp)1302; RV64-NEXT: ld a1, 16(sp)1303; RV64-NEXT: ld a0, 0(a0)1304; RV64-NEXT: addi a1, a1, 71305; RV64-NEXT: and a1, a1, s01306; RV64-NEXT: addi a2, a1, 81307; RV64-NEXT: sd a2, 16(sp)1308; RV64-NEXT: ld a2, 16(sp)1309; RV64-NEXT: ld a1, 0(a1)1310; RV64-NEXT: addi a2, a2, 71311; RV64-NEXT: andi a2, a2, -81312; RV64-NEXT: addi a3, a2, 81313; RV64-NEXT: sd a3, 16(sp)1314; RV64-NEXT: ld a2, 0(a2)1315; RV64-NEXT: add a0, a0, s11316; RV64-NEXT: add a1, a1, a21317; RV64-NEXT: add a0, a0, a11318; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1319; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1320; RV64-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1321; RV64-NEXT: addi sp, sp, 1121322; RV64-NEXT: ret1323;1324; RV32-WITHFP-LABEL: va4_va_copy:1325; RV32-WITHFP: # %bb.0:1326; RV32-WITHFP-NEXT: addi sp, sp, -641327; RV32-WITHFP-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1328; RV32-WITHFP-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1329; RV32-WITHFP-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1330; RV32-WITHFP-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1331; RV32-WITHFP-NEXT: addi s0, sp, 321332; RV32-WITHFP-NEXT: sw a1, 4(s0)1333; RV32-WITHFP-NEXT: sw a2, 8(s0)1334; RV32-WITHFP-NEXT: sw a3, 12(s0)1335; RV32-WITHFP-NEXT: sw a4, 16(s0)1336; RV32-WITHFP-NEXT: sw a5, 20(s0)1337; RV32-WITHFP-NEXT: sw a6, 24(s0)1338; RV32-WITHFP-NEXT: sw a7, 28(s0)1339; RV32-WITHFP-NEXT: addi a0, s0, 41340; RV32-WITHFP-NEXT: sw a0, -20(s0)1341; RV32-WITHFP-NEXT: lw a0, -20(s0)1342; RV32-WITHFP-NEXT: addi a0, a0, 31343; RV32-WITHFP-NEXT: li s1, -41344; RV32-WITHFP-NEXT: and a0, a0, s11345; RV32-WITHFP-NEXT: addi a1, a0, 41346; RV32-WITHFP-NEXT: sw a1, -20(s0)1347; RV32-WITHFP-NEXT: lw a1, -20(s0)1348; RV32-WITHFP-NEXT: lw s2, 0(a0)1349; RV32-WITHFP-NEXT: sw a1, -24(s0)1350; RV32-WITHFP-NEXT: lw a0, -24(s0)1351; RV32-WITHFP-NEXT: call notdead1352; RV32-WITHFP-NEXT: lw a0, -20(s0)1353; RV32-WITHFP-NEXT: addi a0, a0, 31354; RV32-WITHFP-NEXT: and a0, a0, s11355; RV32-WITHFP-NEXT: addi a1, a0, 41356; RV32-WITHFP-NEXT: sw a1, -20(s0)1357; RV32-WITHFP-NEXT: lw a1, -20(s0)1358; RV32-WITHFP-NEXT: lw a0, 0(a0)1359; RV32-WITHFP-NEXT: addi a1, a1, 31360; RV32-WITHFP-NEXT: and a1, a1, s11361; RV32-WITHFP-NEXT: addi a2, a1, 41362; RV32-WITHFP-NEXT: sw a2, -20(s0)1363; RV32-WITHFP-NEXT: lw a2, -20(s0)1364; RV32-WITHFP-NEXT: lw a1, 0(a1)1365; RV32-WITHFP-NEXT: addi a2, a2, 31366; RV32-WITHFP-NEXT: andi a2, a2, -41367; RV32-WITHFP-NEXT: addi a3, a2, 41368; RV32-WITHFP-NEXT: sw a3, -20(s0)1369; RV32-WITHFP-NEXT: lw a2, 0(a2)1370; RV32-WITHFP-NEXT: add a0, a0, s21371; RV32-WITHFP-NEXT: add a1, a1, a21372; RV32-WITHFP-NEXT: add a0, a0, a11373; RV32-WITHFP-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1374; RV32-WITHFP-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1375; RV32-WITHFP-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1376; RV32-WITHFP-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1377; RV32-WITHFP-NEXT: addi sp, sp, 641378; RV32-WITHFP-NEXT: ret1379;1380; RV64-WITHFP-LABEL: va4_va_copy:1381; RV64-WITHFP: # %bb.0:1382; RV64-WITHFP-NEXT: addi sp, sp, -1121383; RV64-WITHFP-NEXT: sd ra, 40(sp) # 8-byte Folded Spill1384; RV64-WITHFP-NEXT: sd s0, 32(sp) # 8-byte Folded Spill1385; RV64-WITHFP-NEXT: sd s1, 24(sp) # 8-byte Folded Spill1386; RV64-WITHFP-NEXT: sd s2, 16(sp) # 8-byte Folded Spill1387; RV64-WITHFP-NEXT: addi s0, sp, 481388; RV64-WITHFP-NEXT: sd a1, 8(s0)1389; RV64-WITHFP-NEXT: sd a2, 16(s0)1390; RV64-WITHFP-NEXT: sd a3, 24(s0)1391; RV64-WITHFP-NEXT: sd a4, 32(s0)1392; RV64-WITHFP-NEXT: sd a5, 40(s0)1393; RV64-WITHFP-NEXT: sd a6, 48(s0)1394; RV64-WITHFP-NEXT: sd a7, 56(s0)1395; RV64-WITHFP-NEXT: addi a0, s0, 81396; RV64-WITHFP-NEXT: sd a0, -40(s0)1397; RV64-WITHFP-NEXT: ld a0, -40(s0)1398; RV64-WITHFP-NEXT: addi a0, a0, 71399; RV64-WITHFP-NEXT: li s1, -81400; RV64-WITHFP-NEXT: and a0, a0, s11401; RV64-WITHFP-NEXT: addi a1, a0, 81402; RV64-WITHFP-NEXT: sd a1, -40(s0)1403; RV64-WITHFP-NEXT: ld a1, -40(s0)1404; RV64-WITHFP-NEXT: ld s2, 0(a0)1405; RV64-WITHFP-NEXT: sd a1, -48(s0)1406; RV64-WITHFP-NEXT: lw a0, -44(s0)1407; RV64-WITHFP-NEXT: lwu a1, -48(s0)1408; RV64-WITHFP-NEXT: slli a0, a0, 321409; RV64-WITHFP-NEXT: or a0, a0, a11410; RV64-WITHFP-NEXT: call notdead1411; RV64-WITHFP-NEXT: ld a0, -40(s0)1412; RV64-WITHFP-NEXT: addi a0, a0, 71413; RV64-WITHFP-NEXT: and a0, a0, s11414; RV64-WITHFP-NEXT: addi a1, a0, 81415; RV64-WITHFP-NEXT: sd a1, -40(s0)1416; RV64-WITHFP-NEXT: ld a1, -40(s0)1417; RV64-WITHFP-NEXT: ld a0, 0(a0)1418; RV64-WITHFP-NEXT: addi a1, a1, 71419; RV64-WITHFP-NEXT: and a1, a1, s11420; RV64-WITHFP-NEXT: addi a2, a1, 81421; RV64-WITHFP-NEXT: sd a2, -40(s0)1422; RV64-WITHFP-NEXT: ld a2, -40(s0)1423; RV64-WITHFP-NEXT: ld a1, 0(a1)1424; RV64-WITHFP-NEXT: addi a2, a2, 71425; RV64-WITHFP-NEXT: andi a2, a2, -81426; RV64-WITHFP-NEXT: addi a3, a2, 81427; RV64-WITHFP-NEXT: sd a3, -40(s0)1428; RV64-WITHFP-NEXT: ld a2, 0(a2)1429; RV64-WITHFP-NEXT: add a0, a0, s21430; RV64-WITHFP-NEXT: add a1, a1, a21431; RV64-WITHFP-NEXT: add a0, a0, a11432; RV64-WITHFP-NEXT: ld ra, 40(sp) # 8-byte Folded Reload1433; RV64-WITHFP-NEXT: ld s0, 32(sp) # 8-byte Folded Reload1434; RV64-WITHFP-NEXT: ld s1, 24(sp) # 8-byte Folded Reload1435; RV64-WITHFP-NEXT: ld s2, 16(sp) # 8-byte Folded Reload1436; RV64-WITHFP-NEXT: addi sp, sp, 1121437; RV64-WITHFP-NEXT: ret1438 %vargs = alloca ptr1439 %wargs = alloca ptr1440 call void @llvm.va_start(ptr %vargs)1441 %1 = va_arg ptr %vargs, iXLen1442 call void @llvm.va_copy(ptr %wargs, ptr %vargs)1443 %2 = load ptr, ptr %wargs, align 41444 call void @notdead(ptr %2)1445 %3 = va_arg ptr %vargs, iXLen1446 %4 = va_arg ptr %vargs, iXLen1447 %5 = va_arg ptr %vargs, iXLen1448 call void @llvm.va_end(ptr %vargs)1449 call void @llvm.va_end(ptr %wargs)1450 %add1 = add iXLen %3, %11451 %add2 = add iXLen %add1, %41452 %add3 = add iXLen %add2, %51453 ret iXLen %add31454}1455 1456; The va5_aligned_stack_callee and caller function are ommitted from this file1457; since they were not included in the IR lowering test when vararg calls were1458; initially added.1459 1460; A function with no fixed arguments is not valid C, but can be1461; specified in LLVM IR. We must ensure the vararg save area is1462; still set up correctly.1463 1464define iXLen @va6_no_fixed_args(...) nounwind {1465; RV32-LABEL: va6_no_fixed_args:1466; RV32: # %bb.0:1467; RV32-NEXT: addi sp, sp, -481468; RV32-NEXT: sw a0, 16(sp)1469; RV32-NEXT: sw a1, 20(sp)1470; RV32-NEXT: sw a2, 24(sp)1471; RV32-NEXT: sw a3, 28(sp)1472; RV32-NEXT: sw a4, 32(sp)1473; RV32-NEXT: sw a5, 36(sp)1474; RV32-NEXT: sw a6, 40(sp)1475; RV32-NEXT: sw a7, 44(sp)1476; RV32-NEXT: addi a0, sp, 161477; RV32-NEXT: sw a0, 12(sp)1478; RV32-NEXT: lw a0, 12(sp)1479; RV32-NEXT: addi a0, a0, 31480; RV32-NEXT: andi a0, a0, -41481; RV32-NEXT: addi a1, a0, 41482; RV32-NEXT: sw a1, 12(sp)1483; RV32-NEXT: lw a0, 0(a0)1484; RV32-NEXT: addi sp, sp, 481485; RV32-NEXT: ret1486;1487; RV64-LABEL: va6_no_fixed_args:1488; RV64: # %bb.0:1489; RV64-NEXT: addi sp, sp, -801490; RV64-NEXT: sd a0, 16(sp)1491; RV64-NEXT: sd a1, 24(sp)1492; RV64-NEXT: sd a2, 32(sp)1493; RV64-NEXT: sd a3, 40(sp)1494; RV64-NEXT: sd a4, 48(sp)1495; RV64-NEXT: sd a5, 56(sp)1496; RV64-NEXT: sd a6, 64(sp)1497; RV64-NEXT: sd a7, 72(sp)1498; RV64-NEXT: addi a0, sp, 161499; RV64-NEXT: sd a0, 8(sp)1500; RV64-NEXT: ld a0, 8(sp)1501; RV64-NEXT: addi a0, a0, 71502; RV64-NEXT: andi a0, a0, -81503; RV64-NEXT: addi a1, a0, 81504; RV64-NEXT: sd a1, 8(sp)1505; RV64-NEXT: ld a0, 0(a0)1506; RV64-NEXT: addi sp, sp, 801507; RV64-NEXT: ret1508;1509; RV32-WITHFP-LABEL: va6_no_fixed_args:1510; RV32-WITHFP: # %bb.0:1511; RV32-WITHFP-NEXT: addi sp, sp, -481512; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1513; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1514; RV32-WITHFP-NEXT: addi s0, sp, 161515; RV32-WITHFP-NEXT: sw a0, 0(s0)1516; RV32-WITHFP-NEXT: sw a1, 4(s0)1517; RV32-WITHFP-NEXT: sw a2, 8(s0)1518; RV32-WITHFP-NEXT: sw a3, 12(s0)1519; RV32-WITHFP-NEXT: sw a4, 16(s0)1520; RV32-WITHFP-NEXT: sw a5, 20(s0)1521; RV32-WITHFP-NEXT: sw a6, 24(s0)1522; RV32-WITHFP-NEXT: sw a7, 28(s0)1523; RV32-WITHFP-NEXT: mv a0, s01524; RV32-WITHFP-NEXT: sw a0, -12(s0)1525; RV32-WITHFP-NEXT: lw a0, -12(s0)1526; RV32-WITHFP-NEXT: addi a0, a0, 31527; RV32-WITHFP-NEXT: andi a0, a0, -41528; RV32-WITHFP-NEXT: addi a1, a0, 41529; RV32-WITHFP-NEXT: sw a1, -12(s0)1530; RV32-WITHFP-NEXT: lw a0, 0(a0)1531; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1532; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1533; RV32-WITHFP-NEXT: addi sp, sp, 481534; RV32-WITHFP-NEXT: ret1535;1536; RV64-WITHFP-LABEL: va6_no_fixed_args:1537; RV64-WITHFP: # %bb.0:1538; RV64-WITHFP-NEXT: addi sp, sp, -961539; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1540; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1541; RV64-WITHFP-NEXT: addi s0, sp, 321542; RV64-WITHFP-NEXT: sd a0, 0(s0)1543; RV64-WITHFP-NEXT: sd a1, 8(s0)1544; RV64-WITHFP-NEXT: sd a2, 16(s0)1545; RV64-WITHFP-NEXT: sd a3, 24(s0)1546; RV64-WITHFP-NEXT: sd a4, 32(s0)1547; RV64-WITHFP-NEXT: sd a5, 40(s0)1548; RV64-WITHFP-NEXT: sd a6, 48(s0)1549; RV64-WITHFP-NEXT: sd a7, 56(s0)1550; RV64-WITHFP-NEXT: mv a0, s01551; RV64-WITHFP-NEXT: sd a0, -24(s0)1552; RV64-WITHFP-NEXT: ld a0, -24(s0)1553; RV64-WITHFP-NEXT: addi a0, a0, 71554; RV64-WITHFP-NEXT: andi a0, a0, -81555; RV64-WITHFP-NEXT: addi a1, a0, 81556; RV64-WITHFP-NEXT: sd a1, -24(s0)1557; RV64-WITHFP-NEXT: ld a0, 0(a0)1558; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1559; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1560; RV64-WITHFP-NEXT: addi sp, sp, 961561; RV64-WITHFP-NEXT: ret1562 %va = alloca ptr1563 call void @llvm.va_start(ptr %va)1564 %1 = va_arg ptr %va, iXLen1565 call void @llvm.va_end(ptr %va)1566 ret iXLen %11567}1568 1569; TODO: improve constant materialization of stack addresses1570 1571define i32 @va_large_stack(ptr %fmt, ...) {1572; RV32-LABEL: va_large_stack:1573; RV32: # %bb.0:1574; RV32-NEXT: lui a0, 244141575; RV32-NEXT: addi a0, a0, 3041576; RV32-NEXT: sub sp, sp, a01577; RV32-NEXT: .cfi_def_cfa_offset 1000000481578; RV32-NEXT: lui a0, 244141579; RV32-NEXT: add a0, sp, a01580; RV32-NEXT: sw a1, 276(a0)1581; RV32-NEXT: lui a0, 244141582; RV32-NEXT: add a0, sp, a01583; RV32-NEXT: sw a2, 280(a0)1584; RV32-NEXT: lui a0, 244141585; RV32-NEXT: add a0, sp, a01586; RV32-NEXT: sw a3, 284(a0)1587; RV32-NEXT: lui a0, 244141588; RV32-NEXT: add a0, sp, a01589; RV32-NEXT: sw a4, 288(a0)1590; RV32-NEXT: lui a0, 244141591; RV32-NEXT: addi a0, a0, 2761592; RV32-NEXT: add a0, sp, a01593; RV32-NEXT: sw a0, 12(sp)1594; RV32-NEXT: lw a0, 12(sp)1595; RV32-NEXT: lui a1, 244141596; RV32-NEXT: add a1, sp, a11597; RV32-NEXT: sw a5, 292(a1)1598; RV32-NEXT: lui a1, 244141599; RV32-NEXT: add a1, sp, a11600; RV32-NEXT: sw a6, 296(a1)1601; RV32-NEXT: lui a1, 244141602; RV32-NEXT: add a1, sp, a11603; RV32-NEXT: sw a7, 300(a1)1604; RV32-NEXT: addi a1, a0, 41605; RV32-NEXT: sw a1, 12(sp)1606; RV32-NEXT: lw a0, 0(a0)1607; RV32-NEXT: lui a1, 244141608; RV32-NEXT: addi a1, a1, 3041609; RV32-NEXT: add sp, sp, a11610; RV32-NEXT: .cfi_def_cfa_offset 01611; RV32-NEXT: ret1612;1613; RV64-LABEL: va_large_stack:1614; RV64: # %bb.0:1615; RV64-NEXT: lui a0, 244141616; RV64-NEXT: addi a0, a0, 3361617; RV64-NEXT: sub sp, sp, a01618; RV64-NEXT: .cfi_def_cfa_offset 1000000801619; RV64-NEXT: lui a0, 244141620; RV64-NEXT: add a0, sp, a01621; RV64-NEXT: sd a1, 280(a0)1622; RV64-NEXT: lui a0, 244141623; RV64-NEXT: add a0, sp, a01624; RV64-NEXT: sd a2, 288(a0)1625; RV64-NEXT: lui a0, 244141626; RV64-NEXT: add a0, sp, a01627; RV64-NEXT: sd a3, 296(a0)1628; RV64-NEXT: lui a0, 244141629; RV64-NEXT: add a0, sp, a01630; RV64-NEXT: sd a4, 304(a0)1631; RV64-NEXT: addi a0, sp, 81632; RV64-NEXT: lui a1, 244141633; RV64-NEXT: addi a1, a1, 2801634; RV64-NEXT: add a1, sp, a11635; RV64-NEXT: sd a1, 8(sp)1636; RV64-NEXT: lw a0, 4(a0)1637; RV64-NEXT: lwu a1, 8(sp)1638; RV64-NEXT: lui a2, 244141639; RV64-NEXT: add a2, sp, a21640; RV64-NEXT: sd a5, 312(a2)1641; RV64-NEXT: lui a2, 244141642; RV64-NEXT: add a2, sp, a21643; RV64-NEXT: sd a6, 320(a2)1644; RV64-NEXT: lui a2, 244141645; RV64-NEXT: add a2, sp, a21646; RV64-NEXT: sd a7, 328(a2)1647; RV64-NEXT: slli a0, a0, 321648; RV64-NEXT: or a0, a0, a11649; RV64-NEXT: addi a1, a0, 41650; RV64-NEXT: srli a2, a1, 321651; RV64-NEXT: sw a1, 8(sp)1652; RV64-NEXT: sw a2, 12(sp)1653; RV64-NEXT: lw a0, 0(a0)1654; RV64-NEXT: lui a1, 244141655; RV64-NEXT: addi a1, a1, 3361656; RV64-NEXT: add sp, sp, a11657; RV64-NEXT: .cfi_def_cfa_offset 01658; RV64-NEXT: ret1659;1660; RV32-WITHFP-LABEL: va_large_stack:1661; RV32-WITHFP: # %bb.0:1662; RV32-WITHFP-NEXT: addi sp, sp, -20321663; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 20321664; RV32-WITHFP-NEXT: sw ra, 1996(sp) # 4-byte Folded Spill1665; RV32-WITHFP-NEXT: sw s0, 1992(sp) # 4-byte Folded Spill1666; RV32-WITHFP-NEXT: .cfi_offset ra, -361667; RV32-WITHFP-NEXT: .cfi_offset s0, -401668; RV32-WITHFP-NEXT: addi s0, sp, 20001669; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 321670; RV32-WITHFP-NEXT: lui a0, 244141671; RV32-WITHFP-NEXT: addi a0, a0, -17281672; RV32-WITHFP-NEXT: sub sp, sp, a01673; RV32-WITHFP-NEXT: lui a0, 244141674; RV32-WITHFP-NEXT: addi a0, a0, 2721675; RV32-WITHFP-NEXT: sub a0, s0, a01676; RV32-WITHFP-NEXT: sw a1, 4(s0)1677; RV32-WITHFP-NEXT: sw a2, 8(s0)1678; RV32-WITHFP-NEXT: sw a3, 12(s0)1679; RV32-WITHFP-NEXT: sw a4, 16(s0)1680; RV32-WITHFP-NEXT: addi a1, s0, 41681; RV32-WITHFP-NEXT: sw a1, 0(a0)1682; RV32-WITHFP-NEXT: lw a1, 0(a0)1683; RV32-WITHFP-NEXT: sw a5, 20(s0)1684; RV32-WITHFP-NEXT: sw a6, 24(s0)1685; RV32-WITHFP-NEXT: sw a7, 28(s0)1686; RV32-WITHFP-NEXT: addi a2, a1, 41687; RV32-WITHFP-NEXT: sw a2, 0(a0)1688; RV32-WITHFP-NEXT: lw a0, 0(a1)1689; RV32-WITHFP-NEXT: lui a1, 244141690; RV32-WITHFP-NEXT: addi a1, a1, -17281691; RV32-WITHFP-NEXT: add sp, sp, a11692; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 20321693; RV32-WITHFP-NEXT: lw ra, 1996(sp) # 4-byte Folded Reload1694; RV32-WITHFP-NEXT: lw s0, 1992(sp) # 4-byte Folded Reload1695; RV32-WITHFP-NEXT: .cfi_restore ra1696; RV32-WITHFP-NEXT: .cfi_restore s01697; RV32-WITHFP-NEXT: addi sp, sp, 20321698; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 01699; RV32-WITHFP-NEXT: ret1700;1701; RV64-WITHFP-LABEL: va_large_stack:1702; RV64-WITHFP: # %bb.0:1703; RV64-WITHFP-NEXT: addi sp, sp, -20321704; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 20321705; RV64-WITHFP-NEXT: sd ra, 1960(sp) # 8-byte Folded Spill1706; RV64-WITHFP-NEXT: sd s0, 1952(sp) # 8-byte Folded Spill1707; RV64-WITHFP-NEXT: .cfi_offset ra, -721708; RV64-WITHFP-NEXT: .cfi_offset s0, -801709; RV64-WITHFP-NEXT: addi s0, sp, 19681710; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 641711; RV64-WITHFP-NEXT: lui a0, 244141712; RV64-WITHFP-NEXT: addi a0, a0, -16801713; RV64-WITHFP-NEXT: sub sp, sp, a01714; RV64-WITHFP-NEXT: lui a0, 244141715; RV64-WITHFP-NEXT: addi a0, a0, 2881716; RV64-WITHFP-NEXT: sub a0, s0, a01717; RV64-WITHFP-NEXT: sd a1, 8(s0)1718; RV64-WITHFP-NEXT: sd a2, 16(s0)1719; RV64-WITHFP-NEXT: sd a3, 24(s0)1720; RV64-WITHFP-NEXT: sd a4, 32(s0)1721; RV64-WITHFP-NEXT: addi a1, s0, 81722; RV64-WITHFP-NEXT: sd a1, 0(a0)1723; RV64-WITHFP-NEXT: lwu a1, 0(a0)1724; RV64-WITHFP-NEXT: lw a2, 4(a0)1725; RV64-WITHFP-NEXT: sd a5, 40(s0)1726; RV64-WITHFP-NEXT: sd a6, 48(s0)1727; RV64-WITHFP-NEXT: sd a7, 56(s0)1728; RV64-WITHFP-NEXT: slli a2, a2, 321729; RV64-WITHFP-NEXT: or a1, a2, a11730; RV64-WITHFP-NEXT: addi a2, a1, 41731; RV64-WITHFP-NEXT: srli a3, a2, 321732; RV64-WITHFP-NEXT: sw a2, 0(a0)1733; RV64-WITHFP-NEXT: sw a3, 4(a0)1734; RV64-WITHFP-NEXT: lw a0, 0(a1)1735; RV64-WITHFP-NEXT: lui a1, 244141736; RV64-WITHFP-NEXT: addi a1, a1, -16801737; RV64-WITHFP-NEXT: add sp, sp, a11738; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 20321739; RV64-WITHFP-NEXT: ld ra, 1960(sp) # 8-byte Folded Reload1740; RV64-WITHFP-NEXT: ld s0, 1952(sp) # 8-byte Folded Reload1741; RV64-WITHFP-NEXT: .cfi_restore ra1742; RV64-WITHFP-NEXT: .cfi_restore s01743; RV64-WITHFP-NEXT: addi sp, sp, 20321744; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 01745; RV64-WITHFP-NEXT: ret1746 %large = alloca [ 100000000 x i8 ]1747 %va = alloca ptr1748 call void @llvm.va_start(ptr %va)1749 %argp.cur = load ptr, ptr %va, align 41750 %argp.next = getelementptr inbounds i8, ptr %argp.cur, i32 41751 store ptr %argp.next, ptr %va, align 41752 %1 = load i32, ptr %argp.cur, align 41753 call void @llvm.va_end(ptr %va)1754 ret i32 %11755}1756 1757define iXLen @va_vprintf(ptr %fmt, ptr %arg_start) {1758; RV32-LABEL: va_vprintf:1759; RV32: # %bb.0:1760; RV32-NEXT: addi sp, sp, -161761; RV32-NEXT: .cfi_def_cfa_offset 161762; RV32-NEXT: sw a1, 12(sp)1763; RV32-NEXT: lw a0, 12(sp)1764; RV32-NEXT: sw a0, 8(sp)1765; RV32-NEXT: lw a0, 8(sp)1766; RV32-NEXT: addi a0, a0, 31767; RV32-NEXT: andi a0, a0, -41768; RV32-NEXT: addi a1, a0, 41769; RV32-NEXT: sw a1, 8(sp)1770; RV32-NEXT: lw a0, 0(a0)1771; RV32-NEXT: addi sp, sp, 161772; RV32-NEXT: .cfi_def_cfa_offset 01773; RV32-NEXT: ret1774;1775; RV64-LABEL: va_vprintf:1776; RV64: # %bb.0:1777; RV64-NEXT: addi sp, sp, -161778; RV64-NEXT: .cfi_def_cfa_offset 161779; RV64-NEXT: sd a1, 8(sp)1780; RV64-NEXT: ld a0, 8(sp)1781; RV64-NEXT: sd a0, 0(sp)1782; RV64-NEXT: ld a0, 0(sp)1783; RV64-NEXT: addi a0, a0, 71784; RV64-NEXT: andi a0, a0, -81785; RV64-NEXT: addi a1, a0, 81786; RV64-NEXT: sd a1, 0(sp)1787; RV64-NEXT: ld a0, 0(a0)1788; RV64-NEXT: addi sp, sp, 161789; RV64-NEXT: .cfi_def_cfa_offset 01790; RV64-NEXT: ret1791;1792; RV32-WITHFP-LABEL: va_vprintf:1793; RV32-WITHFP: # %bb.0:1794; RV32-WITHFP-NEXT: addi sp, sp, -161795; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 161796; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1797; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1798; RV32-WITHFP-NEXT: .cfi_offset ra, -41799; RV32-WITHFP-NEXT: .cfi_offset s0, -81800; RV32-WITHFP-NEXT: addi s0, sp, 161801; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 01802; RV32-WITHFP-NEXT: sw a1, -12(s0)1803; RV32-WITHFP-NEXT: lw a0, -12(s0)1804; RV32-WITHFP-NEXT: sw a0, -16(s0)1805; RV32-WITHFP-NEXT: lw a0, -16(s0)1806; RV32-WITHFP-NEXT: addi a0, a0, 31807; RV32-WITHFP-NEXT: andi a0, a0, -41808; RV32-WITHFP-NEXT: addi a1, a0, 41809; RV32-WITHFP-NEXT: sw a1, -16(s0)1810; RV32-WITHFP-NEXT: lw a0, 0(a0)1811; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 161812; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1813; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1814; RV32-WITHFP-NEXT: .cfi_restore ra1815; RV32-WITHFP-NEXT: .cfi_restore s01816; RV32-WITHFP-NEXT: addi sp, sp, 161817; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 01818; RV32-WITHFP-NEXT: ret1819;1820; RV64-WITHFP-LABEL: va_vprintf:1821; RV64-WITHFP: # %bb.0:1822; RV64-WITHFP-NEXT: addi sp, sp, -321823; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 321824; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1825; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1826; RV64-WITHFP-NEXT: .cfi_offset ra, -81827; RV64-WITHFP-NEXT: .cfi_offset s0, -161828; RV64-WITHFP-NEXT: addi s0, sp, 321829; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 01830; RV64-WITHFP-NEXT: sd a1, -24(s0)1831; RV64-WITHFP-NEXT: ld a0, -24(s0)1832; RV64-WITHFP-NEXT: sd a0, -32(s0)1833; RV64-WITHFP-NEXT: ld a0, -32(s0)1834; RV64-WITHFP-NEXT: addi a0, a0, 71835; RV64-WITHFP-NEXT: andi a0, a0, -81836; RV64-WITHFP-NEXT: addi a1, a0, 81837; RV64-WITHFP-NEXT: sd a1, -32(s0)1838; RV64-WITHFP-NEXT: ld a0, 0(a0)1839; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 321840; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1841; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1842; RV64-WITHFP-NEXT: .cfi_restore ra1843; RV64-WITHFP-NEXT: .cfi_restore s01844; RV64-WITHFP-NEXT: addi sp, sp, 321845; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 01846; RV64-WITHFP-NEXT: ret1847 %args = alloca ptr1848 %args_cp = alloca ptr1849 store ptr %arg_start, ptr %args1850 call void @llvm.va_copy(ptr %args_cp, ptr %args)1851 %width = va_arg ptr %args_cp, iXLen1852 call void @llvm.va_end(ptr %args_cp)1853 ret iXLen %width1854}1855 1856define i32 @va_printf(ptr %fmt, ...) {1857; RV32-LABEL: va_printf:1858; RV32: # %bb.0:1859; RV32-NEXT: addi sp, sp, -481860; RV32-NEXT: .cfi_def_cfa_offset 481861; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1862; RV32-NEXT: .cfi_offset ra, -361863; RV32-NEXT: sw a1, 20(sp)1864; RV32-NEXT: sw a2, 24(sp)1865; RV32-NEXT: sw a3, 28(sp)1866; RV32-NEXT: sw a4, 32(sp)1867; RV32-NEXT: addi a1, sp, 201868; RV32-NEXT: sw a1, 8(sp)1869; RV32-NEXT: lw a1, 8(sp)1870; RV32-NEXT: sw a5, 36(sp)1871; RV32-NEXT: sw a6, 40(sp)1872; RV32-NEXT: sw a7, 44(sp)1873; RV32-NEXT: call va_vprintf1874; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1875; RV32-NEXT: .cfi_restore ra1876; RV32-NEXT: addi sp, sp, 481877; RV32-NEXT: .cfi_def_cfa_offset 01878; RV32-NEXT: ret1879;1880; RV64-LABEL: va_printf:1881; RV64: # %bb.0:1882; RV64-NEXT: addi sp, sp, -801883; RV64-NEXT: .cfi_def_cfa_offset 801884; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1885; RV64-NEXT: .cfi_offset ra, -721886; RV64-NEXT: sd a1, 24(sp)1887; RV64-NEXT: sd a2, 32(sp)1888; RV64-NEXT: sd a3, 40(sp)1889; RV64-NEXT: sd a4, 48(sp)1890; RV64-NEXT: addi a1, sp, 241891; RV64-NEXT: sd a1, 0(sp)1892; RV64-NEXT: ld a1, 0(sp)1893; RV64-NEXT: sd a5, 56(sp)1894; RV64-NEXT: sd a6, 64(sp)1895; RV64-NEXT: sd a7, 72(sp)1896; RV64-NEXT: call va_vprintf1897; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1898; RV64-NEXT: .cfi_restore ra1899; RV64-NEXT: addi sp, sp, 801900; RV64-NEXT: .cfi_def_cfa_offset 01901; RV64-NEXT: ret1902;1903; RV32-WITHFP-LABEL: va_printf:1904; RV32-WITHFP: # %bb.0:1905; RV32-WITHFP-NEXT: addi sp, sp, -481906; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 481907; RV32-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1908; RV32-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill1909; RV32-WITHFP-NEXT: .cfi_offset ra, -361910; RV32-WITHFP-NEXT: .cfi_offset s0, -401911; RV32-WITHFP-NEXT: addi s0, sp, 161912; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 321913; RV32-WITHFP-NEXT: sw a1, 4(s0)1914; RV32-WITHFP-NEXT: sw a2, 8(s0)1915; RV32-WITHFP-NEXT: sw a3, 12(s0)1916; RV32-WITHFP-NEXT: sw a4, 16(s0)1917; RV32-WITHFP-NEXT: addi a1, s0, 41918; RV32-WITHFP-NEXT: sw a1, -12(s0)1919; RV32-WITHFP-NEXT: lw a1, -12(s0)1920; RV32-WITHFP-NEXT: sw a5, 20(s0)1921; RV32-WITHFP-NEXT: sw a6, 24(s0)1922; RV32-WITHFP-NEXT: sw a7, 28(s0)1923; RV32-WITHFP-NEXT: call va_vprintf1924; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 481925; RV32-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1926; RV32-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload1927; RV32-WITHFP-NEXT: .cfi_restore ra1928; RV32-WITHFP-NEXT: .cfi_restore s01929; RV32-WITHFP-NEXT: addi sp, sp, 481930; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 01931; RV32-WITHFP-NEXT: ret1932;1933; RV64-WITHFP-LABEL: va_printf:1934; RV64-WITHFP: # %bb.0:1935; RV64-WITHFP-NEXT: addi sp, sp, -961936; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 961937; RV64-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1938; RV64-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1939; RV64-WITHFP-NEXT: .cfi_offset ra, -721940; RV64-WITHFP-NEXT: .cfi_offset s0, -801941; RV64-WITHFP-NEXT: addi s0, sp, 321942; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 641943; RV64-WITHFP-NEXT: sd a1, 8(s0)1944; RV64-WITHFP-NEXT: sd a2, 16(s0)1945; RV64-WITHFP-NEXT: sd a3, 24(s0)1946; RV64-WITHFP-NEXT: sd a4, 32(s0)1947; RV64-WITHFP-NEXT: addi a1, s0, 81948; RV64-WITHFP-NEXT: sd a1, -24(s0)1949; RV64-WITHFP-NEXT: ld a1, -24(s0)1950; RV64-WITHFP-NEXT: sd a5, 40(s0)1951; RV64-WITHFP-NEXT: sd a6, 48(s0)1952; RV64-WITHFP-NEXT: sd a7, 56(s0)1953; RV64-WITHFP-NEXT: call va_vprintf1954; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 961955; RV64-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1956; RV64-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1957; RV64-WITHFP-NEXT: .cfi_restore ra1958; RV64-WITHFP-NEXT: .cfi_restore s01959; RV64-WITHFP-NEXT: addi sp, sp, 961960; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 01961; RV64-WITHFP-NEXT: ret1962 %args = alloca ptr1963 call void @llvm.va_start(ptr %args)1964 %arg_start = load ptr, ptr %args1965 %ret_val = call i32 @va_vprintf(ptr %fmt, ptr %arg_start)1966 call void @llvm.va_end(ptr %args)1967 ret i32 %ret_val1968}1969