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 s0, 8(sp) # 4-byte Folded Reload
79; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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 s0, 16(sp) # 8-byte Folded Reload
138; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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 s0, 8(sp) # 4-byte Folded Reload
187; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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 s0, 16(sp) # 8-byte Folded Reload
240; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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 s1, 4(sp) # 4-byte Folded Reload
279; ILP32-ILP32F-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
280; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(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 s1, 4(sp) # 4-byte Folded Reload
309; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
310; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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 s1, 4(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 ra, 12(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 s1, 8(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 ra, 24(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 s1, 8(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 ra, 24(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:    addi a4, zero, 2
425; ILP32-ILP32F-FPELIM-NEXT:    mv a2, zero
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:    addi a4, zero, 2
439; ILP32-ILP32F-WITHFP-NEXT:    mv a2, zero
440; ILP32-ILP32F-WITHFP-NEXT:    call va1@plt
441; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
442; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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:    addi a4, zero, 2
452; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a2, zero
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:    addi a0, zero, 1023
463; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a1, a0, 52
464; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a2, zero, 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:    addi a0, zero, 1023
477; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a1, a0, 52
478; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a2, zero, 2
479; LP64-LP64F-LP64D-WITHFP-NEXT:    call va1@plt
480; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
481; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(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 s0, 8(sp) # 4-byte Folded Reload
533; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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:    addi 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:    addi a1, zero, 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:    addi 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:    addi a1, zero, 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 s0, 16(sp) # 8-byte Folded Reload
610; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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 s0, 8(sp) # 4-byte Folded Reload
674; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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 s0, 16(sp) # 8-byte Folded Reload
732; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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:    mv a2, zero
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:    mv a2, zero
764; ILP32-ILP32F-WITHFP-NEXT:    call va2@plt
765; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
766; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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:    mv a2, zero
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:    addi a0, zero, 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:    addi a0, zero, 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 s0, 0(sp) # 8-byte Folded Reload
802; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(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 s0, 16(sp) # 4-byte Folded Reload
858; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 20(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:    addi 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:    addi a2, zero, 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:    addi 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:    addi a2, zero, 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 s0, 16(sp) # 8-byte Folded Reload
937; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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 s0, 16(sp) # 4-byte Folded Reload
1006; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 20(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 s0, 16(sp) # 8-byte Folded Reload
1064; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(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:    addi a0, zero, 2
1083; ILP32-ILP32F-FPELIM-NEXT:    addi a1, zero, 1111
1084; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 262144
1085; ILP32-ILP32F-FPELIM-NEXT:    mv a2, zero
1086; ILP32-ILP32F-FPELIM-NEXT:    mv a4, zero
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:    addi a0, zero, 2
1099; ILP32-ILP32F-WITHFP-NEXT:    addi a1, zero, 1111
1100; ILP32-ILP32F-WITHFP-NEXT:    lui a5, 262144
1101; ILP32-ILP32F-WITHFP-NEXT:    mv a2, zero
1102; ILP32-ILP32F-WITHFP-NEXT:    mv a4, zero
1103; ILP32-ILP32F-WITHFP-NEXT:    call va3@plt
1104; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1105; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(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:    addi a0, zero, 2
1114; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, zero, 1111
1115; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 262144
1116; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a2, zero
1117; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a4, zero
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:    addi a0, zero, 1
1128; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a2, a0, 62
1129; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, zero, 2
1130; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, zero, 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:    addi a0, zero, 1
1143; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a2, a0, 62
1144; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, zero, 2
1145; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, zero, 1111
1146; LP64-LP64F-LP64D-WITHFP-NEXT:    call va3@plt
1147; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1148; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(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 s0, 8(sp) # 4-byte Folded Reload
1195; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(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 s1, 20(sp) # 4-byte Folded Reload
1238; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1239; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 28(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 s0, 8(sp) # 4-byte Folded Reload
1280; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(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:    add a1, a1, s0
1318; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, a1, a2
1319; LP64-LP64F-LP64D-FPELIM-NEXT:    addw a0, a1, a0
1320; LP64-LP64F-LP64D-FPELIM-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1321; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 24(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:    add a1, a1, s1
1361; LP64-LP64F-LP64D-WITHFP-NEXT:    add a1, a1, a2
1362; LP64-LP64F-LP64D-WITHFP-NEXT:    addw a0, a1, a0
1363; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s1, 24(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 ra, 40(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:    addi a0, zero, 17
1400; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 24(sp)
1401; ILP32-ILP32F-FPELIM-NEXT:    addi a0, zero, 16
1402; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 20(sp)
1403; ILP32-ILP32F-FPELIM-NEXT:    addi a0, zero, 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:    addi a0, zero, 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:    addi a0, zero, 1
1427; ILP32-ILP32F-FPELIM-NEXT:    addi a1, zero, 11
1428; ILP32-ILP32F-FPELIM-NEXT:    addi a2, sp, 32
1429; ILP32-ILP32F-FPELIM-NEXT:    addi a3, zero, 12
1430; ILP32-ILP32F-FPELIM-NEXT:    addi a4, zero, 13
1431; ILP32-ILP32F-FPELIM-NEXT:    addi a7, zero, 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:    addi a0, zero, 17
1445; ILP32-ILP32F-WITHFP-NEXT:    sw a0, 24(sp)
1446; ILP32-ILP32F-WITHFP-NEXT:    addi a0, zero, 16
1447; ILP32-ILP32F-WITHFP-NEXT:    sw a0, 20(sp)
1448; ILP32-ILP32F-WITHFP-NEXT:    addi a0, zero, 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:    addi a0, zero, 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:    addi a0, zero, 1
1472; ILP32-ILP32F-WITHFP-NEXT:    addi a1, zero, 11
1473; ILP32-ILP32F-WITHFP-NEXT:    addi a2, s0, -32
1474; ILP32-ILP32F-WITHFP-NEXT:    addi a3, zero, 12
1475; ILP32-ILP32F-WITHFP-NEXT:    addi a4, zero, 13
1476; ILP32-ILP32F-WITHFP-NEXT:    addi a7, zero, 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 s0, 56(sp) # 4-byte Folded Reload
1480; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 60(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:    addi a0, zero, 17
1495; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 24(sp)
1496; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, zero, 16
1497; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 20(sp)
1498; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, zero, 15
1499; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 16(sp)
1500; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, zero, 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:    addi a0, zero, 1
1516; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, zero, 11
1517; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, sp, 32
1518; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a3, zero, 12
1519; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a4, zero, 13
1520; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a7, zero, 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:    addi a0, zero, 17
1532; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 24(sp)
1533; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, zero, 16
1534; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 16(sp)
1535; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, zero, 15
1536; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 8(sp)
1537; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 2049
1538; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, -1147
1539; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 13
1540; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 983
1541; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 14
1542; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 655
1543; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 12
1544; LP64-LP64F-LP64D-FPELIM-NEXT:    addi t0, a0, 1475
1545; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 1192
1546; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 381
1547; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 12
1548; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a6, a0, -2048
1549; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 1048248
1550; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 1311
1551; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 12
1552; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, -1147
1553; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 13
1554; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 983
1555; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 15
1556; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a2, a0, 1311
1557; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 512
1558; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 73
1559; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 15
1560; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, -1311
1561; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 12
1562; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 1147
1563; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a0, 14
1564; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a3, a0, -1967
1565; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, zero, 1
1566; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, zero, 11
1567; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a4, zero, 12
1568; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a5, zero, 13
1569; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a7, zero, 14
1570; LP64-LP64F-LP64D-FPELIM-NEXT:    sd t0, 0(sp)
1571; LP64-LP64F-LP64D-FPELIM-NEXT:    call va5_aligned_stack_callee@plt
1572; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1573; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 48
1574; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1575;
1576; LP64-LP64F-LP64D-WITHFP-LABEL: va5_aligned_stack_caller:
1577; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1578; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -48
1579; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
1580; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
1581; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 48
1582; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, zero, 17
1583; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 24(sp)
1584; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, zero, 16
1585; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 16(sp)
1586; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, zero, 15
1587; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 8(sp)
1588; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 2049
1589; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, -1147
1590; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 13
1591; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 983
1592; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 14
1593; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 655
1594; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 12
1595; LP64-LP64F-LP64D-WITHFP-NEXT:    addi t0, a0, 1475
1596; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 1192
1597; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, 381
1598; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 12
1599; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a6, a0, -2048
1600; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 1048248
1601; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, 1311
1602; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 12
1603; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, -1147
1604; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 13
1605; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 983
1606; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 15
1607; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a2, a0, 1311
1608; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 512
1609; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, 73
1610; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 15
1611; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, -1311
1612; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 12
1613; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 1147
1614; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a0, 14
1615; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a3, a0, -1967
1616; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, zero, 1
1617; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, zero, 11
1618; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a4, zero, 12
1619; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a5, zero, 13
1620; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a7, zero, 14
1621; LP64-LP64F-LP64D-WITHFP-NEXT:    sd t0, 0(sp)
1622; LP64-LP64F-LP64D-WITHFP-NEXT:    call va5_aligned_stack_callee@plt
1623; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
1624; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
1625; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 48
1626; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1627  %1 = call i32 (i32, ...) @va5_aligned_stack_callee(i32 1, i32 11,
1628    fp128 0xLEB851EB851EB851F400091EB851EB851, i32 12, i32 13, i64 20000000000,
1629    i32 14, double 2.720000e+00, i32 15, [2 x i32] [i32 16, i32 17])
1630  ret void
1631}
1632
1633; A function with no fixed arguments is not valid C, but can be
1634; specified in LLVM IR. We must ensure the vararg save area is
1635; still set up correctly.
1636
1637define i32 @va6_no_fixed_args(...) nounwind {
1638; ILP32-ILP32F-FPELIM-LABEL: va6_no_fixed_args:
1639; ILP32-ILP32F-FPELIM:       # %bb.0:
1640; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
1641; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
1642; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
1643; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
1644; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
1645; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
1646; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
1647; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
1648; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 16(sp)
1649; ILP32-ILP32F-FPELIM-NEXT:    addi a1, sp, 20
1650; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
1651; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
1652; ILP32-ILP32F-FPELIM-NEXT:    ret
1653;
1654; ILP32-ILP32F-WITHFP-LABEL: va6_no_fixed_args:
1655; ILP32-ILP32F-WITHFP:       # %bb.0:
1656; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
1657; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1658; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1659; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
1660; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
1661; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
1662; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
1663; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
1664; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
1665; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
1666; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
1667; ILP32-ILP32F-WITHFP-NEXT:    sw a0, 0(s0)
1668; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 4
1669; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -12(s0)
1670; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1671; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1672; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
1673; ILP32-ILP32F-WITHFP-NEXT:    ret
1674;
1675; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va6_no_fixed_args:
1676; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1677; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
1678; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
1679; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
1680; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
1681; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
1682; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
1683; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
1684; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
1685; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 16(sp)
1686; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, sp, 20
1687; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
1688; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
1689; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1690;
1691; LP64-LP64F-LP64D-FPELIM-LABEL: va6_no_fixed_args:
1692; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1693; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
1694; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
1695; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
1696; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
1697; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
1698; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
1699; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
1700; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
1701; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 16(sp)
1702; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, sp, 24
1703; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
1704; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
1705; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1706;
1707; LP64-LP64F-LP64D-WITHFP-LABEL: va6_no_fixed_args:
1708; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1709; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
1710; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1711; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1712; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
1713; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
1714; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
1715; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
1716; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
1717; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
1718; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
1719; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
1720; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 0(s0)
1721; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, s0, 8
1722; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -24(s0)
1723; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1724; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1725; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
1726; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1727  %va = alloca i8*, align 4
1728  %1 = bitcast i8** %va to i8*
1729  call void @llvm.va_start(i8* %1)
1730  %2 = va_arg i8** %va, i32
1731  call void @llvm.va_end(i8* %1)
1732  ret i32 %2
1733}
1734
1735; TODO: improve constant materialization of stack addresses
1736
1737define i32 @va_large_stack(i8* %fmt, ...) {
1738; ILP32-ILP32F-FPELIM-LABEL: va_large_stack:
1739; ILP32-ILP32F-FPELIM:       # %bb.0:
1740; ILP32-ILP32F-FPELIM-NEXT:    lui a0, 24414
1741; ILP32-ILP32F-FPELIM-NEXT:    addi a0, a0, 304
1742; ILP32-ILP32F-FPELIM-NEXT:    sub sp, sp, a0
1743; ILP32-ILP32F-FPELIM-NEXT:    .cfi_def_cfa_offset 100000048
1744; ILP32-ILP32F-FPELIM-NEXT:    mv a0, a1
1745; ILP32-ILP32F-FPELIM-NEXT:    lui t0, 24414
1746; ILP32-ILP32F-FPELIM-NEXT:    addi t0, t0, 300
1747; ILP32-ILP32F-FPELIM-NEXT:    add t0, sp, t0
1748; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 0(t0)
1749; ILP32-ILP32F-FPELIM-NEXT:    lui a7, 24414
1750; ILP32-ILP32F-FPELIM-NEXT:    addi a7, a7, 296
1751; ILP32-ILP32F-FPELIM-NEXT:    add a7, sp, a7
1752; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 0(a7)
1753; ILP32-ILP32F-FPELIM-NEXT:    lui a6, 24414
1754; ILP32-ILP32F-FPELIM-NEXT:    addi a6, a6, 292
1755; ILP32-ILP32F-FPELIM-NEXT:    add a6, sp, a6
1756; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 0(a6)
1757; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 24414
1758; ILP32-ILP32F-FPELIM-NEXT:    addi a5, a5, 288
1759; ILP32-ILP32F-FPELIM-NEXT:    add a5, sp, a5
1760; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 0(a5)
1761; ILP32-ILP32F-FPELIM-NEXT:    lui a4, 24414
1762; ILP32-ILP32F-FPELIM-NEXT:    addi a4, a4, 284
1763; ILP32-ILP32F-FPELIM-NEXT:    add a4, sp, a4
1764; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 0(a4)
1765; ILP32-ILP32F-FPELIM-NEXT:    lui a3, 24414
1766; ILP32-ILP32F-FPELIM-NEXT:    addi a3, a3, 280
1767; ILP32-ILP32F-FPELIM-NEXT:    add a3, sp, a3
1768; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 0(a3)
1769; ILP32-ILP32F-FPELIM-NEXT:    lui a2, 24414
1770; ILP32-ILP32F-FPELIM-NEXT:    addi a2, a2, 276
1771; ILP32-ILP32F-FPELIM-NEXT:    add a2, sp, a2
1772; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 0(a2)
1773; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
1774; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a1, 280
1775; ILP32-ILP32F-FPELIM-NEXT:    add a1, sp, a1
1776; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
1777; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
1778; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a1, 304
1779; ILP32-ILP32F-FPELIM-NEXT:    add sp, sp, a1
1780; ILP32-ILP32F-FPELIM-NEXT:    ret
1781;
1782; ILP32-ILP32F-WITHFP-LABEL: va_large_stack:
1783; ILP32-ILP32F-WITHFP:       # %bb.0:
1784; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -2032
1785; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa_offset 2032
1786; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 1996(sp) # 4-byte Folded Spill
1787; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 1992(sp) # 4-byte Folded Spill
1788; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset ra, -36
1789; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset s0, -40
1790; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 2000
1791; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa s0, 32
1792; ILP32-ILP32F-WITHFP-NEXT:    lui a0, 24414
1793; ILP32-ILP32F-WITHFP-NEXT:    addi a0, a0, -1728
1794; ILP32-ILP32F-WITHFP-NEXT:    sub sp, sp, a0
1795; ILP32-ILP32F-WITHFP-NEXT:    mv a0, a1
1796; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
1797; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
1798; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
1799; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
1800; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
1801; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
1802; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
1803; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 8
1804; ILP32-ILP32F-WITHFP-NEXT:    lui a2, 1024162
1805; ILP32-ILP32F-WITHFP-NEXT:    addi a2, a2, -272
1806; ILP32-ILP32F-WITHFP-NEXT:    add a2, s0, a2
1807; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 0(a2)
1808; ILP32-ILP32F-WITHFP-NEXT:    lui a1, 24414
1809; ILP32-ILP32F-WITHFP-NEXT:    addi a1, a1, -1728
1810; ILP32-ILP32F-WITHFP-NEXT:    add sp, sp, a1
1811; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 1992(sp) # 4-byte Folded Reload
1812; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 1996(sp) # 4-byte Folded Reload
1813; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 2032
1814; ILP32-ILP32F-WITHFP-NEXT:    ret
1815;
1816; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va_large_stack:
1817; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1818; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a0, 24414
1819; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, a0, 304
1820; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sub sp, sp, a0
1821; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    .cfi_def_cfa_offset 100000048
1822; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a0, a1
1823; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t0, 24414
1824; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi t0, t0, 300
1825; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add t0, sp, t0
1826; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 0(t0)
1827; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a7, 24414
1828; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a7, a7, 296
1829; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a7, sp, a7
1830; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 0(a7)
1831; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a6, 24414
1832; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a6, a6, 292
1833; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a6, sp, a6
1834; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 0(a6)
1835; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 24414
1836; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a5, a5, 288
1837; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a5, sp, a5
1838; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 0(a5)
1839; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a4, 24414
1840; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a4, a4, 284
1841; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a4, sp, a4
1842; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 0(a4)
1843; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a3, 24414
1844; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a3, a3, 280
1845; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a3, sp, a3
1846; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 0(a3)
1847; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a2, 24414
1848; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, a2, 276
1849; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a2, sp, a2
1850; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 0(a2)
1851; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
1852; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a1, 280
1853; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, sp, a1
1854; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
1855; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
1856; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a1, 304
1857; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add sp, sp, a1
1858; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1859;
1860; LP64-LP64F-LP64D-FPELIM-LABEL: va_large_stack:
1861; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1862; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1863; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 336
1864; LP64-LP64F-LP64D-FPELIM-NEXT:    sub sp, sp, a0
1865; LP64-LP64F-LP64D-FPELIM-NEXT:    .cfi_def_cfa_offset 100000080
1866; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1867; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 280
1868; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1869; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 0(a0)
1870; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1871; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 328
1872; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1873; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 0(a0)
1874; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1875; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 320
1876; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1877; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 0(a0)
1878; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1879; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 312
1880; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1881; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 0(a0)
1882; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1883; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 304
1884; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1885; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 0(a0)
1886; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1887; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 296
1888; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1889; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 0(a0)
1890; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1891; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 288
1892; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1893; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 0(a0)
1894; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1895; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 284
1896; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1897; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 8(sp)
1898; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
1899; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 280
1900; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
1901; LP64-LP64F-LP64D-FPELIM-NEXT:    lw a0, 0(a0)
1902; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
1903; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a1, a1, 336
1904; LP64-LP64F-LP64D-FPELIM-NEXT:    add sp, sp, a1
1905; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1906;
1907; LP64-LP64F-LP64D-WITHFP-LABEL: va_large_stack:
1908; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1909; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -2032
1910; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa_offset 2032
1911; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 1960(sp) # 8-byte Folded Spill
1912; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 1952(sp) # 8-byte Folded Spill
1913; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset ra, -72
1914; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset s0, -80
1915; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 1968
1916; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa s0, 64
1917; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 24414
1918; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, -1680
1919; LP64-LP64F-LP64D-WITHFP-NEXT:    sub sp, sp, a0
1920; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
1921; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
1922; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
1923; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
1924; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
1925; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
1926; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
1927; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, s0, 12
1928; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a1, 1024162
1929; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a1, a1, -288
1930; LP64-LP64F-LP64D-WITHFP-NEXT:    add a1, s0, a1
1931; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 0(a1)
1932; LP64-LP64F-LP64D-WITHFP-NEXT:    lw a0, 8(s0)
1933; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a1, 24414
1934; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a1, a1, -1680
1935; LP64-LP64F-LP64D-WITHFP-NEXT:    add sp, sp, a1
1936; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 1952(sp) # 8-byte Folded Reload
1937; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 1960(sp) # 8-byte Folded Reload
1938; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 2032
1939; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1940  %large = alloca [ 100000000 x i8 ]
1941  %va = alloca i8*, align 4
1942  %1 = bitcast i8** %va to i8*
1943  call void @llvm.va_start(i8* %1)
1944  %argp.cur = load i8*, i8** %va, align 4
1945  %argp.next = getelementptr inbounds i8, i8* %argp.cur, i32 4
1946  store i8* %argp.next, i8** %va, align 4
1947  %2 = bitcast i8* %argp.cur to i32*
1948  %3 = load i32, i32* %2, align 4
1949  call void @llvm.va_end(i8* %1)
1950  ret i32 %3
1951}
1952