1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=ILP32-ILP32F-FPELIM %s 4; RUN: llc -mtriple=riscv32 -verify-machineinstrs -frame-pointer=all < %s \ 5; RUN: | FileCheck -check-prefix=ILP32-ILP32F-WITHFP %s 6; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s 8; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi ilp32f \ 9; RUN: -verify-machineinstrs < %s \ 10; RUN: | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s 11; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi ilp32d \ 12; RUN: -verify-machineinstrs < %s \ 13; RUN: | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s 14; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 15; RUN: | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s 16; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi lp64f \ 17; RUN: -verify-machineinstrs < %s \ 18; RUN: | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s 19; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi lp64d \ 20; RUN: -verify-machineinstrs < %s \ 21; RUN: | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s 22; RUN: llc -mtriple=riscv64 -verify-machineinstrs -frame-pointer=all < %s \ 23; RUN: | FileCheck -check-prefix=LP64-LP64F-LP64D-WITHFP %s 24 25; The same vararg calling convention is used for ilp32/ilp32f/ilp32d and for 26; lp64/lp64f/lp64d. Different CHECK lines are required for RV32D due to slight 27; codegen differences due to the way the f64 load operations are lowered. 28; The nounwind attribute is omitted for some of the tests, to check that CFI 29; directives are correctly generated. 30 31declare void @llvm.va_start(i8*) 32declare void @llvm.va_end(i8*) 33 34declare void @notdead(i8*) 35 36; Although frontends are recommended to not generate va_arg due to the lack of 37; support for aggregate types, we test simple cases here to ensure they are 38; lowered correctly 39 40define i32 @va1(i8* %fmt, ...) { 41; ILP32-ILP32F-FPELIM-LABEL: va1: 42; ILP32-ILP32F-FPELIM: # %bb.0: 43; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 44; ILP32-ILP32F-FPELIM-NEXT: .cfi_def_cfa_offset 48 45; ILP32-ILP32F-FPELIM-NEXT: mv a0, a1 46; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 47; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 48; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 49; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 50; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 51; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 52; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 53; ILP32-ILP32F-FPELIM-NEXT: addi a1, sp, 24 54; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 55; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 56; ILP32-ILP32F-FPELIM-NEXT: ret 57; 58; ILP32-ILP32F-WITHFP-LABEL: va1: 59; ILP32-ILP32F-WITHFP: # %bb.0: 60; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 61; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa_offset 48 62; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 63; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 64; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset ra, -36 65; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset s0, -40 66; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 67; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 32 68; ILP32-ILP32F-WITHFP-NEXT: mv a0, a1 69; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 70; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 71; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 72; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 73; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 74; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 75; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 76; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 8 77; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 78; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 79; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 80; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 81; ILP32-ILP32F-WITHFP-NEXT: ret 82; 83; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1: 84; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 85; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 86; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: .cfi_def_cfa_offset 48 87; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a0, a1 88; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 89; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 90; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 91; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 92; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 93; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 94; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 95; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, sp, 24 96; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 97; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 98; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 99; 100; LP64-LP64F-LP64D-FPELIM-LABEL: va1: 101; LP64-LP64F-LP64D-FPELIM: # %bb.0: 102; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 103; LP64-LP64F-LP64D-FPELIM-NEXT: .cfi_def_cfa_offset 80 104; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 105; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 106; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 107; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 108; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 109; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 110; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 111; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 28 112; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 113; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 24(sp) 114; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 115; LP64-LP64F-LP64D-FPELIM-NEXT: ret 116; 117; LP64-LP64F-LP64D-WITHFP-LABEL: va1: 118; LP64-LP64F-LP64D-WITHFP: # %bb.0: 119; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 120; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa_offset 96 121; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 122; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 123; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset ra, -72 124; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset s0, -80 125; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 126; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 64 127; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 128; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 129; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 130; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 131; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 132; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 133; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 134; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 12 135; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -24(s0) 136; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, 8(s0) 137; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 138; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 139; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 140; LP64-LP64F-LP64D-WITHFP-NEXT: ret 141 %va = alloca i8*, align 4 142 %1 = bitcast i8** %va to i8* 143 call void @llvm.va_start(i8* %1) 144 %argp.cur = load i8*, i8** %va, align 4 145 %argp.next = getelementptr inbounds i8, i8* %argp.cur, i32 4 146 store i8* %argp.next, i8** %va, align 4 147 %2 = bitcast i8* %argp.cur to i32* 148 %3 = load i32, i32* %2, align 4 149 call void @llvm.va_end(i8* %1) 150 ret i32 %3 151} 152 153define i32 @va1_va_arg(i8* %fmt, ...) nounwind { 154; ILP32-ILP32F-FPELIM-LABEL: va1_va_arg: 155; ILP32-ILP32F-FPELIM: # %bb.0: 156; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 157; ILP32-ILP32F-FPELIM-NEXT: mv a0, a1 158; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 159; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 160; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 161; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 162; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 163; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 164; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 165; ILP32-ILP32F-FPELIM-NEXT: addi a1, sp, 24 166; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 167; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 168; ILP32-ILP32F-FPELIM-NEXT: ret 169; 170; ILP32-ILP32F-WITHFP-LABEL: va1_va_arg: 171; ILP32-ILP32F-WITHFP: # %bb.0: 172; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 173; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 174; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 175; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 176; ILP32-ILP32F-WITHFP-NEXT: mv a0, a1 177; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 178; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 179; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 180; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 181; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 182; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 183; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 184; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 8 185; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 186; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 187; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 188; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 189; ILP32-ILP32F-WITHFP-NEXT: ret 190; 191; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_va_arg: 192; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 193; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 194; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a0, a1 195; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 196; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 197; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 198; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 199; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 200; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 201; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 202; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, sp, 24 203; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 204; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 205; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 206; 207; LP64-LP64F-LP64D-FPELIM-LABEL: va1_va_arg: 208; LP64-LP64F-LP64D-FPELIM: # %bb.0: 209; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 210; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, a1 211; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 212; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 213; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 214; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 215; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 216; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 217; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 218; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, sp, 32 219; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 220; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 221; LP64-LP64F-LP64D-FPELIM-NEXT: ret 222; 223; LP64-LP64F-LP64D-WITHFP-LABEL: va1_va_arg: 224; LP64-LP64F-LP64D-WITHFP: # %bb.0: 225; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 226; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 227; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 228; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 229; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, a1 230; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 231; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 232; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 233; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 234; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 235; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 236; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 237; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, s0, 16 238; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 239; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 240; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 241; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 242; LP64-LP64F-LP64D-WITHFP-NEXT: ret 243 %va = alloca i8*, align 4 244 %1 = bitcast i8** %va to i8* 245 call void @llvm.va_start(i8* %1) 246 %2 = va_arg i8** %va, i32 247 call void @llvm.va_end(i8* %1) 248 ret i32 %2 249} 250 251; Ensure the adjustment when restoring the stack pointer using the frame 252; pointer is correct 253define i32 @va1_va_arg_alloca(i8* %fmt, ...) nounwind { 254; ILP32-ILP32F-FPELIM-LABEL: va1_va_arg_alloca: 255; ILP32-ILP32F-FPELIM: # %bb.0: 256; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 257; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 258; ILP32-ILP32F-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 259; ILP32-ILP32F-FPELIM-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 260; ILP32-ILP32F-FPELIM-NEXT: addi s0, sp, 16 261; ILP32-ILP32F-FPELIM-NEXT: mv s1, a1 262; ILP32-ILP32F-FPELIM-NEXT: sw a7, 28(s0) 263; ILP32-ILP32F-FPELIM-NEXT: sw a6, 24(s0) 264; ILP32-ILP32F-FPELIM-NEXT: sw a5, 20(s0) 265; ILP32-ILP32F-FPELIM-NEXT: sw a4, 16(s0) 266; ILP32-ILP32F-FPELIM-NEXT: sw a3, 12(s0) 267; ILP32-ILP32F-FPELIM-NEXT: sw a2, 8(s0) 268; ILP32-ILP32F-FPELIM-NEXT: sw a1, 4(s0) 269; ILP32-ILP32F-FPELIM-NEXT: addi a0, s0, 8 270; ILP32-ILP32F-FPELIM-NEXT: sw a0, -16(s0) 271; ILP32-ILP32F-FPELIM-NEXT: addi a0, a1, 15 272; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -16 273; ILP32-ILP32F-FPELIM-NEXT: sub a0, sp, a0 274; ILP32-ILP32F-FPELIM-NEXT: mv sp, a0 275; ILP32-ILP32F-FPELIM-NEXT: call notdead@plt 276; ILP32-ILP32F-FPELIM-NEXT: mv a0, s1 277; ILP32-ILP32F-FPELIM-NEXT: addi sp, s0, -16 278; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 279; ILP32-ILP32F-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 280; ILP32-ILP32F-FPELIM-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 281; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 282; ILP32-ILP32F-FPELIM-NEXT: ret 283; 284; ILP32-ILP32F-WITHFP-LABEL: va1_va_arg_alloca: 285; ILP32-ILP32F-WITHFP: # %bb.0: 286; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 287; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 288; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 289; ILP32-ILP32F-WITHFP-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 290; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 291; ILP32-ILP32F-WITHFP-NEXT: mv s1, a1 292; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 293; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 294; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 295; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 296; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 297; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 298; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 299; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 8 300; ILP32-ILP32F-WITHFP-NEXT: sw a0, -16(s0) 301; ILP32-ILP32F-WITHFP-NEXT: addi a0, a1, 15 302; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -16 303; ILP32-ILP32F-WITHFP-NEXT: sub a0, sp, a0 304; ILP32-ILP32F-WITHFP-NEXT: mv sp, a0 305; ILP32-ILP32F-WITHFP-NEXT: call notdead@plt 306; ILP32-ILP32F-WITHFP-NEXT: mv a0, s1 307; ILP32-ILP32F-WITHFP-NEXT: addi sp, s0, -16 308; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 309; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 310; ILP32-ILP32F-WITHFP-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 311; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 312; ILP32-ILP32F-WITHFP-NEXT: ret 313; 314; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_va_arg_alloca: 315; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 316; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 317; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 318; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 319; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 320; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi s0, sp, 16 321; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv s1, a1 322; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 28(s0) 323; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 24(s0) 324; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 20(s0) 325; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 16(s0) 326; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 12(s0) 327; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 8(s0) 328; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 4(s0) 329; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, s0, 8 330; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, -16(s0) 331; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a1, 15 332; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -16 333; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sub a0, sp, a0 334; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv sp, a0 335; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call notdead@plt 336; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a0, s1 337; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, s0, -16 338; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 339; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 340; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 341; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 342; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 343; 344; LP64-LP64F-LP64D-FPELIM-LABEL: va1_va_arg_alloca: 345; LP64-LP64F-LP64D-FPELIM: # %bb.0: 346; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -96 347; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 348; LP64-LP64F-LP64D-FPELIM-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 349; LP64-LP64F-LP64D-FPELIM-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 350; LP64-LP64F-LP64D-FPELIM-NEXT: addi s0, sp, 32 351; LP64-LP64F-LP64D-FPELIM-NEXT: mv s1, a1 352; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 56(s0) 353; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 48(s0) 354; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 40(s0) 355; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 32(s0) 356; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 24(s0) 357; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 16(s0) 358; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(s0) 359; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, s0, 16 360; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, -32(s0) 361; LP64-LP64F-LP64D-FPELIM-NEXT: slli a0, a1, 32 362; LP64-LP64F-LP64D-FPELIM-NEXT: srli a0, a0, 32 363; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 15 364; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -16 365; LP64-LP64F-LP64D-FPELIM-NEXT: sub a0, sp, a0 366; LP64-LP64F-LP64D-FPELIM-NEXT: mv sp, a0 367; LP64-LP64F-LP64D-FPELIM-NEXT: call notdead@plt 368; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, s1 369; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, s0, -32 370; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 371; LP64-LP64F-LP64D-FPELIM-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 372; LP64-LP64F-LP64D-FPELIM-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 373; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 96 374; LP64-LP64F-LP64D-FPELIM-NEXT: ret 375; 376; LP64-LP64F-LP64D-WITHFP-LABEL: va1_va_arg_alloca: 377; LP64-LP64F-LP64D-WITHFP: # %bb.0: 378; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 379; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 380; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 381; LP64-LP64F-LP64D-WITHFP-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 382; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 383; LP64-LP64F-LP64D-WITHFP-NEXT: mv s1, a1 384; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 385; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 386; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 387; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 388; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 389; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 390; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 391; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 16 392; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -32(s0) 393; LP64-LP64F-LP64D-WITHFP-NEXT: slli a0, a1, 32 394; LP64-LP64F-LP64D-WITHFP-NEXT: srli a0, a0, 32 395; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 15 396; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -16 397; LP64-LP64F-LP64D-WITHFP-NEXT: sub a0, sp, a0 398; LP64-LP64F-LP64D-WITHFP-NEXT: mv sp, a0 399; LP64-LP64F-LP64D-WITHFP-NEXT: call notdead@plt 400; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, s1 401; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, s0, -32 402; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 403; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 404; LP64-LP64F-LP64D-WITHFP-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 405; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 406; LP64-LP64F-LP64D-WITHFP-NEXT: ret 407 %va = alloca i8*, align 4 408 %1 = bitcast i8** %va to i8* 409 call void @llvm.va_start(i8* %1) 410 %2 = va_arg i8** %va, i32 411 %3 = alloca i8, i32 %2 412 call void @notdead(i8* %3) 413 call void @llvm.va_end(i8* %1) 414 ret i32 %2 415} 416 417define void @va1_caller() nounwind { 418; Pass a double, as a float would be promoted by a C/C++ frontend 419; ILP32-ILP32F-FPELIM-LABEL: va1_caller: 420; ILP32-ILP32F-FPELIM: # %bb.0: 421; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -16 422; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 423; ILP32-ILP32F-FPELIM-NEXT: lui a3, 261888 424; ILP32-ILP32F-FPELIM-NEXT: li a4, 2 425; ILP32-ILP32F-FPELIM-NEXT: li a2, 0 426; ILP32-ILP32F-FPELIM-NEXT: call va1@plt 427; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 428; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 16 429; ILP32-ILP32F-FPELIM-NEXT: ret 430; 431; ILP32-ILP32F-WITHFP-LABEL: va1_caller: 432; ILP32-ILP32F-WITHFP: # %bb.0: 433; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -16 434; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 435; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 436; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 437; ILP32-ILP32F-WITHFP-NEXT: lui a3, 261888 438; ILP32-ILP32F-WITHFP-NEXT: li a4, 2 439; ILP32-ILP32F-WITHFP-NEXT: li a2, 0 440; ILP32-ILP32F-WITHFP-NEXT: call va1@plt 441; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 442; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 443; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 16 444; ILP32-ILP32F-WITHFP-NEXT: ret 445; 446; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_caller: 447; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 448; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -16 449; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 450; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a3, 261888 451; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a4, 2 452; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a2, 0 453; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va1@plt 454; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 455; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 16 456; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 457; 458; LP64-LP64F-LP64D-FPELIM-LABEL: va1_caller: 459; LP64-LP64F-LP64D-FPELIM: # %bb.0: 460; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -16 461; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 462; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1023 463; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a0, 52 464; LP64-LP64F-LP64D-FPELIM-NEXT: li a2, 2 465; LP64-LP64F-LP64D-FPELIM-NEXT: call va1@plt 466; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 467; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 16 468; LP64-LP64F-LP64D-FPELIM-NEXT: ret 469; 470; LP64-LP64F-LP64D-WITHFP-LABEL: va1_caller: 471; LP64-LP64F-LP64D-WITHFP: # %bb.0: 472; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -16 473; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 474; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 475; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 16 476; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1023 477; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a0, 52 478; LP64-LP64F-LP64D-WITHFP-NEXT: li a2, 2 479; LP64-LP64F-LP64D-WITHFP-NEXT: call va1@plt 480; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 481; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 482; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 16 483; LP64-LP64F-LP64D-WITHFP-NEXT: ret 484 %1 = call i32 (i8*, ...) @va1(i8* undef, double 1.0, i32 2) 485 ret void 486} 487 488; Ensure that 2x xlen size+alignment varargs are accessed via an "aligned" 489; register pair (where the first register is even-numbered). 490 491define i64 @va2(i8 *%fmt, ...) nounwind { 492; ILP32-ILP32F-FPELIM-LABEL: va2: 493; ILP32-ILP32F-FPELIM: # %bb.0: 494; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 495; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 496; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 497; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 498; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 499; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 500; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 501; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 502; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 27 503; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -8 504; ILP32-ILP32F-FPELIM-NEXT: addi a1, sp, 35 505; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 506; ILP32-ILP32F-FPELIM-NEXT: lw a1, 4(a0) 507; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a0) 508; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 509; ILP32-ILP32F-FPELIM-NEXT: ret 510; 511; ILP32-ILP32F-WITHFP-LABEL: va2: 512; ILP32-ILP32F-WITHFP: # %bb.0: 513; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 514; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 515; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 516; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 517; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 518; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 519; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 520; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 521; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 522; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 523; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 524; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 525; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -8 526; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 19 527; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 528; ILP32-ILP32F-WITHFP-NEXT: lw a1, 4(a0) 529; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a0) 530; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 531; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 532; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 533; ILP32-ILP32F-WITHFP-NEXT: ret 534; 535; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2: 536; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 537; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 538; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 539; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 540; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 541; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 542; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 543; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 544; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 545; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 27 546; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 547; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, sp, 35 548; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 549; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 4(a0) 550; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(a0) 551; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 552; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 553; 554; LP64-LP64F-LP64D-FPELIM-LABEL: va2: 555; LP64-LP64F-LP64D-FPELIM: # %bb.0: 556; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 557; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 558; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 559; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 560; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 561; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 562; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 563; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 564; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 24 565; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 566; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 8(sp) 567; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 7 568; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a0, 32 569; LP64-LP64F-LP64D-FPELIM-NEXT: srli a1, a1, 32 570; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a1, 8 571; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 572; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 1 573; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a1, 32 574; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a1, -8 575; LP64-LP64F-LP64D-FPELIM-NEXT: and a0, a0, a1 576; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 577; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 578; LP64-LP64F-LP64D-FPELIM-NEXT: ret 579; 580; LP64-LP64F-LP64D-WITHFP-LABEL: va2: 581; LP64-LP64F-LP64D-WITHFP: # %bb.0: 582; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 583; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 584; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 585; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 586; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 587; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 588; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 589; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 590; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 591; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 592; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 593; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 8 594; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -24(s0) 595; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, -24(s0) 596; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 7 597; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a0, 32 598; LP64-LP64F-LP64D-WITHFP-NEXT: srli a1, a1, 32 599; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a1, 8 600; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 601; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 1 602; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a1, 32 603; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a1, -8 604; LP64-LP64F-LP64D-WITHFP-NEXT: and a0, a0, a1 605; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 606; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 607; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 608; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 609; LP64-LP64F-LP64D-WITHFP-NEXT: ret 610 %va = alloca i8*, align 4 611 %1 = bitcast i8** %va to i8* 612 call void @llvm.va_start(i8* %1) 613 %2 = bitcast i8** %va to i32* 614 %argp.cur = load i32, i32* %2, align 4 615 %3 = add i32 %argp.cur, 7 616 %4 = and i32 %3, -8 617 %argp.cur.aligned = inttoptr i32 %3 to i8* 618 %argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8 619 store i8* %argp.next, i8** %va, align 4 620 %5 = inttoptr i32 %4 to double* 621 %6 = load double, double* %5, align 8 622 %7 = bitcast double %6 to i64 623 call void @llvm.va_end(i8* %1) 624 ret i64 %7 625} 626 627define i64 @va2_va_arg(i8 *%fmt, ...) nounwind { 628; ILP32-ILP32F-FPELIM-LABEL: va2_va_arg: 629; ILP32-ILP32F-FPELIM: # %bb.0: 630; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 631; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 632; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 633; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 634; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 635; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 636; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 637; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 638; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 27 639; ILP32-ILP32F-FPELIM-NEXT: andi a1, a0, -8 640; ILP32-ILP32F-FPELIM-NEXT: ori a0, a1, 4 641; ILP32-ILP32F-FPELIM-NEXT: sw a0, 12(sp) 642; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a1) 643; ILP32-ILP32F-FPELIM-NEXT: addi a2, a1, 8 644; ILP32-ILP32F-FPELIM-NEXT: sw a2, 12(sp) 645; ILP32-ILP32F-FPELIM-NEXT: lw a1, 4(a1) 646; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 647; ILP32-ILP32F-FPELIM-NEXT: ret 648; 649; ILP32-ILP32F-WITHFP-LABEL: va2_va_arg: 650; ILP32-ILP32F-WITHFP: # %bb.0: 651; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 652; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 653; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 654; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 655; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 656; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 657; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 658; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 659; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 660; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 661; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 662; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 663; ILP32-ILP32F-WITHFP-NEXT: andi a1, a0, -8 664; ILP32-ILP32F-WITHFP-NEXT: ori a0, a1, 4 665; ILP32-ILP32F-WITHFP-NEXT: sw a0, -12(s0) 666; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a1) 667; ILP32-ILP32F-WITHFP-NEXT: addi a2, a1, 8 668; ILP32-ILP32F-WITHFP-NEXT: sw a2, -12(s0) 669; ILP32-ILP32F-WITHFP-NEXT: lw a1, 4(a1) 670; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 671; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 672; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 673; ILP32-ILP32F-WITHFP-NEXT: ret 674; 675; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_va_arg: 676; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 677; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 678; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 679; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 680; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 681; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 682; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 683; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 684; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 685; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 27 686; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 687; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a0, 8 688; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 689; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fld ft0, 0(a0) 690; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fsd ft0, 0(sp) 691; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(sp) 692; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 4(sp) 693; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 694; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 695; 696; LP64-LP64F-LP64D-FPELIM-LABEL: va2_va_arg: 697; LP64-LP64F-LP64D-FPELIM: # %bb.0: 698; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 699; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, a1 700; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 701; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 702; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 703; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 704; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 705; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 706; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 707; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, sp, 32 708; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 709; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 710; LP64-LP64F-LP64D-FPELIM-NEXT: ret 711; 712; LP64-LP64F-LP64D-WITHFP-LABEL: va2_va_arg: 713; LP64-LP64F-LP64D-WITHFP: # %bb.0: 714; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 715; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 716; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 717; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 718; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, a1 719; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 720; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 721; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 722; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 723; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 724; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 725; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 726; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, s0, 16 727; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 728; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 729; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 730; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 731; LP64-LP64F-LP64D-WITHFP-NEXT: ret 732 %va = alloca i8*, align 4 733 %1 = bitcast i8** %va to i8* 734 call void @llvm.va_start(i8* %1) 735 %2 = va_arg i8** %va, double 736 call void @llvm.va_end(i8* %1) 737 %3 = bitcast double %2 to i64 738 ret i64 %3 739} 740 741define void @va2_caller() nounwind { 742; ILP32-ILP32F-FPELIM-LABEL: va2_caller: 743; ILP32-ILP32F-FPELIM: # %bb.0: 744; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -16 745; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 746; ILP32-ILP32F-FPELIM-NEXT: lui a3, 261888 747; ILP32-ILP32F-FPELIM-NEXT: li a2, 0 748; ILP32-ILP32F-FPELIM-NEXT: call va2@plt 749; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 750; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 16 751; ILP32-ILP32F-FPELIM-NEXT: ret 752; 753; ILP32-ILP32F-WITHFP-LABEL: va2_caller: 754; ILP32-ILP32F-WITHFP: # %bb.0: 755; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -16 756; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 757; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 758; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 759; ILP32-ILP32F-WITHFP-NEXT: lui a3, 261888 760; ILP32-ILP32F-WITHFP-NEXT: li a2, 0 761; ILP32-ILP32F-WITHFP-NEXT: call va2@plt 762; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 763; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 764; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 16 765; ILP32-ILP32F-WITHFP-NEXT: ret 766; 767; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_caller: 768; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 769; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -16 770; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 771; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a3, 261888 772; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a2, 0 773; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va2@plt 774; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 775; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 16 776; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 777; 778; LP64-LP64F-LP64D-FPELIM-LABEL: va2_caller: 779; LP64-LP64F-LP64D-FPELIM: # %bb.0: 780; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -16 781; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 782; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1023 783; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a0, 52 784; LP64-LP64F-LP64D-FPELIM-NEXT: call va2@plt 785; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 786; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 16 787; LP64-LP64F-LP64D-FPELIM-NEXT: ret 788; 789; LP64-LP64F-LP64D-WITHFP-LABEL: va2_caller: 790; LP64-LP64F-LP64D-WITHFP: # %bb.0: 791; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -16 792; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 793; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 794; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 16 795; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1023 796; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a0, 52 797; LP64-LP64F-LP64D-WITHFP-NEXT: call va2@plt 798; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 799; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 800; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 16 801; LP64-LP64F-LP64D-WITHFP-NEXT: ret 802 %1 = call i64 (i8*, ...) @va2(i8* undef, double 1.000000e+00) 803 ret void 804} 805 806; On RV32, Ensure a named 2*xlen argument is passed in a1 and a2, while the 807; vararg double is passed in a4 and a5 (rather than a3 and a4) 808 809define i64 @va3(i32 %a, i64 %b, ...) nounwind { 810; ILP32-ILP32F-FPELIM-LABEL: va3: 811; ILP32-ILP32F-FPELIM: # %bb.0: 812; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -32 813; ILP32-ILP32F-FPELIM-NEXT: sw a7, 28(sp) 814; ILP32-ILP32F-FPELIM-NEXT: sw a6, 24(sp) 815; ILP32-ILP32F-FPELIM-NEXT: sw a5, 20(sp) 816; ILP32-ILP32F-FPELIM-NEXT: sw a4, 16(sp) 817; ILP32-ILP32F-FPELIM-NEXT: sw a3, 12(sp) 818; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 19 819; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -8 820; ILP32-ILP32F-FPELIM-NEXT: addi a3, sp, 27 821; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 822; ILP32-ILP32F-FPELIM-NEXT: lw a3, 4(a0) 823; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a0) 824; ILP32-ILP32F-FPELIM-NEXT: add a2, a2, a3 825; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a0 826; ILP32-ILP32F-FPELIM-NEXT: sltu a1, a0, a1 827; ILP32-ILP32F-FPELIM-NEXT: add a1, a2, a1 828; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 32 829; ILP32-ILP32F-FPELIM-NEXT: ret 830; 831; ILP32-ILP32F-WITHFP-LABEL: va3: 832; ILP32-ILP32F-WITHFP: # %bb.0: 833; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 834; ILP32-ILP32F-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill 835; ILP32-ILP32F-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill 836; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 24 837; ILP32-ILP32F-WITHFP-NEXT: sw a7, 20(s0) 838; ILP32-ILP32F-WITHFP-NEXT: sw a6, 16(s0) 839; ILP32-ILP32F-WITHFP-NEXT: sw a5, 12(s0) 840; ILP32-ILP32F-WITHFP-NEXT: sw a4, 8(s0) 841; ILP32-ILP32F-WITHFP-NEXT: sw a3, 4(s0) 842; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 843; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -8 844; ILP32-ILP32F-WITHFP-NEXT: addi a3, s0, 19 845; ILP32-ILP32F-WITHFP-NEXT: sw a3, -12(s0) 846; ILP32-ILP32F-WITHFP-NEXT: lw a3, 4(a0) 847; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a0) 848; ILP32-ILP32F-WITHFP-NEXT: add a2, a2, a3 849; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a0 850; ILP32-ILP32F-WITHFP-NEXT: sltu a1, a0, a1 851; ILP32-ILP32F-WITHFP-NEXT: add a1, a2, a1 852; ILP32-ILP32F-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload 853; ILP32-ILP32F-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload 854; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 855; ILP32-ILP32F-WITHFP-NEXT: ret 856; 857; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3: 858; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 859; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -32 860; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 28(sp) 861; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 24(sp) 862; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 20(sp) 863; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 16(sp) 864; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 12(sp) 865; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 19 866; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 867; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, sp, 27 868; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 4(sp) 869; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a3, 4(a0) 870; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(a0) 871; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, a2, a3 872; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a0 873; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sltu a1, a0, a1 874; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a2, a1 875; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 32 876; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 877; 878; LP64-LP64F-LP64D-FPELIM-LABEL: va3: 879; LP64-LP64F-LP64D-FPELIM: # %bb.0: 880; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -64 881; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 56(sp) 882; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 48(sp) 883; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 40(sp) 884; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 32(sp) 885; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 24(sp) 886; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 16 887; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 888; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 8(sp) 889; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 16(sp) 890; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 7 891; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a0, 32 892; LP64-LP64F-LP64D-FPELIM-NEXT: srli a2, a2, 32 893; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a2, 8 894; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 8(sp) 895; LP64-LP64F-LP64D-FPELIM-NEXT: li a2, 1 896; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a2, 32 897; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a2, -8 898; LP64-LP64F-LP64D-FPELIM-NEXT: and a0, a0, a2 899; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 900; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, a1, a0 901; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 64 902; LP64-LP64F-LP64D-FPELIM-NEXT: ret 903; 904; LP64-LP64F-LP64D-WITHFP-LABEL: va3: 905; LP64-LP64F-LP64D-WITHFP: # %bb.0: 906; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -80 907; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 908; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 909; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 910; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 40(s0) 911; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 32(s0) 912; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 24(s0) 913; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 16(s0) 914; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 8(s0) 915; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, s0 916; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -24(s0) 917; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, -24(s0) 918; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 0(s0) 919; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 7 920; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a0, 32 921; LP64-LP64F-LP64D-WITHFP-NEXT: srli a2, a2, 32 922; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a2, 8 923; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, -24(s0) 924; LP64-LP64F-LP64D-WITHFP-NEXT: li a2, 1 925; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a2, 32 926; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a2, -8 927; LP64-LP64F-LP64D-WITHFP-NEXT: and a0, a0, a2 928; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 929; LP64-LP64F-LP64D-WITHFP-NEXT: add a0, a1, a0 930; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 931; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 932; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 80 933; LP64-LP64F-LP64D-WITHFP-NEXT: ret 934 %va = alloca i8*, align 4 935 %1 = bitcast i8** %va to i8* 936 call void @llvm.va_start(i8* %1) 937 %2 = bitcast i8** %va to i32* 938 %argp.cur = load i32, i32* %2, align 4 939 %3 = add i32 %argp.cur, 7 940 %4 = and i32 %3, -8 941 %argp.cur.aligned = inttoptr i32 %3 to i8* 942 %argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8 943 store i8* %argp.next, i8** %va, align 4 944 %5 = inttoptr i32 %4 to double* 945 %6 = load double, double* %5, align 8 946 call void @llvm.va_end(i8* %1) 947 %7 = bitcast double %6 to i64 948 %8 = add i64 %b, %7 949 ret i64 %8 950} 951 952define i64 @va3_va_arg(i32 %a, i64 %b, ...) nounwind { 953; ILP32-ILP32F-FPELIM-LABEL: va3_va_arg: 954; ILP32-ILP32F-FPELIM: # %bb.0: 955; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -32 956; ILP32-ILP32F-FPELIM-NEXT: sw a7, 28(sp) 957; ILP32-ILP32F-FPELIM-NEXT: sw a6, 24(sp) 958; ILP32-ILP32F-FPELIM-NEXT: sw a5, 20(sp) 959; ILP32-ILP32F-FPELIM-NEXT: sw a4, 16(sp) 960; ILP32-ILP32F-FPELIM-NEXT: sw a3, 12(sp) 961; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 19 962; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -8 963; ILP32-ILP32F-FPELIM-NEXT: ori a3, a0, 4 964; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 965; ILP32-ILP32F-FPELIM-NEXT: lw a3, 0(a0) 966; ILP32-ILP32F-FPELIM-NEXT: addi a4, a0, 8 967; ILP32-ILP32F-FPELIM-NEXT: sw a4, 4(sp) 968; ILP32-ILP32F-FPELIM-NEXT: lw a4, 4(a0) 969; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a3 970; ILP32-ILP32F-FPELIM-NEXT: sltu a1, a0, a1 971; ILP32-ILP32F-FPELIM-NEXT: add a2, a2, a4 972; ILP32-ILP32F-FPELIM-NEXT: add a1, a2, a1 973; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 32 974; ILP32-ILP32F-FPELIM-NEXT: ret 975; 976; ILP32-ILP32F-WITHFP-LABEL: va3_va_arg: 977; ILP32-ILP32F-WITHFP: # %bb.0: 978; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 979; ILP32-ILP32F-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill 980; ILP32-ILP32F-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill 981; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 24 982; ILP32-ILP32F-WITHFP-NEXT: sw a7, 20(s0) 983; ILP32-ILP32F-WITHFP-NEXT: sw a6, 16(s0) 984; ILP32-ILP32F-WITHFP-NEXT: sw a5, 12(s0) 985; ILP32-ILP32F-WITHFP-NEXT: sw a4, 8(s0) 986; ILP32-ILP32F-WITHFP-NEXT: sw a3, 4(s0) 987; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 988; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -8 989; ILP32-ILP32F-WITHFP-NEXT: ori a3, a0, 4 990; ILP32-ILP32F-WITHFP-NEXT: sw a3, -12(s0) 991; ILP32-ILP32F-WITHFP-NEXT: lw a3, 0(a0) 992; ILP32-ILP32F-WITHFP-NEXT: addi a4, a0, 8 993; ILP32-ILP32F-WITHFP-NEXT: sw a4, -12(s0) 994; ILP32-ILP32F-WITHFP-NEXT: lw a4, 4(a0) 995; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a3 996; ILP32-ILP32F-WITHFP-NEXT: sltu a1, a0, a1 997; ILP32-ILP32F-WITHFP-NEXT: add a2, a2, a4 998; ILP32-ILP32F-WITHFP-NEXT: add a1, a2, a1 999; ILP32-ILP32F-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload 1000; ILP32-ILP32F-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload 1001; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 1002; ILP32-ILP32F-WITHFP-NEXT: ret 1003; 1004; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_va_arg: 1005; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1006; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1007; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1008; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1009; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1010; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1011; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1012; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 35 1013; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 1014; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a0, 8 1015; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 20(sp) 1016; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fld ft0, 0(a0) 1017; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fsd ft0, 8(sp) 1018; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 12(sp) 1019; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a3, 8(sp) 1020; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, a2, a0 1021; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a3 1022; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sltu a1, a0, a1 1023; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a2, a1 1024; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1025; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1026; 1027; LP64-LP64F-LP64D-FPELIM-LABEL: va3_va_arg: 1028; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1029; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -64 1030; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 56(sp) 1031; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 48(sp) 1032; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 40(sp) 1033; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 32(sp) 1034; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 24(sp) 1035; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 16(sp) 1036; LP64-LP64F-LP64D-FPELIM-NEXT: addi a3, sp, 24 1037; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, a1, a2 1038; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 8(sp) 1039; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 64 1040; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1041; 1042; LP64-LP64F-LP64D-WITHFP-LABEL: va3_va_arg: 1043; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1044; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -80 1045; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1046; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1047; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 1048; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 40(s0) 1049; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 32(s0) 1050; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 24(s0) 1051; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 16(s0) 1052; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 8(s0) 1053; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 0(s0) 1054; LP64-LP64F-LP64D-WITHFP-NEXT: addi a3, s0, 8 1055; LP64-LP64F-LP64D-WITHFP-NEXT: add a0, a1, a2 1056; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, -24(s0) 1057; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1058; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1059; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 80 1060; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1061 %va = alloca i8*, align 4 1062 %1 = bitcast i8** %va to i8* 1063 call void @llvm.va_start(i8* %1) 1064 %2 = va_arg i8** %va, double 1065 call void @llvm.va_end(i8* %1) 1066 %3 = bitcast double %2 to i64 1067 %4 = add i64 %b, %3 1068 ret i64 %4 1069} 1070 1071define void @va3_caller() nounwind { 1072; ILP32-ILP32F-FPELIM-LABEL: va3_caller: 1073; ILP32-ILP32F-FPELIM: # %bb.0: 1074; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -16 1075; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1076; ILP32-ILP32F-FPELIM-NEXT: li a0, 2 1077; ILP32-ILP32F-FPELIM-NEXT: li a1, 1111 1078; ILP32-ILP32F-FPELIM-NEXT: lui a5, 262144 1079; ILP32-ILP32F-FPELIM-NEXT: li a2, 0 1080; ILP32-ILP32F-FPELIM-NEXT: li a4, 0 1081; ILP32-ILP32F-FPELIM-NEXT: call va3@plt 1082; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1083; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 16 1084; ILP32-ILP32F-FPELIM-NEXT: ret 1085; 1086; ILP32-ILP32F-WITHFP-LABEL: va3_caller: 1087; ILP32-ILP32F-WITHFP: # %bb.0: 1088; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -16 1089; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1090; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1091; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 1092; ILP32-ILP32F-WITHFP-NEXT: li a0, 2 1093; ILP32-ILP32F-WITHFP-NEXT: li a1, 1111 1094; ILP32-ILP32F-WITHFP-NEXT: lui a5, 262144 1095; ILP32-ILP32F-WITHFP-NEXT: li a2, 0 1096; ILP32-ILP32F-WITHFP-NEXT: li a4, 0 1097; ILP32-ILP32F-WITHFP-NEXT: call va3@plt 1098; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1099; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1100; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 16 1101; ILP32-ILP32F-WITHFP-NEXT: ret 1102; 1103; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_caller: 1104; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1105; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -16 1106; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1107; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 2 1108; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a1, 1111 1109; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a5, 262144 1110; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a2, 0 1111; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a4, 0 1112; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va3@plt 1113; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1114; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 16 1115; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1116; 1117; LP64-LP64F-LP64D-FPELIM-LABEL: va3_caller: 1118; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1119; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -16 1120; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1121; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1 1122; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a0, 62 1123; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 2 1124; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 1111 1125; LP64-LP64F-LP64D-FPELIM-NEXT: call va3@plt 1126; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1127; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 16 1128; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1129; 1130; LP64-LP64F-LP64D-WITHFP-LABEL: va3_caller: 1131; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1132; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -16 1133; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1134; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 1135; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 16 1136; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1 1137; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a0, 62 1138; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 2 1139; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 1111 1140; LP64-LP64F-LP64D-WITHFP-NEXT: call va3@plt 1141; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1142; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 1143; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 16 1144; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1145 %1 = call i64 (i32, i64, ...) @va3(i32 2, i64 1111, double 2.000000e+00) 1146 ret void 1147} 1148 1149declare void @llvm.va_copy(i8*, i8*) 1150 1151define i32 @va4_va_copy(i32 %argno, ...) nounwind { 1152; ILP32-ILP32F-FPELIM-LABEL: va4_va_copy: 1153; ILP32-ILP32F-FPELIM: # %bb.0: 1154; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 1155; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1156; ILP32-ILP32F-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1157; ILP32-ILP32F-FPELIM-NEXT: mv s0, a1 1158; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 1159; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 1160; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 1161; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 1162; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 1163; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 1164; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 1165; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 24 1166; ILP32-ILP32F-FPELIM-NEXT: sw a0, 4(sp) 1167; ILP32-ILP32F-FPELIM-NEXT: sw a0, 0(sp) 1168; ILP32-ILP32F-FPELIM-NEXT: call notdead@plt 1169; ILP32-ILP32F-FPELIM-NEXT: lw a0, 4(sp) 1170; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 3 1171; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1172; ILP32-ILP32F-FPELIM-NEXT: addi a1, a0, 4 1173; ILP32-ILP32F-FPELIM-NEXT: sw a1, 4(sp) 1174; ILP32-ILP32F-FPELIM-NEXT: lw a1, 0(a0) 1175; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 7 1176; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1177; ILP32-ILP32F-FPELIM-NEXT: addi a2, a0, 4 1178; ILP32-ILP32F-FPELIM-NEXT: sw a2, 4(sp) 1179; ILP32-ILP32F-FPELIM-NEXT: lw a2, 0(a0) 1180; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 7 1181; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1182; ILP32-ILP32F-FPELIM-NEXT: addi a3, a0, 4 1183; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 1184; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a0) 1185; ILP32-ILP32F-FPELIM-NEXT: add a1, a1, s0 1186; ILP32-ILP32F-FPELIM-NEXT: add a1, a1, a2 1187; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a0 1188; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1189; ILP32-ILP32F-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1190; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 1191; ILP32-ILP32F-FPELIM-NEXT: ret 1192; 1193; ILP32-ILP32F-WITHFP-LABEL: va4_va_copy: 1194; ILP32-ILP32F-WITHFP: # %bb.0: 1195; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -64 1196; ILP32-ILP32F-WITHFP-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1197; ILP32-ILP32F-WITHFP-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1198; ILP32-ILP32F-WITHFP-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1199; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 32 1200; ILP32-ILP32F-WITHFP-NEXT: mv s1, a1 1201; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1202; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1203; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1204; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1205; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1206; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1207; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1208; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 8 1209; ILP32-ILP32F-WITHFP-NEXT: sw a0, -16(s0) 1210; ILP32-ILP32F-WITHFP-NEXT: sw a0, -20(s0) 1211; ILP32-ILP32F-WITHFP-NEXT: call notdead@plt 1212; ILP32-ILP32F-WITHFP-NEXT: lw a0, -16(s0) 1213; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 3 1214; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1215; ILP32-ILP32F-WITHFP-NEXT: addi a1, a0, 4 1216; ILP32-ILP32F-WITHFP-NEXT: sw a1, -16(s0) 1217; ILP32-ILP32F-WITHFP-NEXT: lw a1, 0(a0) 1218; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 7 1219; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1220; ILP32-ILP32F-WITHFP-NEXT: addi a2, a0, 4 1221; ILP32-ILP32F-WITHFP-NEXT: sw a2, -16(s0) 1222; ILP32-ILP32F-WITHFP-NEXT: lw a2, 0(a0) 1223; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 7 1224; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1225; ILP32-ILP32F-WITHFP-NEXT: addi a3, a0, 4 1226; ILP32-ILP32F-WITHFP-NEXT: sw a3, -16(s0) 1227; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a0) 1228; ILP32-ILP32F-WITHFP-NEXT: add a1, a1, s1 1229; ILP32-ILP32F-WITHFP-NEXT: add a1, a1, a2 1230; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a0 1231; ILP32-ILP32F-WITHFP-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1232; ILP32-ILP32F-WITHFP-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1233; ILP32-ILP32F-WITHFP-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1234; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 64 1235; ILP32-ILP32F-WITHFP-NEXT: ret 1236; 1237; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va4_va_copy: 1238; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1239; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1240; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1241; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1242; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv s0, a1 1243; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1244; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1245; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1246; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1247; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1248; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 1249; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 1250; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 24 1251; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 4(sp) 1252; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 0(sp) 1253; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call notdead@plt 1254; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 4(sp) 1255; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 3 1256; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1257; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a0, 4 1258; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 4(sp) 1259; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 0(a0) 1260; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 7 1261; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1262; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, a0, 4 1263; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 4(sp) 1264; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a2, 0(a0) 1265; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 7 1266; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1267; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a0, 4 1268; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 4(sp) 1269; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(a0) 1270; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a1, s0 1271; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a1, a2 1272; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a0 1273; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1274; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1275; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1276; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1277; 1278; LP64-LP64F-LP64D-FPELIM-LABEL: va4_va_copy: 1279; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1280; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -96 1281; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1282; LP64-LP64F-LP64D-FPELIM-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1283; LP64-LP64F-LP64D-FPELIM-NEXT: mv s0, a1 1284; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 88(sp) 1285; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 80(sp) 1286; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 72(sp) 1287; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 64(sp) 1288; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 56(sp) 1289; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 48(sp) 1290; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 40(sp) 1291; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 48 1292; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1293; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 0(sp) 1294; LP64-LP64F-LP64D-FPELIM-NEXT: call notdead@plt 1295; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 8(sp) 1296; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 3 1297; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1298; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a0, 8 1299; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 1300; LP64-LP64F-LP64D-FPELIM-NEXT: ld a1, 0(a0) 1301; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 11 1302; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1303; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a0, 8 1304; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 8(sp) 1305; LP64-LP64F-LP64D-FPELIM-NEXT: ld a2, 0(a0) 1306; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 11 1307; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1308; LP64-LP64F-LP64D-FPELIM-NEXT: addi a3, a0, 8 1309; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 8(sp) 1310; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 1311; LP64-LP64F-LP64D-FPELIM-NEXT: addw a1, a1, s0 1312; LP64-LP64F-LP64D-FPELIM-NEXT: addw a1, a1, a2 1313; LP64-LP64F-LP64D-FPELIM-NEXT: addw a0, a1, a0 1314; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1315; LP64-LP64F-LP64D-FPELIM-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1316; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 96 1317; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1318; 1319; LP64-LP64F-LP64D-WITHFP-LABEL: va4_va_copy: 1320; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1321; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -112 1322; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1323; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1324; LP64-LP64F-LP64D-WITHFP-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1325; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 48 1326; LP64-LP64F-LP64D-WITHFP-NEXT: mv s1, a1 1327; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1328; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1329; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1330; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1331; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1332; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1333; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1334; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 16 1335; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -32(s0) 1336; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -40(s0) 1337; LP64-LP64F-LP64D-WITHFP-NEXT: call notdead@plt 1338; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, -32(s0) 1339; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 3 1340; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1341; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a0, 8 1342; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -32(s0) 1343; LP64-LP64F-LP64D-WITHFP-NEXT: ld a1, 0(a0) 1344; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 11 1345; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1346; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a0, 8 1347; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, -32(s0) 1348; LP64-LP64F-LP64D-WITHFP-NEXT: ld a2, 0(a0) 1349; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 11 1350; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1351; LP64-LP64F-LP64D-WITHFP-NEXT: addi a3, a0, 8 1352; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, -32(s0) 1353; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 1354; LP64-LP64F-LP64D-WITHFP-NEXT: addw a1, a1, s1 1355; LP64-LP64F-LP64D-WITHFP-NEXT: addw a1, a1, a2 1356; LP64-LP64F-LP64D-WITHFP-NEXT: addw a0, a1, a0 1357; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1358; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1359; LP64-LP64F-LP64D-WITHFP-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1360; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 112 1361; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1362 %vargs = alloca i8*, align 4 1363 %wargs = alloca i8*, align 4 1364 %1 = bitcast i8** %vargs to i8* 1365 %2 = bitcast i8** %wargs to i8* 1366 call void @llvm.va_start(i8* %1) 1367 %3 = va_arg i8** %vargs, i32 1368 call void @llvm.va_copy(i8* %2, i8* %1) 1369 %4 = load i8*, i8** %wargs, align 4 1370 call void @notdead(i8* %4) 1371 %5 = va_arg i8** %vargs, i32 1372 %6 = va_arg i8** %vargs, i32 1373 %7 = va_arg i8** %vargs, i32 1374 call void @llvm.va_end(i8* %1) 1375 call void @llvm.va_end(i8* %2) 1376 %add1 = add i32 %5, %3 1377 %add2 = add i32 %add1, %6 1378 %add3 = add i32 %add2, %7 1379 ret i32 %add3 1380} 1381 1382; Check 2x*xlen values are aligned appropriately when passed on the stack in a vararg call 1383 1384declare i32 @va5_aligned_stack_callee(i32, ...) 1385 1386define void @va5_aligned_stack_caller() nounwind { 1387; The double should be 8-byte aligned on the stack, but the two-element array 1388; should only be 4-byte aligned 1389; ILP32-ILP32F-FPELIM-LABEL: va5_aligned_stack_caller: 1390; ILP32-ILP32F-FPELIM: # %bb.0: 1391; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -64 1392; ILP32-ILP32F-FPELIM-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1393; ILP32-ILP32F-FPELIM-NEXT: li a0, 17 1394; ILP32-ILP32F-FPELIM-NEXT: sw a0, 24(sp) 1395; ILP32-ILP32F-FPELIM-NEXT: li a0, 16 1396; ILP32-ILP32F-FPELIM-NEXT: sw a0, 20(sp) 1397; ILP32-ILP32F-FPELIM-NEXT: li a0, 15 1398; ILP32-ILP32F-FPELIM-NEXT: sw a0, 16(sp) 1399; ILP32-ILP32F-FPELIM-NEXT: lui a0, 262236 1400; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 655 1401; ILP32-ILP32F-FPELIM-NEXT: sw a0, 12(sp) 1402; ILP32-ILP32F-FPELIM-NEXT: lui a0, 377487 1403; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 1475 1404; ILP32-ILP32F-FPELIM-NEXT: sw a0, 8(sp) 1405; ILP32-ILP32F-FPELIM-NEXT: li a0, 14 1406; ILP32-ILP32F-FPELIM-NEXT: sw a0, 0(sp) 1407; ILP32-ILP32F-FPELIM-NEXT: lui a0, 262153 1408; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 491 1409; ILP32-ILP32F-FPELIM-NEXT: sw a0, 44(sp) 1410; ILP32-ILP32F-FPELIM-NEXT: lui a0, 545260 1411; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, -1967 1412; ILP32-ILP32F-FPELIM-NEXT: sw a0, 40(sp) 1413; ILP32-ILP32F-FPELIM-NEXT: lui a0, 964690 1414; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, -328 1415; ILP32-ILP32F-FPELIM-NEXT: sw a0, 36(sp) 1416; ILP32-ILP32F-FPELIM-NEXT: lui a0, 335544 1417; ILP32-ILP32F-FPELIM-NEXT: addi a5, a0, 1311 1418; ILP32-ILP32F-FPELIM-NEXT: lui a0, 688509 1419; ILP32-ILP32F-FPELIM-NEXT: addi a6, a0, -2048 1420; ILP32-ILP32F-FPELIM-NEXT: li a0, 1 1421; ILP32-ILP32F-FPELIM-NEXT: li a1, 11 1422; ILP32-ILP32F-FPELIM-NEXT: addi a2, sp, 32 1423; ILP32-ILP32F-FPELIM-NEXT: li a3, 12 1424; ILP32-ILP32F-FPELIM-NEXT: li a4, 13 1425; ILP32-ILP32F-FPELIM-NEXT: li a7, 4 1426; ILP32-ILP32F-FPELIM-NEXT: sw a5, 32(sp) 1427; ILP32-ILP32F-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1428; ILP32-ILP32F-FPELIM-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1429; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 64 1430; ILP32-ILP32F-FPELIM-NEXT: ret 1431; 1432; ILP32-ILP32F-WITHFP-LABEL: va5_aligned_stack_caller: 1433; ILP32-ILP32F-WITHFP: # %bb.0: 1434; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -64 1435; ILP32-ILP32F-WITHFP-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1436; ILP32-ILP32F-WITHFP-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 1437; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 64 1438; ILP32-ILP32F-WITHFP-NEXT: li a0, 17 1439; ILP32-ILP32F-WITHFP-NEXT: sw a0, 24(sp) 1440; ILP32-ILP32F-WITHFP-NEXT: li a0, 16 1441; ILP32-ILP32F-WITHFP-NEXT: sw a0, 20(sp) 1442; ILP32-ILP32F-WITHFP-NEXT: li a0, 15 1443; ILP32-ILP32F-WITHFP-NEXT: sw a0, 16(sp) 1444; ILP32-ILP32F-WITHFP-NEXT: lui a0, 262236 1445; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 655 1446; ILP32-ILP32F-WITHFP-NEXT: sw a0, 12(sp) 1447; ILP32-ILP32F-WITHFP-NEXT: lui a0, 377487 1448; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 1475 1449; ILP32-ILP32F-WITHFP-NEXT: sw a0, 8(sp) 1450; ILP32-ILP32F-WITHFP-NEXT: li a0, 14 1451; ILP32-ILP32F-WITHFP-NEXT: sw a0, 0(sp) 1452; ILP32-ILP32F-WITHFP-NEXT: lui a0, 262153 1453; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 491 1454; ILP32-ILP32F-WITHFP-NEXT: sw a0, -20(s0) 1455; ILP32-ILP32F-WITHFP-NEXT: lui a0, 545260 1456; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -1967 1457; ILP32-ILP32F-WITHFP-NEXT: sw a0, -24(s0) 1458; ILP32-ILP32F-WITHFP-NEXT: lui a0, 964690 1459; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -328 1460; ILP32-ILP32F-WITHFP-NEXT: sw a0, -28(s0) 1461; ILP32-ILP32F-WITHFP-NEXT: lui a0, 335544 1462; ILP32-ILP32F-WITHFP-NEXT: addi a5, a0, 1311 1463; ILP32-ILP32F-WITHFP-NEXT: lui a0, 688509 1464; ILP32-ILP32F-WITHFP-NEXT: addi a6, a0, -2048 1465; ILP32-ILP32F-WITHFP-NEXT: li a0, 1 1466; ILP32-ILP32F-WITHFP-NEXT: li a1, 11 1467; ILP32-ILP32F-WITHFP-NEXT: addi a2, s0, -32 1468; ILP32-ILP32F-WITHFP-NEXT: li a3, 12 1469; ILP32-ILP32F-WITHFP-NEXT: li a4, 13 1470; ILP32-ILP32F-WITHFP-NEXT: li a7, 4 1471; ILP32-ILP32F-WITHFP-NEXT: sw a5, -32(s0) 1472; ILP32-ILP32F-WITHFP-NEXT: call va5_aligned_stack_callee@plt 1473; ILP32-ILP32F-WITHFP-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1474; ILP32-ILP32F-WITHFP-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 1475; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 64 1476; ILP32-ILP32F-WITHFP-NEXT: ret 1477; 1478; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va5_aligned_stack_caller: 1479; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1480; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -64 1481; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1482; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 262236 1483; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 655 1484; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 12(sp) 1485; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 377487 1486; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 1475 1487; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 8(sp) 1488; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 17 1489; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 24(sp) 1490; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 16 1491; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 20(sp) 1492; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 15 1493; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 16(sp) 1494; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 14 1495; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 0(sp) 1496; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 262153 1497; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 491 1498; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 44(sp) 1499; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 545260 1500; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, -1967 1501; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 40(sp) 1502; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 964690 1503; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, -328 1504; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 36(sp) 1505; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 335544 1506; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a5, a0, 1311 1507; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 688509 1508; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a6, a0, -2048 1509; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 1 1510; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a1, 11 1511; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, sp, 32 1512; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a3, 12 1513; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a4, 13 1514; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a7, 4 1515; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 32(sp) 1516; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1517; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1518; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 64 1519; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1520; 1521; LP64-LP64F-LP64D-FPELIM-LABEL: va5_aligned_stack_caller: 1522; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1523; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -48 1524; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1525; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 17 1526; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 24(sp) 1527; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 16 1528; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 16(sp) 1529; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 15 1530; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1531; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_0) 1532; LP64-LP64F-LP64D-FPELIM-NEXT: ld t0, %lo(.LCPI11_0)(a0) 1533; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_1) 1534; LP64-LP64F-LP64D-FPELIM-NEXT: ld a2, %lo(.LCPI11_1)(a0) 1535; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_2) 1536; LP64-LP64F-LP64D-FPELIM-NEXT: ld a3, %lo(.LCPI11_2)(a0) 1537; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 2384 1538; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 761 1539; LP64-LP64F-LP64D-FPELIM-NEXT: slli a6, a0, 11 1540; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1 1541; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 11 1542; LP64-LP64F-LP64D-FPELIM-NEXT: li a4, 12 1543; LP64-LP64F-LP64D-FPELIM-NEXT: li a5, 13 1544; LP64-LP64F-LP64D-FPELIM-NEXT: li a7, 14 1545; LP64-LP64F-LP64D-FPELIM-NEXT: sd t0, 0(sp) 1546; LP64-LP64F-LP64D-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1547; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1548; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 48 1549; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1550; 1551; LP64-LP64F-LP64D-WITHFP-LABEL: va5_aligned_stack_caller: 1552; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1553; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -48 1554; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1555; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1556; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 48 1557; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 17 1558; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 24(sp) 1559; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 16 1560; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 16(sp) 1561; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 15 1562; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 8(sp) 1563; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_0) 1564; LP64-LP64F-LP64D-WITHFP-NEXT: ld t0, %lo(.LCPI11_0)(a0) 1565; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_1) 1566; LP64-LP64F-LP64D-WITHFP-NEXT: ld a2, %lo(.LCPI11_1)(a0) 1567; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_2) 1568; LP64-LP64F-LP64D-WITHFP-NEXT: ld a3, %lo(.LCPI11_2)(a0) 1569; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, 2384 1570; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 761 1571; LP64-LP64F-LP64D-WITHFP-NEXT: slli a6, a0, 11 1572; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1 1573; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 11 1574; LP64-LP64F-LP64D-WITHFP-NEXT: li a4, 12 1575; LP64-LP64F-LP64D-WITHFP-NEXT: li a5, 13 1576; LP64-LP64F-LP64D-WITHFP-NEXT: li a7, 14 1577; LP64-LP64F-LP64D-WITHFP-NEXT: sd t0, 0(sp) 1578; LP64-LP64F-LP64D-WITHFP-NEXT: call va5_aligned_stack_callee@plt 1579; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1580; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1581; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 48 1582; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1583 %1 = call i32 (i32, ...) @va5_aligned_stack_callee(i32 1, i32 11, 1584 fp128 0xLEB851EB851EB851F400091EB851EB851, i32 12, i32 13, i64 20000000000, 1585 i32 14, double 2.720000e+00, i32 15, [2 x i32] [i32 16, i32 17]) 1586 ret void 1587} 1588 1589; A function with no fixed arguments is not valid C, but can be 1590; specified in LLVM IR. We must ensure the vararg save area is 1591; still set up correctly. 1592 1593define i32 @va6_no_fixed_args(...) nounwind { 1594; ILP32-ILP32F-FPELIM-LABEL: va6_no_fixed_args: 1595; ILP32-ILP32F-FPELIM: # %bb.0: 1596; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 1597; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 1598; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 1599; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 1600; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 1601; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 1602; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 1603; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 1604; ILP32-ILP32F-FPELIM-NEXT: sw a0, 16(sp) 1605; ILP32-ILP32F-FPELIM-NEXT: addi a1, sp, 20 1606; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 1607; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 1608; ILP32-ILP32F-FPELIM-NEXT: ret 1609; 1610; ILP32-ILP32F-WITHFP-LABEL: va6_no_fixed_args: 1611; ILP32-ILP32F-WITHFP: # %bb.0: 1612; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 1613; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1614; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1615; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 1616; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1617; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1618; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1619; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1620; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1621; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1622; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1623; ILP32-ILP32F-WITHFP-NEXT: sw a0, 0(s0) 1624; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 4 1625; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 1626; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1627; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1628; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 1629; ILP32-ILP32F-WITHFP-NEXT: ret 1630; 1631; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va6_no_fixed_args: 1632; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1633; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1634; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1635; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1636; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1637; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1638; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1639; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 1640; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 1641; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 16(sp) 1642; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, sp, 20 1643; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 1644; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1645; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1646; 1647; LP64-LP64F-LP64D-FPELIM-LABEL: va6_no_fixed_args: 1648; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1649; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 1650; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 1651; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 1652; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 1653; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 1654; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 1655; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 1656; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 1657; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 16(sp) 1658; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, sp, 24 1659; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 1660; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 1661; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1662; 1663; LP64-LP64F-LP64D-WITHFP-LABEL: va6_no_fixed_args: 1664; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1665; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 1666; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1667; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1668; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 1669; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1670; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1671; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1672; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1673; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1674; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1675; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1676; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 0(s0) 1677; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, s0, 8 1678; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 1679; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1680; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1681; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 1682; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1683 %va = alloca i8*, align 4 1684 %1 = bitcast i8** %va to i8* 1685 call void @llvm.va_start(i8* %1) 1686 %2 = va_arg i8** %va, i32 1687 call void @llvm.va_end(i8* %1) 1688 ret i32 %2 1689} 1690 1691; TODO: improve constant materialization of stack addresses 1692 1693define i32 @va_large_stack(i8* %fmt, ...) { 1694; ILP32-ILP32F-FPELIM-LABEL: va_large_stack: 1695; ILP32-ILP32F-FPELIM: # %bb.0: 1696; ILP32-ILP32F-FPELIM-NEXT: lui a0, 24414 1697; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 304 1698; ILP32-ILP32F-FPELIM-NEXT: sub sp, sp, a0 1699; ILP32-ILP32F-FPELIM-NEXT: .cfi_def_cfa_offset 100000048 1700; ILP32-ILP32F-FPELIM-NEXT: mv a0, a1 1701; ILP32-ILP32F-FPELIM-NEXT: lui t0, 24414 1702; ILP32-ILP32F-FPELIM-NEXT: addi t0, t0, 300 1703; ILP32-ILP32F-FPELIM-NEXT: add t0, sp, t0 1704; ILP32-ILP32F-FPELIM-NEXT: sw a7, 0(t0) 1705; ILP32-ILP32F-FPELIM-NEXT: lui a7, 24414 1706; ILP32-ILP32F-FPELIM-NEXT: addi a7, a7, 296 1707; ILP32-ILP32F-FPELIM-NEXT: add a7, sp, a7 1708; ILP32-ILP32F-FPELIM-NEXT: sw a6, 0(a7) 1709; ILP32-ILP32F-FPELIM-NEXT: lui a6, 24414 1710; ILP32-ILP32F-FPELIM-NEXT: addi a6, a6, 292 1711; ILP32-ILP32F-FPELIM-NEXT: add a6, sp, a6 1712; ILP32-ILP32F-FPELIM-NEXT: sw a5, 0(a6) 1713; ILP32-ILP32F-FPELIM-NEXT: lui a5, 24414 1714; ILP32-ILP32F-FPELIM-NEXT: addi a5, a5, 288 1715; ILP32-ILP32F-FPELIM-NEXT: add a5, sp, a5 1716; ILP32-ILP32F-FPELIM-NEXT: sw a4, 0(a5) 1717; ILP32-ILP32F-FPELIM-NEXT: lui a4, 24414 1718; ILP32-ILP32F-FPELIM-NEXT: addi a4, a4, 284 1719; ILP32-ILP32F-FPELIM-NEXT: add a4, sp, a4 1720; ILP32-ILP32F-FPELIM-NEXT: sw a3, 0(a4) 1721; ILP32-ILP32F-FPELIM-NEXT: lui a3, 24414 1722; ILP32-ILP32F-FPELIM-NEXT: addi a3, a3, 280 1723; ILP32-ILP32F-FPELIM-NEXT: add a3, sp, a3 1724; ILP32-ILP32F-FPELIM-NEXT: sw a2, 0(a3) 1725; ILP32-ILP32F-FPELIM-NEXT: lui a2, 24414 1726; ILP32-ILP32F-FPELIM-NEXT: addi a2, a2, 276 1727; ILP32-ILP32F-FPELIM-NEXT: add a2, sp, a2 1728; ILP32-ILP32F-FPELIM-NEXT: sw a1, 0(a2) 1729; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 1730; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 280 1731; ILP32-ILP32F-FPELIM-NEXT: add a1, sp, a1 1732; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 1733; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 1734; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 304 1735; ILP32-ILP32F-FPELIM-NEXT: add sp, sp, a1 1736; ILP32-ILP32F-FPELIM-NEXT: ret 1737; 1738; ILP32-ILP32F-WITHFP-LABEL: va_large_stack: 1739; ILP32-ILP32F-WITHFP: # %bb.0: 1740; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -2032 1741; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa_offset 2032 1742; ILP32-ILP32F-WITHFP-NEXT: sw ra, 1996(sp) # 4-byte Folded Spill 1743; ILP32-ILP32F-WITHFP-NEXT: sw s0, 1992(sp) # 4-byte Folded Spill 1744; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset ra, -36 1745; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset s0, -40 1746; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 2000 1747; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 32 1748; ILP32-ILP32F-WITHFP-NEXT: lui a0, 24414 1749; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -1728 1750; ILP32-ILP32F-WITHFP-NEXT: sub sp, sp, a0 1751; ILP32-ILP32F-WITHFP-NEXT: mv a0, a1 1752; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1753; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1754; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1755; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1756; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1757; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1758; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1759; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 8 1760; ILP32-ILP32F-WITHFP-NEXT: lui a2, 1024162 1761; ILP32-ILP32F-WITHFP-NEXT: addi a2, a2, -272 1762; ILP32-ILP32F-WITHFP-NEXT: add a2, s0, a2 1763; ILP32-ILP32F-WITHFP-NEXT: sw a1, 0(a2) 1764; ILP32-ILP32F-WITHFP-NEXT: lui a1, 24414 1765; ILP32-ILP32F-WITHFP-NEXT: addi a1, a1, -1728 1766; ILP32-ILP32F-WITHFP-NEXT: add sp, sp, a1 1767; ILP32-ILP32F-WITHFP-NEXT: lw ra, 1996(sp) # 4-byte Folded Reload 1768; ILP32-ILP32F-WITHFP-NEXT: lw s0, 1992(sp) # 4-byte Folded Reload 1769; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 2032 1770; ILP32-ILP32F-WITHFP-NEXT: ret 1771; 1772; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va_large_stack: 1773; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1774; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 24414 1775; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 304 1776; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sub sp, sp, a0 1777; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: .cfi_def_cfa_offset 100000048 1778; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a0, a1 1779; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui t0, 24414 1780; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi t0, t0, 300 1781; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add t0, sp, t0 1782; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 0(t0) 1783; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a7, 24414 1784; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a7, a7, 296 1785; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a7, sp, a7 1786; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 0(a7) 1787; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a6, 24414 1788; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a6, a6, 292 1789; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a6, sp, a6 1790; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 0(a6) 1791; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a5, 24414 1792; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a5, a5, 288 1793; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a5, sp, a5 1794; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 0(a5) 1795; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a4, 24414 1796; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a4, a4, 284 1797; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a4, sp, a4 1798; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 0(a4) 1799; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a3, 24414 1800; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a3, 280 1801; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a3, sp, a3 1802; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 0(a3) 1803; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a2, 24414 1804; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, a2, 276 1805; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, sp, a2 1806; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 0(a2) 1807; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 1808; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 280 1809; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, sp, a1 1810; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 1811; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 1812; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 304 1813; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add sp, sp, a1 1814; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1815; 1816; LP64-LP64F-LP64D-FPELIM-LABEL: va_large_stack: 1817; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1818; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1819; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 336 1820; LP64-LP64F-LP64D-FPELIM-NEXT: sub sp, sp, a0 1821; LP64-LP64F-LP64D-FPELIM-NEXT: .cfi_def_cfa_offset 100000080 1822; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1823; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280 1824; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1825; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 0(a0) 1826; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1827; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 328 1828; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1829; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 0(a0) 1830; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1831; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 320 1832; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1833; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 0(a0) 1834; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1835; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 312 1836; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1837; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 0(a0) 1838; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1839; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 304 1840; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1841; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 0(a0) 1842; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1843; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 296 1844; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1845; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 0(a0) 1846; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1847; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 288 1848; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1849; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 0(a0) 1850; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1851; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 284 1852; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1853; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1854; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1855; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280 1856; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1857; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 0(a0) 1858; LP64-LP64F-LP64D-FPELIM-NEXT: lui a1, 24414 1859; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a1, a1, 336 1860; LP64-LP64F-LP64D-FPELIM-NEXT: add sp, sp, a1 1861; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1862; 1863; LP64-LP64F-LP64D-WITHFP-LABEL: va_large_stack: 1864; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1865; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -2032 1866; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa_offset 2032 1867; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 1960(sp) # 8-byte Folded Spill 1868; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 1952(sp) # 8-byte Folded Spill 1869; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset ra, -72 1870; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset s0, -80 1871; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 1968 1872; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 64 1873; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, 24414 1874; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, -1680 1875; LP64-LP64F-LP64D-WITHFP-NEXT: sub sp, sp, a0 1876; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1877; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1878; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1879; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1880; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1881; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1882; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1883; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 12 1884; LP64-LP64F-LP64D-WITHFP-NEXT: lui a1, 1024162 1885; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a1, a1, -288 1886; LP64-LP64F-LP64D-WITHFP-NEXT: add a1, s0, a1 1887; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 0(a1) 1888; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, 8(s0) 1889; LP64-LP64F-LP64D-WITHFP-NEXT: lui a1, 24414 1890; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a1, a1, -1680 1891; LP64-LP64F-LP64D-WITHFP-NEXT: add sp, sp, a1 1892; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 1960(sp) # 8-byte Folded Reload 1893; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 1952(sp) # 8-byte Folded Reload 1894; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 2032 1895; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1896 %large = alloca [ 100000000 x i8 ] 1897 %va = alloca i8*, align 4 1898 %1 = bitcast i8** %va to i8* 1899 call void @llvm.va_start(i8* %1) 1900 %argp.cur = load i8*, i8** %va, align 4 1901 %argp.next = getelementptr inbounds i8, i8* %argp.cur, i32 4 1902 store i8* %argp.next, i8** %va, align 4 1903 %2 = bitcast i8* %argp.cur to i32* 1904 %3 = load i32, i32* %2, align 4 1905 call void @llvm.va_end(i8* %1) 1906 ret i32 %3 1907} 1908