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 a6, 40(sp) 497; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 498; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 499; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 500; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 501; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 502; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 27 503; ILP32-ILP32F-FPELIM-NEXT: andi a1, a0, -8 504; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 35 505; ILP32-ILP32F-FPELIM-NEXT: sw a0, 12(sp) 506; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a1) 507; ILP32-ILP32F-FPELIM-NEXT: ori a1, a1, 4 508; ILP32-ILP32F-FPELIM-NEXT: lw a1, 0(a1) 509; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 510; ILP32-ILP32F-FPELIM-NEXT: ret 511; 512; ILP32-ILP32F-WITHFP-LABEL: va2: 513; ILP32-ILP32F-WITHFP: # %bb.0: 514; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 515; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 516; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 517; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 518; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 519; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 520; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 521; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 522; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 523; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 524; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 525; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 526; ILP32-ILP32F-WITHFP-NEXT: andi a1, a0, -8 527; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 19 528; ILP32-ILP32F-WITHFP-NEXT: sw a0, -12(s0) 529; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a1) 530; ILP32-ILP32F-WITHFP-NEXT: ori a1, a1, 4 531; ILP32-ILP32F-WITHFP-NEXT: lw a1, 0(a1) 532; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 533; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 534; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 535; ILP32-ILP32F-WITHFP-NEXT: ret 536; 537; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2: 538; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 539; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 540; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 541; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 542; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 543; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 544; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 545; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 546; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 547; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 27 548; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a1, a0, -8 549; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 35 550; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 12(sp) 551; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(a1) 552; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ori a1, a1, 4 553; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 0(a1) 554; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 555; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 556; 557; LP64-LP64F-LP64D-FPELIM-LABEL: va2: 558; LP64-LP64F-LP64D-FPELIM: # %bb.0: 559; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 560; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 561; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 562; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 563; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 564; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 565; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 566; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 567; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 24 568; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 569; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 8(sp) 570; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 7 571; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a0, 32 572; LP64-LP64F-LP64D-FPELIM-NEXT: srli a1, a1, 32 573; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a1, 8 574; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 575; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 1 576; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a1, 32 577; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a1, -8 578; LP64-LP64F-LP64D-FPELIM-NEXT: and a0, a0, a1 579; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 580; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 581; LP64-LP64F-LP64D-FPELIM-NEXT: ret 582; 583; LP64-LP64F-LP64D-WITHFP-LABEL: va2: 584; LP64-LP64F-LP64D-WITHFP: # %bb.0: 585; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 586; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 587; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 588; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 589; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 590; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 591; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 592; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 593; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 594; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 595; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 596; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 8 597; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -24(s0) 598; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, -24(s0) 599; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 7 600; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a0, 32 601; LP64-LP64F-LP64D-WITHFP-NEXT: srli a1, a1, 32 602; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a1, 8 603; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 604; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 1 605; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a1, 32 606; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a1, -8 607; LP64-LP64F-LP64D-WITHFP-NEXT: and a0, a0, a1 608; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 609; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 610; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 611; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 612; LP64-LP64F-LP64D-WITHFP-NEXT: ret 613 %va = alloca i8*, align 4 614 %1 = bitcast i8** %va to i8* 615 call void @llvm.va_start(i8* %1) 616 %2 = bitcast i8** %va to i32* 617 %argp.cur = load i32, i32* %2, align 4 618 %3 = add i32 %argp.cur, 7 619 %4 = and i32 %3, -8 620 %argp.cur.aligned = inttoptr i32 %3 to i8* 621 %argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8 622 store i8* %argp.next, i8** %va, align 4 623 %5 = inttoptr i32 %4 to double* 624 %6 = load double, double* %5, align 8 625 %7 = bitcast double %6 to i64 626 call void @llvm.va_end(i8* %1) 627 ret i64 %7 628} 629 630define i64 @va2_va_arg(i8 *%fmt, ...) nounwind { 631; ILP32-ILP32F-FPELIM-LABEL: va2_va_arg: 632; ILP32-ILP32F-FPELIM: # %bb.0: 633; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 634; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 635; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 636; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 637; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 638; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 639; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 640; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 641; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 27 642; ILP32-ILP32F-FPELIM-NEXT: andi a1, a0, -8 643; ILP32-ILP32F-FPELIM-NEXT: ori a2, a1, 4 644; ILP32-ILP32F-FPELIM-NEXT: sw a2, 12(sp) 645; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a1) 646; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 8 647; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 648; ILP32-ILP32F-FPELIM-NEXT: lw a1, 0(a2) 649; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 650; ILP32-ILP32F-FPELIM-NEXT: ret 651; 652; ILP32-ILP32F-WITHFP-LABEL: va2_va_arg: 653; ILP32-ILP32F-WITHFP: # %bb.0: 654; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 655; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 656; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 657; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 658; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 659; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 660; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 661; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 662; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 663; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 664; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 665; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 666; ILP32-ILP32F-WITHFP-NEXT: andi a1, a0, -8 667; ILP32-ILP32F-WITHFP-NEXT: ori a2, a1, 4 668; ILP32-ILP32F-WITHFP-NEXT: sw a2, -12(s0) 669; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a1) 670; ILP32-ILP32F-WITHFP-NEXT: addi a1, a1, 8 671; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 672; ILP32-ILP32F-WITHFP-NEXT: lw a1, 0(a2) 673; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 674; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 675; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 676; ILP32-ILP32F-WITHFP-NEXT: ret 677; 678; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_va_arg: 679; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 680; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 681; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 682; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 683; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 684; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 685; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 686; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 687; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 688; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 27 689; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 690; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a0, 8 691; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 692; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fld ft0, 0(a0) 693; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fsd ft0, 0(sp) 694; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(sp) 695; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 4(sp) 696; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 697; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 698; 699; LP64-LP64F-LP64D-FPELIM-LABEL: va2_va_arg: 700; LP64-LP64F-LP64D-FPELIM: # %bb.0: 701; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 702; LP64-LP64F-LP64D-FPELIM-NEXT: mv a0, a1 703; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 704; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 705; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 706; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 707; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 708; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 709; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 710; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, sp, 32 711; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 712; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 713; LP64-LP64F-LP64D-FPELIM-NEXT: ret 714; 715; LP64-LP64F-LP64D-WITHFP-LABEL: va2_va_arg: 716; LP64-LP64F-LP64D-WITHFP: # %bb.0: 717; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 718; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 719; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 720; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 721; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, a1 722; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 723; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 724; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 725; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 726; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 727; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 728; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 729; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, s0, 16 730; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 731; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 732; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 733; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 734; LP64-LP64F-LP64D-WITHFP-NEXT: ret 735 %va = alloca i8*, align 4 736 %1 = bitcast i8** %va to i8* 737 call void @llvm.va_start(i8* %1) 738 %2 = va_arg i8** %va, double 739 call void @llvm.va_end(i8* %1) 740 %3 = bitcast double %2 to i64 741 ret i64 %3 742} 743 744define void @va2_caller() nounwind { 745; ILP32-ILP32F-FPELIM-LABEL: va2_caller: 746; ILP32-ILP32F-FPELIM: # %bb.0: 747; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -16 748; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 749; ILP32-ILP32F-FPELIM-NEXT: lui a3, 261888 750; ILP32-ILP32F-FPELIM-NEXT: li a2, 0 751; ILP32-ILP32F-FPELIM-NEXT: call va2@plt 752; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 753; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 16 754; ILP32-ILP32F-FPELIM-NEXT: ret 755; 756; ILP32-ILP32F-WITHFP-LABEL: va2_caller: 757; ILP32-ILP32F-WITHFP: # %bb.0: 758; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -16 759; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 760; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 761; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 762; ILP32-ILP32F-WITHFP-NEXT: lui a3, 261888 763; ILP32-ILP32F-WITHFP-NEXT: li a2, 0 764; ILP32-ILP32F-WITHFP-NEXT: call va2@plt 765; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 766; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 767; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 16 768; ILP32-ILP32F-WITHFP-NEXT: ret 769; 770; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_caller: 771; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 772; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -16 773; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 774; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a3, 261888 775; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a2, 0 776; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va2@plt 777; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 778; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 16 779; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 780; 781; LP64-LP64F-LP64D-FPELIM-LABEL: va2_caller: 782; LP64-LP64F-LP64D-FPELIM: # %bb.0: 783; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -16 784; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 785; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1023 786; LP64-LP64F-LP64D-FPELIM-NEXT: slli a1, a0, 52 787; LP64-LP64F-LP64D-FPELIM-NEXT: call va2@plt 788; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 789; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 16 790; LP64-LP64F-LP64D-FPELIM-NEXT: ret 791; 792; LP64-LP64F-LP64D-WITHFP-LABEL: va2_caller: 793; LP64-LP64F-LP64D-WITHFP: # %bb.0: 794; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -16 795; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 796; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 797; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 16 798; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1023 799; LP64-LP64F-LP64D-WITHFP-NEXT: slli a1, a0, 52 800; LP64-LP64F-LP64D-WITHFP-NEXT: call va2@plt 801; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 802; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 803; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 16 804; LP64-LP64F-LP64D-WITHFP-NEXT: ret 805 %1 = call i64 (i8*, ...) @va2(i8* undef, double 1.000000e+00) 806 ret void 807} 808 809; On RV32, Ensure a named 2*xlen argument is passed in a1 and a2, while the 810; vararg double is passed in a4 and a5 (rather than a3 and a4) 811 812define i64 @va3(i32 %a, i64 %b, ...) nounwind { 813; ILP32-ILP32F-FPELIM-LABEL: va3: 814; ILP32-ILP32F-FPELIM: # %bb.0: 815; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -32 816; ILP32-ILP32F-FPELIM-NEXT: sw a7, 28(sp) 817; ILP32-ILP32F-FPELIM-NEXT: sw a5, 20(sp) 818; ILP32-ILP32F-FPELIM-NEXT: sw a4, 16(sp) 819; ILP32-ILP32F-FPELIM-NEXT: sw a3, 12(sp) 820; ILP32-ILP32F-FPELIM-NEXT: sw a6, 24(sp) 821; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 19 822; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -8 823; ILP32-ILP32F-FPELIM-NEXT: addi a3, sp, 27 824; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 825; ILP32-ILP32F-FPELIM-NEXT: lw a3, 0(a0) 826; ILP32-ILP32F-FPELIM-NEXT: ori a0, a0, 4 827; ILP32-ILP32F-FPELIM-NEXT: lw a4, 0(a0) 828; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a3 829; ILP32-ILP32F-FPELIM-NEXT: sltu a1, a0, a1 830; ILP32-ILP32F-FPELIM-NEXT: add a2, a2, a4 831; ILP32-ILP32F-FPELIM-NEXT: add a1, a2, a1 832; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 32 833; ILP32-ILP32F-FPELIM-NEXT: ret 834; 835; ILP32-ILP32F-WITHFP-LABEL: va3: 836; ILP32-ILP32F-WITHFP: # %bb.0: 837; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 838; ILP32-ILP32F-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill 839; ILP32-ILP32F-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill 840; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 24 841; ILP32-ILP32F-WITHFP-NEXT: sw a7, 20(s0) 842; ILP32-ILP32F-WITHFP-NEXT: sw a5, 12(s0) 843; ILP32-ILP32F-WITHFP-NEXT: sw a4, 8(s0) 844; ILP32-ILP32F-WITHFP-NEXT: sw a3, 4(s0) 845; ILP32-ILP32F-WITHFP-NEXT: sw a6, 16(s0) 846; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 847; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -8 848; ILP32-ILP32F-WITHFP-NEXT: addi a3, s0, 19 849; ILP32-ILP32F-WITHFP-NEXT: sw a3, -12(s0) 850; ILP32-ILP32F-WITHFP-NEXT: lw a3, 0(a0) 851; ILP32-ILP32F-WITHFP-NEXT: ori a0, a0, 4 852; ILP32-ILP32F-WITHFP-NEXT: lw a4, 0(a0) 853; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a3 854; ILP32-ILP32F-WITHFP-NEXT: sltu a1, a0, a1 855; ILP32-ILP32F-WITHFP-NEXT: add a2, a2, a4 856; ILP32-ILP32F-WITHFP-NEXT: add a1, a2, a1 857; ILP32-ILP32F-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload 858; ILP32-ILP32F-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload 859; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 860; ILP32-ILP32F-WITHFP-NEXT: ret 861; 862; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3: 863; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 864; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -32 865; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 28(sp) 866; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 20(sp) 867; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 16(sp) 868; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 12(sp) 869; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 24(sp) 870; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 19 871; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 872; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, sp, 27 873; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 4(sp) 874; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a3, 0(a0) 875; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ori a0, a0, 4 876; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a4, 0(a0) 877; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a3 878; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sltu a1, a0, a1 879; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, a2, a4 880; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a2, a1 881; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 32 882; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 883; 884; LP64-LP64F-LP64D-FPELIM-LABEL: va3: 885; LP64-LP64F-LP64D-FPELIM: # %bb.0: 886; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -64 887; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 56(sp) 888; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 48(sp) 889; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 40(sp) 890; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 32(sp) 891; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 24(sp) 892; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 16 893; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 894; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 8(sp) 895; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 16(sp) 896; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 7 897; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a0, 32 898; LP64-LP64F-LP64D-FPELIM-NEXT: srli a2, a2, 32 899; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a2, 8 900; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 8(sp) 901; LP64-LP64F-LP64D-FPELIM-NEXT: li a2, 1 902; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a2, 32 903; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a2, -8 904; LP64-LP64F-LP64D-FPELIM-NEXT: and a0, a0, a2 905; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 906; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, a1, a0 907; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 64 908; LP64-LP64F-LP64D-FPELIM-NEXT: ret 909; 910; LP64-LP64F-LP64D-WITHFP-LABEL: va3: 911; LP64-LP64F-LP64D-WITHFP: # %bb.0: 912; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -80 913; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 914; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 915; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 916; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 40(s0) 917; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 32(s0) 918; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 24(s0) 919; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 16(s0) 920; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 8(s0) 921; LP64-LP64F-LP64D-WITHFP-NEXT: mv a0, s0 922; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -24(s0) 923; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, -24(s0) 924; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 0(s0) 925; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 7 926; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a0, 32 927; LP64-LP64F-LP64D-WITHFP-NEXT: srli a2, a2, 32 928; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a2, 8 929; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, -24(s0) 930; LP64-LP64F-LP64D-WITHFP-NEXT: li a2, 1 931; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a2, 32 932; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a2, -8 933; LP64-LP64F-LP64D-WITHFP-NEXT: and a0, a0, a2 934; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 935; LP64-LP64F-LP64D-WITHFP-NEXT: add a0, a1, a0 936; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 937; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 938; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 80 939; LP64-LP64F-LP64D-WITHFP-NEXT: ret 940 %va = alloca i8*, align 4 941 %1 = bitcast i8** %va to i8* 942 call void @llvm.va_start(i8* %1) 943 %2 = bitcast i8** %va to i32* 944 %argp.cur = load i32, i32* %2, align 4 945 %3 = add i32 %argp.cur, 7 946 %4 = and i32 %3, -8 947 %argp.cur.aligned = inttoptr i32 %3 to i8* 948 %argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8 949 store i8* %argp.next, i8** %va, align 4 950 %5 = inttoptr i32 %4 to double* 951 %6 = load double, double* %5, align 8 952 call void @llvm.va_end(i8* %1) 953 %7 = bitcast double %6 to i64 954 %8 = add i64 %b, %7 955 ret i64 %8 956} 957 958define i64 @va3_va_arg(i32 %a, i64 %b, ...) nounwind { 959; ILP32-ILP32F-FPELIM-LABEL: va3_va_arg: 960; ILP32-ILP32F-FPELIM: # %bb.0: 961; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -32 962; ILP32-ILP32F-FPELIM-NEXT: sw a7, 28(sp) 963; ILP32-ILP32F-FPELIM-NEXT: sw a6, 24(sp) 964; ILP32-ILP32F-FPELIM-NEXT: sw a5, 20(sp) 965; ILP32-ILP32F-FPELIM-NEXT: sw a4, 16(sp) 966; ILP32-ILP32F-FPELIM-NEXT: sw a3, 12(sp) 967; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 19 968; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -8 969; ILP32-ILP32F-FPELIM-NEXT: ori a3, a0, 4 970; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 971; ILP32-ILP32F-FPELIM-NEXT: lw a4, 0(a0) 972; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 8 973; ILP32-ILP32F-FPELIM-NEXT: sw a0, 4(sp) 974; ILP32-ILP32F-FPELIM-NEXT: lw a3, 0(a3) 975; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a4 976; ILP32-ILP32F-FPELIM-NEXT: sltu a1, a0, a1 977; ILP32-ILP32F-FPELIM-NEXT: add a2, a2, a3 978; ILP32-ILP32F-FPELIM-NEXT: add a1, a2, a1 979; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 32 980; ILP32-ILP32F-FPELIM-NEXT: ret 981; 982; ILP32-ILP32F-WITHFP-LABEL: va3_va_arg: 983; ILP32-ILP32F-WITHFP: # %bb.0: 984; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 985; ILP32-ILP32F-WITHFP-NEXT: sw ra, 20(sp) # 4-byte Folded Spill 986; ILP32-ILP32F-WITHFP-NEXT: sw s0, 16(sp) # 4-byte Folded Spill 987; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 24 988; ILP32-ILP32F-WITHFP-NEXT: sw a7, 20(s0) 989; ILP32-ILP32F-WITHFP-NEXT: sw a6, 16(s0) 990; ILP32-ILP32F-WITHFP-NEXT: sw a5, 12(s0) 991; ILP32-ILP32F-WITHFP-NEXT: sw a4, 8(s0) 992; ILP32-ILP32F-WITHFP-NEXT: sw a3, 4(s0) 993; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 11 994; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -8 995; ILP32-ILP32F-WITHFP-NEXT: ori a3, a0, 4 996; ILP32-ILP32F-WITHFP-NEXT: sw a3, -12(s0) 997; ILP32-ILP32F-WITHFP-NEXT: lw a4, 0(a0) 998; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 8 999; ILP32-ILP32F-WITHFP-NEXT: sw a0, -12(s0) 1000; ILP32-ILP32F-WITHFP-NEXT: lw a3, 0(a3) 1001; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a4 1002; ILP32-ILP32F-WITHFP-NEXT: sltu a1, a0, a1 1003; ILP32-ILP32F-WITHFP-NEXT: add a2, a2, a3 1004; ILP32-ILP32F-WITHFP-NEXT: add a1, a2, a1 1005; ILP32-ILP32F-WITHFP-NEXT: lw ra, 20(sp) # 4-byte Folded Reload 1006; ILP32-ILP32F-WITHFP-NEXT: lw s0, 16(sp) # 4-byte Folded Reload 1007; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 1008; ILP32-ILP32F-WITHFP-NEXT: ret 1009; 1010; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_va_arg: 1011; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1012; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1013; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1014; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1015; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1016; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1017; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1018; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 35 1019; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -8 1020; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a0, 8 1021; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 20(sp) 1022; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fld ft0, 0(a0) 1023; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: fsd ft0, 8(sp) 1024; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 12(sp) 1025; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a3, 8(sp) 1026; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, a2, a0 1027; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a3 1028; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sltu a1, a0, a1 1029; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a2, a1 1030; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1031; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1032; 1033; LP64-LP64F-LP64D-FPELIM-LABEL: va3_va_arg: 1034; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1035; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -64 1036; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 56(sp) 1037; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 48(sp) 1038; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 40(sp) 1039; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 32(sp) 1040; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 24(sp) 1041; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 16(sp) 1042; LP64-LP64F-LP64D-FPELIM-NEXT: addi a3, sp, 24 1043; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, a1, a2 1044; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 8(sp) 1045; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 64 1046; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1047; 1048; LP64-LP64F-LP64D-WITHFP-LABEL: va3_va_arg: 1049; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1050; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -80 1051; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1052; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1053; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 1054; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 40(s0) 1055; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 32(s0) 1056; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 24(s0) 1057; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 16(s0) 1058; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 8(s0) 1059; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 0(s0) 1060; LP64-LP64F-LP64D-WITHFP-NEXT: addi a3, s0, 8 1061; LP64-LP64F-LP64D-WITHFP-NEXT: add a0, a1, a2 1062; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, -24(s0) 1063; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1064; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1065; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 80 1066; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1067 %va = alloca i8*, align 4 1068 %1 = bitcast i8** %va to i8* 1069 call void @llvm.va_start(i8* %1) 1070 %2 = va_arg i8** %va, double 1071 call void @llvm.va_end(i8* %1) 1072 %3 = bitcast double %2 to i64 1073 %4 = add i64 %b, %3 1074 ret i64 %4 1075} 1076 1077define void @va3_caller() nounwind { 1078; ILP32-ILP32F-FPELIM-LABEL: va3_caller: 1079; ILP32-ILP32F-FPELIM: # %bb.0: 1080; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -16 1081; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1082; ILP32-ILP32F-FPELIM-NEXT: li a0, 2 1083; ILP32-ILP32F-FPELIM-NEXT: li a1, 1111 1084; ILP32-ILP32F-FPELIM-NEXT: lui a5, 262144 1085; ILP32-ILP32F-FPELIM-NEXT: li a2, 0 1086; ILP32-ILP32F-FPELIM-NEXT: li a4, 0 1087; ILP32-ILP32F-FPELIM-NEXT: call va3@plt 1088; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1089; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 16 1090; ILP32-ILP32F-FPELIM-NEXT: ret 1091; 1092; ILP32-ILP32F-WITHFP-LABEL: va3_caller: 1093; ILP32-ILP32F-WITHFP: # %bb.0: 1094; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -16 1095; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1096; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1097; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 1098; ILP32-ILP32F-WITHFP-NEXT: li a0, 2 1099; ILP32-ILP32F-WITHFP-NEXT: li a1, 1111 1100; ILP32-ILP32F-WITHFP-NEXT: lui a5, 262144 1101; ILP32-ILP32F-WITHFP-NEXT: li a2, 0 1102; ILP32-ILP32F-WITHFP-NEXT: li a4, 0 1103; ILP32-ILP32F-WITHFP-NEXT: call va3@plt 1104; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1105; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1106; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 16 1107; ILP32-ILP32F-WITHFP-NEXT: ret 1108; 1109; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_caller: 1110; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1111; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -16 1112; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1113; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 2 1114; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a1, 1111 1115; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a5, 262144 1116; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a2, 0 1117; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a4, 0 1118; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va3@plt 1119; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1120; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 16 1121; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1122; 1123; LP64-LP64F-LP64D-FPELIM-LABEL: va3_caller: 1124; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1125; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -16 1126; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1127; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1 1128; LP64-LP64F-LP64D-FPELIM-NEXT: slli a2, a0, 62 1129; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 2 1130; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 1111 1131; LP64-LP64F-LP64D-FPELIM-NEXT: call va3@plt 1132; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1133; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 16 1134; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1135; 1136; LP64-LP64F-LP64D-WITHFP-LABEL: va3_caller: 1137; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1138; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -16 1139; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 1140; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 1141; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 16 1142; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1 1143; LP64-LP64F-LP64D-WITHFP-NEXT: slli a2, a0, 62 1144; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 2 1145; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 1111 1146; LP64-LP64F-LP64D-WITHFP-NEXT: call va3@plt 1147; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 1148; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 1149; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 16 1150; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1151 %1 = call i64 (i32, i64, ...) @va3(i32 2, i64 1111, double 2.000000e+00) 1152 ret void 1153} 1154 1155declare void @llvm.va_copy(i8*, i8*) 1156 1157define i32 @va4_va_copy(i32 %argno, ...) nounwind { 1158; ILP32-ILP32F-FPELIM-LABEL: va4_va_copy: 1159; ILP32-ILP32F-FPELIM: # %bb.0: 1160; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 1161; ILP32-ILP32F-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1162; ILP32-ILP32F-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1163; ILP32-ILP32F-FPELIM-NEXT: mv s0, a1 1164; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 1165; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 1166; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 1167; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 1168; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 1169; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 1170; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 1171; ILP32-ILP32F-FPELIM-NEXT: addi a0, sp, 24 1172; ILP32-ILP32F-FPELIM-NEXT: sw a0, 4(sp) 1173; ILP32-ILP32F-FPELIM-NEXT: sw a0, 0(sp) 1174; ILP32-ILP32F-FPELIM-NEXT: call notdead@plt 1175; ILP32-ILP32F-FPELIM-NEXT: lw a0, 4(sp) 1176; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 3 1177; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1178; ILP32-ILP32F-FPELIM-NEXT: addi a1, a0, 4 1179; ILP32-ILP32F-FPELIM-NEXT: sw a1, 4(sp) 1180; ILP32-ILP32F-FPELIM-NEXT: lw a1, 0(a0) 1181; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 7 1182; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1183; ILP32-ILP32F-FPELIM-NEXT: addi a2, a0, 4 1184; ILP32-ILP32F-FPELIM-NEXT: sw a2, 4(sp) 1185; ILP32-ILP32F-FPELIM-NEXT: lw a2, 0(a0) 1186; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 7 1187; ILP32-ILP32F-FPELIM-NEXT: andi a0, a0, -4 1188; ILP32-ILP32F-FPELIM-NEXT: addi a3, a0, 4 1189; ILP32-ILP32F-FPELIM-NEXT: sw a3, 4(sp) 1190; ILP32-ILP32F-FPELIM-NEXT: lw a0, 0(a0) 1191; ILP32-ILP32F-FPELIM-NEXT: add a1, a1, s0 1192; ILP32-ILP32F-FPELIM-NEXT: add a1, a1, a2 1193; ILP32-ILP32F-FPELIM-NEXT: add a0, a1, a0 1194; ILP32-ILP32F-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1195; ILP32-ILP32F-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1196; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 1197; ILP32-ILP32F-FPELIM-NEXT: ret 1198; 1199; ILP32-ILP32F-WITHFP-LABEL: va4_va_copy: 1200; ILP32-ILP32F-WITHFP: # %bb.0: 1201; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -64 1202; ILP32-ILP32F-WITHFP-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 1203; ILP32-ILP32F-WITHFP-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 1204; ILP32-ILP32F-WITHFP-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 1205; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 32 1206; ILP32-ILP32F-WITHFP-NEXT: mv s1, a1 1207; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1208; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1209; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1210; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1211; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1212; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1213; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1214; ILP32-ILP32F-WITHFP-NEXT: addi a0, s0, 8 1215; ILP32-ILP32F-WITHFP-NEXT: sw a0, -16(s0) 1216; ILP32-ILP32F-WITHFP-NEXT: sw a0, -20(s0) 1217; ILP32-ILP32F-WITHFP-NEXT: call notdead@plt 1218; ILP32-ILP32F-WITHFP-NEXT: lw a0, -16(s0) 1219; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 3 1220; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1221; ILP32-ILP32F-WITHFP-NEXT: addi a1, a0, 4 1222; ILP32-ILP32F-WITHFP-NEXT: sw a1, -16(s0) 1223; ILP32-ILP32F-WITHFP-NEXT: lw a1, 0(a0) 1224; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 7 1225; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1226; ILP32-ILP32F-WITHFP-NEXT: addi a2, a0, 4 1227; ILP32-ILP32F-WITHFP-NEXT: sw a2, -16(s0) 1228; ILP32-ILP32F-WITHFP-NEXT: lw a2, 0(a0) 1229; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 7 1230; ILP32-ILP32F-WITHFP-NEXT: andi a0, a0, -4 1231; ILP32-ILP32F-WITHFP-NEXT: addi a3, a0, 4 1232; ILP32-ILP32F-WITHFP-NEXT: sw a3, -16(s0) 1233; ILP32-ILP32F-WITHFP-NEXT: lw a0, 0(a0) 1234; ILP32-ILP32F-WITHFP-NEXT: add a1, a1, s1 1235; ILP32-ILP32F-WITHFP-NEXT: add a1, a1, a2 1236; ILP32-ILP32F-WITHFP-NEXT: add a0, a1, a0 1237; ILP32-ILP32F-WITHFP-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 1238; ILP32-ILP32F-WITHFP-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 1239; ILP32-ILP32F-WITHFP-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 1240; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 64 1241; ILP32-ILP32F-WITHFP-NEXT: ret 1242; 1243; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va4_va_copy: 1244; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1245; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1246; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1247; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1248; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv s0, a1 1249; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1250; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1251; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1252; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1253; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1254; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 1255; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 1256; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, sp, 24 1257; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 4(sp) 1258; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 0(sp) 1259; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call notdead@plt 1260; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 4(sp) 1261; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 3 1262; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1263; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a0, 4 1264; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 4(sp) 1265; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a1, 0(a0) 1266; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 7 1267; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1268; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, a0, 4 1269; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 4(sp) 1270; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a2, 0(a0) 1271; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 7 1272; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: andi a0, a0, -4 1273; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a0, 4 1274; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 4(sp) 1275; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw a0, 0(a0) 1276; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a1, s0 1277; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, a1, a2 1278; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a0, a1, a0 1279; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1280; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1281; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1282; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1283; 1284; LP64-LP64F-LP64D-FPELIM-LABEL: va4_va_copy: 1285; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1286; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -96 1287; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1288; LP64-LP64F-LP64D-FPELIM-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1289; LP64-LP64F-LP64D-FPELIM-NEXT: mv s0, a1 1290; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 88(sp) 1291; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 80(sp) 1292; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 72(sp) 1293; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 64(sp) 1294; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 56(sp) 1295; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 48(sp) 1296; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 40(sp) 1297; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, sp, 48 1298; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1299; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 0(sp) 1300; LP64-LP64F-LP64D-FPELIM-NEXT: call notdead@plt 1301; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 8(sp) 1302; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 3 1303; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1304; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, a0, 8 1305; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 1306; LP64-LP64F-LP64D-FPELIM-NEXT: ld a1, 0(a0) 1307; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 11 1308; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1309; LP64-LP64F-LP64D-FPELIM-NEXT: addi a2, a0, 8 1310; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 8(sp) 1311; LP64-LP64F-LP64D-FPELIM-NEXT: ld a2, 0(a0) 1312; LP64-LP64F-LP64D-FPELIM-NEXT: addi a0, a0, 11 1313; LP64-LP64F-LP64D-FPELIM-NEXT: andi a0, a0, -4 1314; LP64-LP64F-LP64D-FPELIM-NEXT: addi a3, a0, 8 1315; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 8(sp) 1316; LP64-LP64F-LP64D-FPELIM-NEXT: ld a0, 0(a0) 1317; LP64-LP64F-LP64D-FPELIM-NEXT: addw a1, a1, s0 1318; LP64-LP64F-LP64D-FPELIM-NEXT: addw a1, a1, a2 1319; LP64-LP64F-LP64D-FPELIM-NEXT: addw a0, a1, a0 1320; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1321; LP64-LP64F-LP64D-FPELIM-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1322; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 96 1323; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1324; 1325; LP64-LP64F-LP64D-WITHFP-LABEL: va4_va_copy: 1326; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1327; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -112 1328; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1329; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1330; LP64-LP64F-LP64D-WITHFP-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1331; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 48 1332; LP64-LP64F-LP64D-WITHFP-NEXT: mv s1, a1 1333; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1334; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1335; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1336; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1337; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1338; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1339; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1340; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 16 1341; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -32(s0) 1342; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, -40(s0) 1343; LP64-LP64F-LP64D-WITHFP-NEXT: call notdead@plt 1344; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, -32(s0) 1345; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 3 1346; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1347; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, a0, 8 1348; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -32(s0) 1349; LP64-LP64F-LP64D-WITHFP-NEXT: ld a1, 0(a0) 1350; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 11 1351; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1352; LP64-LP64F-LP64D-WITHFP-NEXT: addi a2, a0, 8 1353; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, -32(s0) 1354; LP64-LP64F-LP64D-WITHFP-NEXT: ld a2, 0(a0) 1355; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, a0, 11 1356; LP64-LP64F-LP64D-WITHFP-NEXT: andi a0, a0, -4 1357; LP64-LP64F-LP64D-WITHFP-NEXT: addi a3, a0, 8 1358; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, -32(s0) 1359; LP64-LP64F-LP64D-WITHFP-NEXT: ld a0, 0(a0) 1360; LP64-LP64F-LP64D-WITHFP-NEXT: addw a1, a1, s1 1361; LP64-LP64F-LP64D-WITHFP-NEXT: addw a1, a1, a2 1362; LP64-LP64F-LP64D-WITHFP-NEXT: addw a0, a1, a0 1363; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1364; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1365; LP64-LP64F-LP64D-WITHFP-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1366; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 112 1367; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1368 %vargs = alloca i8*, align 4 1369 %wargs = alloca i8*, align 4 1370 %1 = bitcast i8** %vargs to i8* 1371 %2 = bitcast i8** %wargs to i8* 1372 call void @llvm.va_start(i8* %1) 1373 %3 = va_arg i8** %vargs, i32 1374 call void @llvm.va_copy(i8* %2, i8* %1) 1375 %4 = load i8*, i8** %wargs, align 4 1376 call void @notdead(i8* %4) 1377 %5 = va_arg i8** %vargs, i32 1378 %6 = va_arg i8** %vargs, i32 1379 %7 = va_arg i8** %vargs, i32 1380 call void @llvm.va_end(i8* %1) 1381 call void @llvm.va_end(i8* %2) 1382 %add1 = add i32 %5, %3 1383 %add2 = add i32 %add1, %6 1384 %add3 = add i32 %add2, %7 1385 ret i32 %add3 1386} 1387 1388; Check 2x*xlen values are aligned appropriately when passed on the stack in a vararg call 1389 1390declare i32 @va5_aligned_stack_callee(i32, ...) 1391 1392define void @va5_aligned_stack_caller() nounwind { 1393; The double should be 8-byte aligned on the stack, but the two-element array 1394; should only be 4-byte aligned 1395; ILP32-ILP32F-FPELIM-LABEL: va5_aligned_stack_caller: 1396; ILP32-ILP32F-FPELIM: # %bb.0: 1397; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -64 1398; ILP32-ILP32F-FPELIM-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1399; ILP32-ILP32F-FPELIM-NEXT: li a0, 17 1400; ILP32-ILP32F-FPELIM-NEXT: sw a0, 24(sp) 1401; ILP32-ILP32F-FPELIM-NEXT: li a0, 16 1402; ILP32-ILP32F-FPELIM-NEXT: sw a0, 20(sp) 1403; ILP32-ILP32F-FPELIM-NEXT: li a0, 15 1404; ILP32-ILP32F-FPELIM-NEXT: sw a0, 16(sp) 1405; ILP32-ILP32F-FPELIM-NEXT: lui a0, 262236 1406; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 655 1407; ILP32-ILP32F-FPELIM-NEXT: sw a0, 12(sp) 1408; ILP32-ILP32F-FPELIM-NEXT: lui a0, 377487 1409; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 1475 1410; ILP32-ILP32F-FPELIM-NEXT: sw a0, 8(sp) 1411; ILP32-ILP32F-FPELIM-NEXT: li a0, 14 1412; ILP32-ILP32F-FPELIM-NEXT: sw a0, 0(sp) 1413; ILP32-ILP32F-FPELIM-NEXT: lui a0, 262153 1414; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 491 1415; ILP32-ILP32F-FPELIM-NEXT: sw a0, 44(sp) 1416; ILP32-ILP32F-FPELIM-NEXT: lui a0, 545260 1417; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, -1967 1418; ILP32-ILP32F-FPELIM-NEXT: sw a0, 40(sp) 1419; ILP32-ILP32F-FPELIM-NEXT: lui a0, 964690 1420; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, -328 1421; ILP32-ILP32F-FPELIM-NEXT: sw a0, 36(sp) 1422; ILP32-ILP32F-FPELIM-NEXT: lui a0, 335544 1423; ILP32-ILP32F-FPELIM-NEXT: addi a5, a0, 1311 1424; ILP32-ILP32F-FPELIM-NEXT: lui a0, 688509 1425; ILP32-ILP32F-FPELIM-NEXT: addi a6, a0, -2048 1426; ILP32-ILP32F-FPELIM-NEXT: li a0, 1 1427; ILP32-ILP32F-FPELIM-NEXT: li a1, 11 1428; ILP32-ILP32F-FPELIM-NEXT: addi a2, sp, 32 1429; ILP32-ILP32F-FPELIM-NEXT: li a3, 12 1430; ILP32-ILP32F-FPELIM-NEXT: li a4, 13 1431; ILP32-ILP32F-FPELIM-NEXT: li a7, 4 1432; ILP32-ILP32F-FPELIM-NEXT: sw a5, 32(sp) 1433; ILP32-ILP32F-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1434; ILP32-ILP32F-FPELIM-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1435; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 64 1436; ILP32-ILP32F-FPELIM-NEXT: ret 1437; 1438; ILP32-ILP32F-WITHFP-LABEL: va5_aligned_stack_caller: 1439; ILP32-ILP32F-WITHFP: # %bb.0: 1440; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -64 1441; ILP32-ILP32F-WITHFP-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1442; ILP32-ILP32F-WITHFP-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 1443; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 64 1444; ILP32-ILP32F-WITHFP-NEXT: li a0, 17 1445; ILP32-ILP32F-WITHFP-NEXT: sw a0, 24(sp) 1446; ILP32-ILP32F-WITHFP-NEXT: li a0, 16 1447; ILP32-ILP32F-WITHFP-NEXT: sw a0, 20(sp) 1448; ILP32-ILP32F-WITHFP-NEXT: li a0, 15 1449; ILP32-ILP32F-WITHFP-NEXT: sw a0, 16(sp) 1450; ILP32-ILP32F-WITHFP-NEXT: lui a0, 262236 1451; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 655 1452; ILP32-ILP32F-WITHFP-NEXT: sw a0, 12(sp) 1453; ILP32-ILP32F-WITHFP-NEXT: lui a0, 377487 1454; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 1475 1455; ILP32-ILP32F-WITHFP-NEXT: sw a0, 8(sp) 1456; ILP32-ILP32F-WITHFP-NEXT: li a0, 14 1457; ILP32-ILP32F-WITHFP-NEXT: sw a0, 0(sp) 1458; ILP32-ILP32F-WITHFP-NEXT: lui a0, 262153 1459; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, 491 1460; ILP32-ILP32F-WITHFP-NEXT: sw a0, -20(s0) 1461; ILP32-ILP32F-WITHFP-NEXT: lui a0, 545260 1462; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -1967 1463; ILP32-ILP32F-WITHFP-NEXT: sw a0, -24(s0) 1464; ILP32-ILP32F-WITHFP-NEXT: lui a0, 964690 1465; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -328 1466; ILP32-ILP32F-WITHFP-NEXT: sw a0, -28(s0) 1467; ILP32-ILP32F-WITHFP-NEXT: lui a0, 335544 1468; ILP32-ILP32F-WITHFP-NEXT: addi a5, a0, 1311 1469; ILP32-ILP32F-WITHFP-NEXT: lui a0, 688509 1470; ILP32-ILP32F-WITHFP-NEXT: addi a6, a0, -2048 1471; ILP32-ILP32F-WITHFP-NEXT: li a0, 1 1472; ILP32-ILP32F-WITHFP-NEXT: li a1, 11 1473; ILP32-ILP32F-WITHFP-NEXT: addi a2, s0, -32 1474; ILP32-ILP32F-WITHFP-NEXT: li a3, 12 1475; ILP32-ILP32F-WITHFP-NEXT: li a4, 13 1476; ILP32-ILP32F-WITHFP-NEXT: li a7, 4 1477; ILP32-ILP32F-WITHFP-NEXT: sw a5, -32(s0) 1478; ILP32-ILP32F-WITHFP-NEXT: call va5_aligned_stack_callee@plt 1479; ILP32-ILP32F-WITHFP-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1480; ILP32-ILP32F-WITHFP-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 1481; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 64 1482; ILP32-ILP32F-WITHFP-NEXT: ret 1483; 1484; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va5_aligned_stack_caller: 1485; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1486; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -64 1487; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 1488; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 262236 1489; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 655 1490; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 12(sp) 1491; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 377487 1492; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 1475 1493; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 8(sp) 1494; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 17 1495; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 24(sp) 1496; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 16 1497; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 20(sp) 1498; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 15 1499; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 16(sp) 1500; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 14 1501; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 0(sp) 1502; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 262153 1503; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 491 1504; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 44(sp) 1505; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 545260 1506; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, -1967 1507; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 40(sp) 1508; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 964690 1509; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, -328 1510; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 36(sp) 1511; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 335544 1512; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a5, a0, 1311 1513; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 688509 1514; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a6, a0, -2048 1515; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a0, 1 1516; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a1, 11 1517; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, sp, 32 1518; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a3, 12 1519; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a4, 13 1520; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: li a7, 4 1521; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 32(sp) 1522; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1523; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 1524; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 64 1525; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1526; 1527; LP64-LP64F-LP64D-FPELIM-LABEL: va5_aligned_stack_caller: 1528; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1529; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -48 1530; LP64-LP64F-LP64D-FPELIM-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1531; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 17 1532; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 24(sp) 1533; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 16 1534; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 16(sp) 1535; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 15 1536; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1537; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_0) 1538; LP64-LP64F-LP64D-FPELIM-NEXT: ld t0, %lo(.LCPI11_0)(a0) 1539; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_1) 1540; LP64-LP64F-LP64D-FPELIM-NEXT: ld a2, %lo(.LCPI11_1)(a0) 1541; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, %hi(.LCPI11_2) 1542; LP64-LP64F-LP64D-FPELIM-NEXT: ld a3, %lo(.LCPI11_2)(a0) 1543; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 2384 1544; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 761 1545; LP64-LP64F-LP64D-FPELIM-NEXT: slli a6, a0, 11 1546; LP64-LP64F-LP64D-FPELIM-NEXT: li a0, 1 1547; LP64-LP64F-LP64D-FPELIM-NEXT: li a1, 11 1548; LP64-LP64F-LP64D-FPELIM-NEXT: li a4, 12 1549; LP64-LP64F-LP64D-FPELIM-NEXT: li a5, 13 1550; LP64-LP64F-LP64D-FPELIM-NEXT: li a7, 14 1551; LP64-LP64F-LP64D-FPELIM-NEXT: sd t0, 0(sp) 1552; LP64-LP64F-LP64D-FPELIM-NEXT: call va5_aligned_stack_callee@plt 1553; LP64-LP64F-LP64D-FPELIM-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1554; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 48 1555; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1556; 1557; LP64-LP64F-LP64D-WITHFP-LABEL: va5_aligned_stack_caller: 1558; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1559; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -48 1560; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1561; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1562; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 48 1563; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 17 1564; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 24(sp) 1565; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 16 1566; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 16(sp) 1567; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 15 1568; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 8(sp) 1569; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_0) 1570; LP64-LP64F-LP64D-WITHFP-NEXT: ld t0, %lo(.LCPI11_0)(a0) 1571; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_1) 1572; LP64-LP64F-LP64D-WITHFP-NEXT: ld a2, %lo(.LCPI11_1)(a0) 1573; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, %hi(.LCPI11_2) 1574; LP64-LP64F-LP64D-WITHFP-NEXT: ld a3, %lo(.LCPI11_2)(a0) 1575; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, 2384 1576; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, 761 1577; LP64-LP64F-LP64D-WITHFP-NEXT: slli a6, a0, 11 1578; LP64-LP64F-LP64D-WITHFP-NEXT: li a0, 1 1579; LP64-LP64F-LP64D-WITHFP-NEXT: li a1, 11 1580; LP64-LP64F-LP64D-WITHFP-NEXT: li a4, 12 1581; LP64-LP64F-LP64D-WITHFP-NEXT: li a5, 13 1582; LP64-LP64F-LP64D-WITHFP-NEXT: li a7, 14 1583; LP64-LP64F-LP64D-WITHFP-NEXT: sd t0, 0(sp) 1584; LP64-LP64F-LP64D-WITHFP-NEXT: call va5_aligned_stack_callee@plt 1585; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1586; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1587; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 48 1588; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1589 %1 = call i32 (i32, ...) @va5_aligned_stack_callee(i32 1, i32 11, 1590 fp128 0xLEB851EB851EB851F400091EB851EB851, i32 12, i32 13, i64 20000000000, 1591 i32 14, double 2.720000e+00, i32 15, [2 x i32] [i32 16, i32 17]) 1592 ret void 1593} 1594 1595; A function with no fixed arguments is not valid C, but can be 1596; specified in LLVM IR. We must ensure the vararg save area is 1597; still set up correctly. 1598 1599define i32 @va6_no_fixed_args(...) nounwind { 1600; ILP32-ILP32F-FPELIM-LABEL: va6_no_fixed_args: 1601; ILP32-ILP32F-FPELIM: # %bb.0: 1602; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, -48 1603; ILP32-ILP32F-FPELIM-NEXT: sw a7, 44(sp) 1604; ILP32-ILP32F-FPELIM-NEXT: sw a6, 40(sp) 1605; ILP32-ILP32F-FPELIM-NEXT: sw a5, 36(sp) 1606; ILP32-ILP32F-FPELIM-NEXT: sw a4, 32(sp) 1607; ILP32-ILP32F-FPELIM-NEXT: sw a3, 28(sp) 1608; ILP32-ILP32F-FPELIM-NEXT: sw a2, 24(sp) 1609; ILP32-ILP32F-FPELIM-NEXT: sw a1, 20(sp) 1610; ILP32-ILP32F-FPELIM-NEXT: sw a0, 16(sp) 1611; ILP32-ILP32F-FPELIM-NEXT: addi a1, sp, 20 1612; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 1613; ILP32-ILP32F-FPELIM-NEXT: addi sp, sp, 48 1614; ILP32-ILP32F-FPELIM-NEXT: ret 1615; 1616; ILP32-ILP32F-WITHFP-LABEL: va6_no_fixed_args: 1617; ILP32-ILP32F-WITHFP: # %bb.0: 1618; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -48 1619; ILP32-ILP32F-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 1620; ILP32-ILP32F-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 1621; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 16 1622; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1623; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1624; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1625; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1626; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1627; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1628; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1629; ILP32-ILP32F-WITHFP-NEXT: sw a0, 0(s0) 1630; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 4 1631; ILP32-ILP32F-WITHFP-NEXT: sw a1, -12(s0) 1632; ILP32-ILP32F-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 1633; ILP32-ILP32F-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 1634; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 48 1635; ILP32-ILP32F-WITHFP-NEXT: ret 1636; 1637; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va6_no_fixed_args: 1638; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1639; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, -48 1640; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 44(sp) 1641; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 40(sp) 1642; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 36(sp) 1643; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 32(sp) 1644; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 28(sp) 1645; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 24(sp) 1646; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 20(sp) 1647; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a0, 16(sp) 1648; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, sp, 20 1649; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 1650; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi sp, sp, 48 1651; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1652; 1653; LP64-LP64F-LP64D-FPELIM-LABEL: va6_no_fixed_args: 1654; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1655; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, -80 1656; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 72(sp) 1657; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 64(sp) 1658; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 56(sp) 1659; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 48(sp) 1660; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 40(sp) 1661; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 32(sp) 1662; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 24(sp) 1663; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 16(sp) 1664; LP64-LP64F-LP64D-FPELIM-NEXT: addi a1, sp, 24 1665; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 8(sp) 1666; LP64-LP64F-LP64D-FPELIM-NEXT: addi sp, sp, 80 1667; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1668; 1669; LP64-LP64F-LP64D-WITHFP-LABEL: va6_no_fixed_args: 1670; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1671; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -96 1672; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 1673; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 1674; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 32 1675; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1676; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1677; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1678; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1679; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1680; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1681; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1682; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 0(s0) 1683; LP64-LP64F-LP64D-WITHFP-NEXT: addi a1, s0, 8 1684; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, -24(s0) 1685; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 1686; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 1687; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 96 1688; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1689 %va = alloca i8*, align 4 1690 %1 = bitcast i8** %va to i8* 1691 call void @llvm.va_start(i8* %1) 1692 %2 = va_arg i8** %va, i32 1693 call void @llvm.va_end(i8* %1) 1694 ret i32 %2 1695} 1696 1697; TODO: improve constant materialization of stack addresses 1698 1699define i32 @va_large_stack(i8* %fmt, ...) { 1700; ILP32-ILP32F-FPELIM-LABEL: va_large_stack: 1701; ILP32-ILP32F-FPELIM: # %bb.0: 1702; ILP32-ILP32F-FPELIM-NEXT: lui a0, 24414 1703; ILP32-ILP32F-FPELIM-NEXT: addi a0, a0, 304 1704; ILP32-ILP32F-FPELIM-NEXT: sub sp, sp, a0 1705; ILP32-ILP32F-FPELIM-NEXT: .cfi_def_cfa_offset 100000048 1706; ILP32-ILP32F-FPELIM-NEXT: mv a0, a1 1707; ILP32-ILP32F-FPELIM-NEXT: lui t0, 24414 1708; ILP32-ILP32F-FPELIM-NEXT: addi t0, t0, 300 1709; ILP32-ILP32F-FPELIM-NEXT: add t0, sp, t0 1710; ILP32-ILP32F-FPELIM-NEXT: sw a7, 0(t0) 1711; ILP32-ILP32F-FPELIM-NEXT: lui a7, 24414 1712; ILP32-ILP32F-FPELIM-NEXT: addi a7, a7, 296 1713; ILP32-ILP32F-FPELIM-NEXT: add a7, sp, a7 1714; ILP32-ILP32F-FPELIM-NEXT: sw a6, 0(a7) 1715; ILP32-ILP32F-FPELIM-NEXT: lui a6, 24414 1716; ILP32-ILP32F-FPELIM-NEXT: addi a6, a6, 292 1717; ILP32-ILP32F-FPELIM-NEXT: add a6, sp, a6 1718; ILP32-ILP32F-FPELIM-NEXT: sw a5, 0(a6) 1719; ILP32-ILP32F-FPELIM-NEXT: lui a5, 24414 1720; ILP32-ILP32F-FPELIM-NEXT: addi a5, a5, 288 1721; ILP32-ILP32F-FPELIM-NEXT: add a5, sp, a5 1722; ILP32-ILP32F-FPELIM-NEXT: sw a4, 0(a5) 1723; ILP32-ILP32F-FPELIM-NEXT: lui a4, 24414 1724; ILP32-ILP32F-FPELIM-NEXT: addi a4, a4, 284 1725; ILP32-ILP32F-FPELIM-NEXT: add a4, sp, a4 1726; ILP32-ILP32F-FPELIM-NEXT: sw a3, 0(a4) 1727; ILP32-ILP32F-FPELIM-NEXT: lui a3, 24414 1728; ILP32-ILP32F-FPELIM-NEXT: addi a3, a3, 280 1729; ILP32-ILP32F-FPELIM-NEXT: add a3, sp, a3 1730; ILP32-ILP32F-FPELIM-NEXT: sw a2, 0(a3) 1731; ILP32-ILP32F-FPELIM-NEXT: lui a2, 24414 1732; ILP32-ILP32F-FPELIM-NEXT: addi a2, a2, 276 1733; ILP32-ILP32F-FPELIM-NEXT: add a2, sp, a2 1734; ILP32-ILP32F-FPELIM-NEXT: sw a1, 0(a2) 1735; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 1736; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 280 1737; ILP32-ILP32F-FPELIM-NEXT: add a1, sp, a1 1738; ILP32-ILP32F-FPELIM-NEXT: sw a1, 12(sp) 1739; ILP32-ILP32F-FPELIM-NEXT: lui a1, 24414 1740; ILP32-ILP32F-FPELIM-NEXT: addi a1, a1, 304 1741; ILP32-ILP32F-FPELIM-NEXT: add sp, sp, a1 1742; ILP32-ILP32F-FPELIM-NEXT: ret 1743; 1744; ILP32-ILP32F-WITHFP-LABEL: va_large_stack: 1745; ILP32-ILP32F-WITHFP: # %bb.0: 1746; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, -2032 1747; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa_offset 2032 1748; ILP32-ILP32F-WITHFP-NEXT: sw ra, 1996(sp) # 4-byte Folded Spill 1749; ILP32-ILP32F-WITHFP-NEXT: sw s0, 1992(sp) # 4-byte Folded Spill 1750; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset ra, -36 1751; ILP32-ILP32F-WITHFP-NEXT: .cfi_offset s0, -40 1752; ILP32-ILP32F-WITHFP-NEXT: addi s0, sp, 2000 1753; ILP32-ILP32F-WITHFP-NEXT: .cfi_def_cfa s0, 32 1754; ILP32-ILP32F-WITHFP-NEXT: lui a0, 24414 1755; ILP32-ILP32F-WITHFP-NEXT: addi a0, a0, -1728 1756; ILP32-ILP32F-WITHFP-NEXT: sub sp, sp, a0 1757; ILP32-ILP32F-WITHFP-NEXT: mv a0, a1 1758; ILP32-ILP32F-WITHFP-NEXT: sw a7, 28(s0) 1759; ILP32-ILP32F-WITHFP-NEXT: sw a6, 24(s0) 1760; ILP32-ILP32F-WITHFP-NEXT: sw a5, 20(s0) 1761; ILP32-ILP32F-WITHFP-NEXT: sw a4, 16(s0) 1762; ILP32-ILP32F-WITHFP-NEXT: sw a3, 12(s0) 1763; ILP32-ILP32F-WITHFP-NEXT: sw a2, 8(s0) 1764; ILP32-ILP32F-WITHFP-NEXT: sw a1, 4(s0) 1765; ILP32-ILP32F-WITHFP-NEXT: addi a1, s0, 8 1766; ILP32-ILP32F-WITHFP-NEXT: lui a2, 1024162 1767; ILP32-ILP32F-WITHFP-NEXT: addi a2, a2, -272 1768; ILP32-ILP32F-WITHFP-NEXT: add a2, s0, a2 1769; ILP32-ILP32F-WITHFP-NEXT: sw a1, 0(a2) 1770; ILP32-ILP32F-WITHFP-NEXT: lui a1, 24414 1771; ILP32-ILP32F-WITHFP-NEXT: addi a1, a1, -1728 1772; ILP32-ILP32F-WITHFP-NEXT: add sp, sp, a1 1773; ILP32-ILP32F-WITHFP-NEXT: lw ra, 1996(sp) # 4-byte Folded Reload 1774; ILP32-ILP32F-WITHFP-NEXT: lw s0, 1992(sp) # 4-byte Folded Reload 1775; ILP32-ILP32F-WITHFP-NEXT: addi sp, sp, 2032 1776; ILP32-ILP32F-WITHFP-NEXT: ret 1777; 1778; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va_large_stack: 1779; RV32D-ILP32-ILP32F-ILP32D-FPELIM: # %bb.0: 1780; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a0, 24414 1781; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a0, a0, 304 1782; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sub sp, sp, a0 1783; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: .cfi_def_cfa_offset 100000048 1784; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: mv a0, a1 1785; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui t0, 24414 1786; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi t0, t0, 300 1787; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add t0, sp, t0 1788; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a7, 0(t0) 1789; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a7, 24414 1790; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a7, a7, 296 1791; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a7, sp, a7 1792; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a6, 0(a7) 1793; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a6, 24414 1794; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a6, a6, 292 1795; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a6, sp, a6 1796; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a5, 0(a6) 1797; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a5, 24414 1798; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a5, a5, 288 1799; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a5, sp, a5 1800; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a4, 0(a5) 1801; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a4, 24414 1802; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a4, a4, 284 1803; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a4, sp, a4 1804; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a3, 0(a4) 1805; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a3, 24414 1806; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a3, a3, 280 1807; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a3, sp, a3 1808; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a2, 0(a3) 1809; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a2, 24414 1810; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a2, a2, 276 1811; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a2, sp, a2 1812; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 0(a2) 1813; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 1814; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 280 1815; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add a1, sp, a1 1816; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: sw a1, 12(sp) 1817; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: lui a1, 24414 1818; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: addi a1, a1, 304 1819; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: add sp, sp, a1 1820; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT: ret 1821; 1822; LP64-LP64F-LP64D-FPELIM-LABEL: va_large_stack: 1823; LP64-LP64F-LP64D-FPELIM: # %bb.0: 1824; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1825; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 336 1826; LP64-LP64F-LP64D-FPELIM-NEXT: sub sp, sp, a0 1827; LP64-LP64F-LP64D-FPELIM-NEXT: .cfi_def_cfa_offset 100000080 1828; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1829; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280 1830; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1831; LP64-LP64F-LP64D-FPELIM-NEXT: sd a1, 0(a0) 1832; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1833; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 328 1834; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1835; LP64-LP64F-LP64D-FPELIM-NEXT: sd a7, 0(a0) 1836; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1837; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 320 1838; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1839; LP64-LP64F-LP64D-FPELIM-NEXT: sd a6, 0(a0) 1840; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1841; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 312 1842; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1843; LP64-LP64F-LP64D-FPELIM-NEXT: sd a5, 0(a0) 1844; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1845; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 304 1846; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1847; LP64-LP64F-LP64D-FPELIM-NEXT: sd a4, 0(a0) 1848; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1849; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 296 1850; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1851; LP64-LP64F-LP64D-FPELIM-NEXT: sd a3, 0(a0) 1852; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1853; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 288 1854; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1855; LP64-LP64F-LP64D-FPELIM-NEXT: sd a2, 0(a0) 1856; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1857; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 284 1858; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1859; LP64-LP64F-LP64D-FPELIM-NEXT: sd a0, 8(sp) 1860; LP64-LP64F-LP64D-FPELIM-NEXT: lui a0, 24414 1861; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a0, a0, 280 1862; LP64-LP64F-LP64D-FPELIM-NEXT: add a0, sp, a0 1863; LP64-LP64F-LP64D-FPELIM-NEXT: lw a0, 0(a0) 1864; LP64-LP64F-LP64D-FPELIM-NEXT: lui a1, 24414 1865; LP64-LP64F-LP64D-FPELIM-NEXT: addiw a1, a1, 336 1866; LP64-LP64F-LP64D-FPELIM-NEXT: add sp, sp, a1 1867; LP64-LP64F-LP64D-FPELIM-NEXT: ret 1868; 1869; LP64-LP64F-LP64D-WITHFP-LABEL: va_large_stack: 1870; LP64-LP64F-LP64D-WITHFP: # %bb.0: 1871; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, -2032 1872; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa_offset 2032 1873; LP64-LP64F-LP64D-WITHFP-NEXT: sd ra, 1960(sp) # 8-byte Folded Spill 1874; LP64-LP64F-LP64D-WITHFP-NEXT: sd s0, 1952(sp) # 8-byte Folded Spill 1875; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset ra, -72 1876; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_offset s0, -80 1877; LP64-LP64F-LP64D-WITHFP-NEXT: addi s0, sp, 1968 1878; LP64-LP64F-LP64D-WITHFP-NEXT: .cfi_def_cfa s0, 64 1879; LP64-LP64F-LP64D-WITHFP-NEXT: lui a0, 24414 1880; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a0, a0, -1680 1881; LP64-LP64F-LP64D-WITHFP-NEXT: sub sp, sp, a0 1882; LP64-LP64F-LP64D-WITHFP-NEXT: sd a1, 8(s0) 1883; LP64-LP64F-LP64D-WITHFP-NEXT: sd a7, 56(s0) 1884; LP64-LP64F-LP64D-WITHFP-NEXT: sd a6, 48(s0) 1885; LP64-LP64F-LP64D-WITHFP-NEXT: sd a5, 40(s0) 1886; LP64-LP64F-LP64D-WITHFP-NEXT: sd a4, 32(s0) 1887; LP64-LP64F-LP64D-WITHFP-NEXT: sd a3, 24(s0) 1888; LP64-LP64F-LP64D-WITHFP-NEXT: sd a2, 16(s0) 1889; LP64-LP64F-LP64D-WITHFP-NEXT: addi a0, s0, 12 1890; LP64-LP64F-LP64D-WITHFP-NEXT: lui a1, 1024162 1891; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a1, a1, -288 1892; LP64-LP64F-LP64D-WITHFP-NEXT: add a1, s0, a1 1893; LP64-LP64F-LP64D-WITHFP-NEXT: sd a0, 0(a1) 1894; LP64-LP64F-LP64D-WITHFP-NEXT: lw a0, 8(s0) 1895; LP64-LP64F-LP64D-WITHFP-NEXT: lui a1, 24414 1896; LP64-LP64F-LP64D-WITHFP-NEXT: addiw a1, a1, -1680 1897; LP64-LP64F-LP64D-WITHFP-NEXT: add sp, sp, a1 1898; LP64-LP64F-LP64D-WITHFP-NEXT: ld ra, 1960(sp) # 8-byte Folded Reload 1899; LP64-LP64F-LP64D-WITHFP-NEXT: ld s0, 1952(sp) # 8-byte Folded Reload 1900; LP64-LP64F-LP64D-WITHFP-NEXT: addi sp, sp, 2032 1901; LP64-LP64F-LP64D-WITHFP-NEXT: ret 1902 %large = alloca [ 100000000 x i8 ] 1903 %va = alloca i8*, align 4 1904 %1 = bitcast i8** %va to i8* 1905 call void @llvm.va_start(i8* %1) 1906 %argp.cur = load i8*, i8** %va, align 4 1907 %argp.next = getelementptr inbounds i8, i8* %argp.cur, i32 4 1908 store i8* %argp.next, i8** %va, align 4 1909 %2 = bitcast i8* %argp.cur to i32* 1910 %3 = load i32, i32* %2, align 4 1911 call void @llvm.va_end(i8* %1) 1912 ret i32 %3 1913} 1914