xref: /llvm-project/llvm/test/CodeGen/RISCV/vararg.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -verify-machineinstrs \
3; RUN:   | FileCheck -check-prefix=ILP32-ILP32F-FPELIM %s
4; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -verify-machineinstrs -frame-pointer=all \
5; RUN:   | FileCheck -check-prefix=ILP32-ILP32F-WITHFP %s
6; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs \
7; RUN:   | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s
8; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d -target-abi ilp32f \
9; RUN:     -verify-machineinstrs \
10; RUN:   | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s
11; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d -target-abi ilp32d \
12; RUN:     -verify-machineinstrs \
13; RUN:   | FileCheck -check-prefix=RV32D-ILP32-ILP32F-ILP32D-FPELIM %s
14; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -target-abi ilp32e \
15; RUN:     -verify-machineinstrs \
16; RUN:   | FileCheck -check-prefix=ILP32E-FPELIM %s
17; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all \
18; RUN:     -verify-machineinstrs \
19; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP %s
20; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -verify-machineinstrs \
21; RUN:   | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s
22; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d -target-abi lp64f \
23; RUN:     -verify-machineinstrs \
24; RUN:   | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s
25; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d -target-abi lp64d \
26; RUN:     -verify-machineinstrs \
27; RUN:   | FileCheck -check-prefix=LP64-LP64F-LP64D-FPELIM %s
28; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -verify-machineinstrs -frame-pointer=all \
29; RUN:   | FileCheck -check-prefix=LP64-LP64F-LP64D-WITHFP %s
30; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -target-abi lp64e \
31; RUN:     -verify-machineinstrs \
32; RUN:   | FileCheck -check-prefix=LP64E-FPELIM %s
33; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -target-abi lp64e -frame-pointer=all \
34; RUN:     -verify-machineinstrs \
35; RUN:   | FileCheck -check-prefix=LP64E-WITHFP %s
36
37; The same vararg calling convention is used for ilp32/ilp32f/ilp32d and for
38; lp64/lp64f/lp64d. Different CHECK lines are required for RV32D due to slight
39; codegen differences due to the way the f64 load operations are lowered.
40; The nounwind attribute is omitted for some of the tests, to check that CFI
41; directives are correctly generated.
42
43declare void @llvm.va_start(ptr)
44declare void @llvm.va_end(ptr)
45
46declare void @notdead(ptr)
47
48; Although frontends are recommended to not generate va_arg due to the lack of
49; support for aggregate types, we test simple cases here to ensure they are
50; lowered correctly
51
52define i32 @va1(ptr %fmt, ...) {
53; ILP32-ILP32F-FPELIM-LABEL: va1:
54; ILP32-ILP32F-FPELIM:       # %bb.0:
55; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
56; ILP32-ILP32F-FPELIM-NEXT:    .cfi_def_cfa_offset 48
57; ILP32-ILP32F-FPELIM-NEXT:    mv a0, a1
58; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
59; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
60; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
61; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
62; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
63; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
64; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
65; ILP32-ILP32F-FPELIM-NEXT:    addi a1, sp, 24
66; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
67; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
68; ILP32-ILP32F-FPELIM-NEXT:    .cfi_def_cfa_offset 0
69; ILP32-ILP32F-FPELIM-NEXT:    ret
70;
71; ILP32-ILP32F-WITHFP-LABEL: va1:
72; ILP32-ILP32F-WITHFP:       # %bb.0:
73; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
74; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa_offset 48
75; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
76; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
77; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset ra, -36
78; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset s0, -40
79; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
80; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa s0, 32
81; ILP32-ILP32F-WITHFP-NEXT:    mv a0, a1
82; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
83; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
84; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
85; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
86; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
87; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
88; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
89; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 8
90; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -12(s0)
91; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa sp, 48
92; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
93; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
94; ILP32-ILP32F-WITHFP-NEXT:    .cfi_restore ra
95; ILP32-ILP32F-WITHFP-NEXT:    .cfi_restore s0
96; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
97; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa_offset 0
98; ILP32-ILP32F-WITHFP-NEXT:    ret
99;
100; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1:
101; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
102; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
103; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    .cfi_def_cfa_offset 48
104; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a0, a1
105; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
106; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
107; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
108; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
109; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
110; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
111; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
112; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, sp, 24
113; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
114; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
115; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    .cfi_def_cfa_offset 0
116; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
117;
118; ILP32E-FPELIM-LABEL: va1:
119; ILP32E-FPELIM:       # %bb.0:
120; ILP32E-FPELIM-NEXT:    addi sp, sp, -28
121; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 28
122; ILP32E-FPELIM-NEXT:    mv a0, a1
123; ILP32E-FPELIM-NEXT:    sw a5, 24(sp)
124; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
125; ILP32E-FPELIM-NEXT:    sw a2, 12(sp)
126; ILP32E-FPELIM-NEXT:    sw a3, 16(sp)
127; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
128; ILP32E-FPELIM-NEXT:    addi a1, sp, 12
129; ILP32E-FPELIM-NEXT:    sw a1, 0(sp)
130; ILP32E-FPELIM-NEXT:    addi sp, sp, 28
131; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
132; ILP32E-FPELIM-NEXT:    ret
133;
134; ILP32E-WITHFP-LABEL: va1:
135; ILP32E-WITHFP:       # %bb.0:
136; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
137; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 36
138; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
139; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
140; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
141; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
142; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
143; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
144; ILP32E-WITHFP-NEXT:    mv a0, a1
145; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
146; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
147; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
148; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
149; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
150; ILP32E-WITHFP-NEXT:    addi a1, s0, 8
151; ILP32E-WITHFP-NEXT:    sw a1, -12(s0)
152; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 36
153; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
154; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
155; ILP32E-WITHFP-NEXT:    .cfi_restore ra
156; ILP32E-WITHFP-NEXT:    .cfi_restore s0
157; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
158; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
159; ILP32E-WITHFP-NEXT:    ret
160;
161; LP64-LP64F-LP64D-FPELIM-LABEL: va1:
162; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
163; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
164; LP64-LP64F-LP64D-FPELIM-NEXT:    .cfi_def_cfa_offset 80
165; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
166; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, sp, 28
167; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 8(sp)
168; LP64-LP64F-LP64D-FPELIM-NEXT:    lw a0, 24(sp)
169; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
170; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
171; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
172; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
173; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
174; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
175; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
176; LP64-LP64F-LP64D-FPELIM-NEXT:    .cfi_def_cfa_offset 0
177; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
178;
179; LP64-LP64F-LP64D-WITHFP-LABEL: va1:
180; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
181; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
182; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa_offset 96
183; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
184; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
185; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset ra, -72
186; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset s0, -80
187; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
188; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa s0, 64
189; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
190; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, s0, 12
191; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, -24(s0)
192; LP64-LP64F-LP64D-WITHFP-NEXT:    lw a0, 8(s0)
193; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
194; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
195; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
196; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
197; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
198; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
199; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa sp, 96
200; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
201; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
202; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_restore ra
203; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_restore s0
204; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
205; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa_offset 0
206; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
207;
208; LP64E-FPELIM-LABEL: va1:
209; LP64E-FPELIM:       # %bb.0:
210; LP64E-FPELIM-NEXT:    addi sp, sp, -56
211; LP64E-FPELIM-NEXT:    .cfi_def_cfa_offset 56
212; LP64E-FPELIM-NEXT:    addi a0, sp, 20
213; LP64E-FPELIM-NEXT:    sd a0, 0(sp)
214; LP64E-FPELIM-NEXT:    sd a1, 16(sp)
215; LP64E-FPELIM-NEXT:    lw a0, 16(sp)
216; LP64E-FPELIM-NEXT:    sd a5, 48(sp)
217; LP64E-FPELIM-NEXT:    sd a2, 24(sp)
218; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
219; LP64E-FPELIM-NEXT:    sd a4, 40(sp)
220; LP64E-FPELIM-NEXT:    addi sp, sp, 56
221; LP64E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
222; LP64E-FPELIM-NEXT:    ret
223;
224; LP64E-WITHFP-LABEL: va1:
225; LP64E-WITHFP:       # %bb.0:
226; LP64E-WITHFP-NEXT:    addi sp, sp, -72
227; LP64E-WITHFP-NEXT:    .cfi_def_cfa_offset 72
228; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
229; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
230; LP64E-WITHFP-NEXT:    .cfi_offset ra, -56
231; LP64E-WITHFP-NEXT:    .cfi_offset s0, -64
232; LP64E-WITHFP-NEXT:    addi s0, sp, 24
233; LP64E-WITHFP-NEXT:    .cfi_def_cfa s0, 48
234; LP64E-WITHFP-NEXT:    addi a0, s0, 12
235; LP64E-WITHFP-NEXT:    sd a0, -24(s0)
236; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
237; LP64E-WITHFP-NEXT:    lw a0, 8(s0)
238; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
239; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
240; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
241; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
242; LP64E-WITHFP-NEXT:    .cfi_def_cfa sp, 72
243; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
244; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
245; LP64E-WITHFP-NEXT:    .cfi_restore ra
246; LP64E-WITHFP-NEXT:    .cfi_restore s0
247; LP64E-WITHFP-NEXT:    addi sp, sp, 72
248; LP64E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
249; LP64E-WITHFP-NEXT:    ret
250  %va = alloca ptr
251  call void @llvm.va_start(ptr %va)
252  %argp.cur = load ptr, ptr %va, align 4
253  %argp.next = getelementptr inbounds i8, ptr %argp.cur, i32 4
254  store ptr %argp.next, ptr %va, align 4
255  %1 = load i32, ptr %argp.cur, align 4
256  call void @llvm.va_end(ptr %va)
257  ret i32 %1
258}
259
260define i32 @va1_va_arg(ptr %fmt, ...) nounwind {
261; ILP32-ILP32F-FPELIM-LABEL: va1_va_arg:
262; ILP32-ILP32F-FPELIM:       # %bb.0:
263; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
264; ILP32-ILP32F-FPELIM-NEXT:    mv a0, a1
265; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
266; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
267; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
268; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
269; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
270; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
271; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
272; ILP32-ILP32F-FPELIM-NEXT:    addi a1, sp, 24
273; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
274; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
275; ILP32-ILP32F-FPELIM-NEXT:    ret
276;
277; ILP32-ILP32F-WITHFP-LABEL: va1_va_arg:
278; ILP32-ILP32F-WITHFP:       # %bb.0:
279; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
280; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
281; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
282; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
283; ILP32-ILP32F-WITHFP-NEXT:    mv a0, a1
284; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
285; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
286; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
287; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
288; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
289; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
290; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
291; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 8
292; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -12(s0)
293; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
294; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
295; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
296; ILP32-ILP32F-WITHFP-NEXT:    ret
297;
298; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_va_arg:
299; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
300; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
301; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a0, a1
302; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
303; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
304; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
305; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
306; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
307; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
308; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
309; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, sp, 24
310; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
311; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
312; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
313;
314; ILP32E-FPELIM-LABEL: va1_va_arg:
315; ILP32E-FPELIM:       # %bb.0:
316; ILP32E-FPELIM-NEXT:    addi sp, sp, -28
317; ILP32E-FPELIM-NEXT:    mv a0, a1
318; ILP32E-FPELIM-NEXT:    sw a5, 24(sp)
319; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
320; ILP32E-FPELIM-NEXT:    sw a2, 12(sp)
321; ILP32E-FPELIM-NEXT:    sw a3, 16(sp)
322; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
323; ILP32E-FPELIM-NEXT:    addi a1, sp, 12
324; ILP32E-FPELIM-NEXT:    sw a1, 0(sp)
325; ILP32E-FPELIM-NEXT:    addi sp, sp, 28
326; ILP32E-FPELIM-NEXT:    ret
327;
328; ILP32E-WITHFP-LABEL: va1_va_arg:
329; ILP32E-WITHFP:       # %bb.0:
330; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
331; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
332; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
333; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
334; ILP32E-WITHFP-NEXT:    mv a0, a1
335; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
336; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
337; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
338; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
339; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
340; ILP32E-WITHFP-NEXT:    addi a1, s0, 8
341; ILP32E-WITHFP-NEXT:    sw a1, -12(s0)
342; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
343; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
344; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
345; ILP32E-WITHFP-NEXT:    ret
346;
347; LP64-LP64F-LP64D-FPELIM-LABEL: va1_va_arg:
348; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
349; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
350; LP64-LP64F-LP64D-FPELIM-NEXT:    mv a0, a1
351; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
352; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
353; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
354; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
355; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
356; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
357; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
358; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, sp, 32
359; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
360; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
361; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
362;
363; LP64-LP64F-LP64D-WITHFP-LABEL: va1_va_arg:
364; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
365; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
366; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
367; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
368; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
369; LP64-LP64F-LP64D-WITHFP-NEXT:    mv a0, a1
370; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
371; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
372; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
373; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
374; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
375; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
376; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
377; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, s0, 16
378; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -24(s0)
379; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
380; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
381; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
382; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
383;
384; LP64E-FPELIM-LABEL: va1_va_arg:
385; LP64E-FPELIM:       # %bb.0:
386; LP64E-FPELIM-NEXT:    addi sp, sp, -56
387; LP64E-FPELIM-NEXT:    mv a0, a1
388; LP64E-FPELIM-NEXT:    sd a5, 48(sp)
389; LP64E-FPELIM-NEXT:    sd a1, 16(sp)
390; LP64E-FPELIM-NEXT:    sd a2, 24(sp)
391; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
392; LP64E-FPELIM-NEXT:    sd a4, 40(sp)
393; LP64E-FPELIM-NEXT:    addi a1, sp, 24
394; LP64E-FPELIM-NEXT:    sd a1, 0(sp)
395; LP64E-FPELIM-NEXT:    addi sp, sp, 56
396; LP64E-FPELIM-NEXT:    ret
397;
398; LP64E-WITHFP-LABEL: va1_va_arg:
399; LP64E-WITHFP:       # %bb.0:
400; LP64E-WITHFP-NEXT:    addi sp, sp, -72
401; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
402; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
403; LP64E-WITHFP-NEXT:    addi s0, sp, 24
404; LP64E-WITHFP-NEXT:    mv a0, a1
405; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
406; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
407; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
408; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
409; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
410; LP64E-WITHFP-NEXT:    addi a1, s0, 16
411; LP64E-WITHFP-NEXT:    sd a1, -24(s0)
412; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
413; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
414; LP64E-WITHFP-NEXT:    addi sp, sp, 72
415; LP64E-WITHFP-NEXT:    ret
416  %va = alloca ptr
417  call void @llvm.va_start(ptr %va)
418  %1 = va_arg ptr %va, i32
419  call void @llvm.va_end(ptr %va)
420  ret i32 %1
421}
422
423; Ensure the adjustment when restoring the stack pointer using the frame
424; pointer is correct
425define i32 @va1_va_arg_alloca(ptr %fmt, ...) nounwind {
426; ILP32-ILP32F-FPELIM-LABEL: va1_va_arg_alloca:
427; ILP32-ILP32F-FPELIM:       # %bb.0:
428; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
429; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
430; ILP32-ILP32F-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
431; ILP32-ILP32F-FPELIM-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
432; ILP32-ILP32F-FPELIM-NEXT:    addi s0, sp, 16
433; ILP32-ILP32F-FPELIM-NEXT:    mv s1, a1
434; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 20(s0)
435; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 24(s0)
436; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 28(s0)
437; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 4(s0)
438; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 8(s0)
439; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 12(s0)
440; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 16(s0)
441; ILP32-ILP32F-FPELIM-NEXT:    addi a0, s0, 8
442; ILP32-ILP32F-FPELIM-NEXT:    sw a0, -16(s0)
443; ILP32-ILP32F-FPELIM-NEXT:    addi a0, a1, 15
444; ILP32-ILP32F-FPELIM-NEXT:    andi a0, a0, -16
445; ILP32-ILP32F-FPELIM-NEXT:    sub a0, sp, a0
446; ILP32-ILP32F-FPELIM-NEXT:    mv sp, a0
447; ILP32-ILP32F-FPELIM-NEXT:    call notdead
448; ILP32-ILP32F-FPELIM-NEXT:    mv a0, s1
449; ILP32-ILP32F-FPELIM-NEXT:    addi sp, s0, -16
450; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
451; ILP32-ILP32F-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
452; ILP32-ILP32F-FPELIM-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
453; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
454; ILP32-ILP32F-FPELIM-NEXT:    ret
455;
456; ILP32-ILP32F-WITHFP-LABEL: va1_va_arg_alloca:
457; ILP32-ILP32F-WITHFP:       # %bb.0:
458; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
459; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
460; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
461; ILP32-ILP32F-WITHFP-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
462; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
463; ILP32-ILP32F-WITHFP-NEXT:    mv s1, a1
464; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
465; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
466; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
467; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
468; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
469; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
470; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
471; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 8
472; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -16(s0)
473; ILP32-ILP32F-WITHFP-NEXT:    addi a0, a1, 15
474; ILP32-ILP32F-WITHFP-NEXT:    andi a0, a0, -16
475; ILP32-ILP32F-WITHFP-NEXT:    sub a0, sp, a0
476; ILP32-ILP32F-WITHFP-NEXT:    mv sp, a0
477; ILP32-ILP32F-WITHFP-NEXT:    call notdead
478; ILP32-ILP32F-WITHFP-NEXT:    mv a0, s1
479; ILP32-ILP32F-WITHFP-NEXT:    addi sp, s0, -16
480; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
481; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
482; ILP32-ILP32F-WITHFP-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
483; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
484; ILP32-ILP32F-WITHFP-NEXT:    ret
485;
486; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_va_arg_alloca:
487; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
488; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
489; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
490; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
491; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
492; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi s0, sp, 16
493; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv s1, a1
494; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 20(s0)
495; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 24(s0)
496; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 28(s0)
497; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 4(s0)
498; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 8(s0)
499; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 12(s0)
500; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 16(s0)
501; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, s0, 8
502; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, -16(s0)
503; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, a1, 15
504; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a0, a0, -16
505; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sub a0, sp, a0
506; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv sp, a0
507; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call notdead
508; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a0, s1
509; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, s0, -16
510; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
511; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
512; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
513; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
514; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
515;
516; ILP32E-FPELIM-LABEL: va1_va_arg_alloca:
517; ILP32E-FPELIM:       # %bb.0:
518; ILP32E-FPELIM-NEXT:    addi sp, sp, -40
519; ILP32E-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
520; ILP32E-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
521; ILP32E-FPELIM-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
522; ILP32E-FPELIM-NEXT:    addi s0, sp, 16
523; ILP32E-FPELIM-NEXT:    mv s1, a1
524; ILP32E-FPELIM-NEXT:    sw a5, 20(s0)
525; ILP32E-FPELIM-NEXT:    sw a1, 4(s0)
526; ILP32E-FPELIM-NEXT:    sw a2, 8(s0)
527; ILP32E-FPELIM-NEXT:    sw a3, 12(s0)
528; ILP32E-FPELIM-NEXT:    sw a4, 16(s0)
529; ILP32E-FPELIM-NEXT:    addi a0, s0, 8
530; ILP32E-FPELIM-NEXT:    sw a0, -16(s0)
531; ILP32E-FPELIM-NEXT:    addi a0, a1, 3
532; ILP32E-FPELIM-NEXT:    andi a0, a0, -4
533; ILP32E-FPELIM-NEXT:    sub a0, sp, a0
534; ILP32E-FPELIM-NEXT:    mv sp, a0
535; ILP32E-FPELIM-NEXT:    call notdead
536; ILP32E-FPELIM-NEXT:    mv a0, s1
537; ILP32E-FPELIM-NEXT:    addi sp, s0, -16
538; ILP32E-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
539; ILP32E-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
540; ILP32E-FPELIM-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
541; ILP32E-FPELIM-NEXT:    addi sp, sp, 40
542; ILP32E-FPELIM-NEXT:    ret
543;
544; ILP32E-WITHFP-LABEL: va1_va_arg_alloca:
545; ILP32E-WITHFP:       # %bb.0:
546; ILP32E-WITHFP-NEXT:    addi sp, sp, -40
547; ILP32E-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
548; ILP32E-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
549; ILP32E-WITHFP-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
550; ILP32E-WITHFP-NEXT:    addi s0, sp, 16
551; ILP32E-WITHFP-NEXT:    mv s1, a1
552; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
553; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
554; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
555; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
556; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
557; ILP32E-WITHFP-NEXT:    addi a0, s0, 8
558; ILP32E-WITHFP-NEXT:    sw a0, -16(s0)
559; ILP32E-WITHFP-NEXT:    addi a0, a1, 3
560; ILP32E-WITHFP-NEXT:    andi a0, a0, -4
561; ILP32E-WITHFP-NEXT:    sub a0, sp, a0
562; ILP32E-WITHFP-NEXT:    mv sp, a0
563; ILP32E-WITHFP-NEXT:    call notdead
564; ILP32E-WITHFP-NEXT:    mv a0, s1
565; ILP32E-WITHFP-NEXT:    addi sp, s0, -16
566; ILP32E-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
567; ILP32E-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
568; ILP32E-WITHFP-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
569; ILP32E-WITHFP-NEXT:    addi sp, sp, 40
570; ILP32E-WITHFP-NEXT:    ret
571;
572; LP64-LP64F-LP64D-FPELIM-LABEL: va1_va_arg_alloca:
573; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
574; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -96
575; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
576; LP64-LP64F-LP64D-FPELIM-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
577; LP64-LP64F-LP64D-FPELIM-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
578; LP64-LP64F-LP64D-FPELIM-NEXT:    addi s0, sp, 32
579; LP64-LP64F-LP64D-FPELIM-NEXT:    mv s1, a1
580; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 40(s0)
581; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 48(s0)
582; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 56(s0)
583; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(s0)
584; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 16(s0)
585; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 24(s0)
586; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 32(s0)
587; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, s0, 16
588; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, -32(s0)
589; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a0, a1, 32
590; LP64-LP64F-LP64D-FPELIM-NEXT:    srli a0, a0, 32
591; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 15
592; LP64-LP64F-LP64D-FPELIM-NEXT:    andi a0, a0, -16
593; LP64-LP64F-LP64D-FPELIM-NEXT:    sub a0, sp, a0
594; LP64-LP64F-LP64D-FPELIM-NEXT:    mv sp, a0
595; LP64-LP64F-LP64D-FPELIM-NEXT:    call notdead
596; LP64-LP64F-LP64D-FPELIM-NEXT:    mv a0, s1
597; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, s0, -32
598; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
599; LP64-LP64F-LP64D-FPELIM-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
600; LP64-LP64F-LP64D-FPELIM-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
601; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 96
602; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
603;
604; LP64-LP64F-LP64D-WITHFP-LABEL: va1_va_arg_alloca:
605; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
606; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
607; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
608; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
609; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
610; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
611; LP64-LP64F-LP64D-WITHFP-NEXT:    mv s1, a1
612; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
613; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
614; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
615; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
616; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
617; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
618; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
619; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, s0, 16
620; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, -32(s0)
621; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a0, a1, 32
622; LP64-LP64F-LP64D-WITHFP-NEXT:    srli a0, a0, 32
623; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 15
624; LP64-LP64F-LP64D-WITHFP-NEXT:    andi a0, a0, -16
625; LP64-LP64F-LP64D-WITHFP-NEXT:    sub a0, sp, a0
626; LP64-LP64F-LP64D-WITHFP-NEXT:    mv sp, a0
627; LP64-LP64F-LP64D-WITHFP-NEXT:    call notdead
628; LP64-LP64F-LP64D-WITHFP-NEXT:    mv a0, s1
629; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, s0, -32
630; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
631; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
632; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
633; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
634; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
635;
636; LP64E-FPELIM-LABEL: va1_va_arg_alloca:
637; LP64E-FPELIM:       # %bb.0:
638; LP64E-FPELIM-NEXT:    addi sp, sp, -80
639; LP64E-FPELIM-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
640; LP64E-FPELIM-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
641; LP64E-FPELIM-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
642; LP64E-FPELIM-NEXT:    addi s0, sp, 32
643; LP64E-FPELIM-NEXT:    mv s1, a1
644; LP64E-FPELIM-NEXT:    sd a5, 40(s0)
645; LP64E-FPELIM-NEXT:    sd a1, 8(s0)
646; LP64E-FPELIM-NEXT:    sd a2, 16(s0)
647; LP64E-FPELIM-NEXT:    sd a3, 24(s0)
648; LP64E-FPELIM-NEXT:    sd a4, 32(s0)
649; LP64E-FPELIM-NEXT:    addi a0, s0, 16
650; LP64E-FPELIM-NEXT:    sd a0, -32(s0)
651; LP64E-FPELIM-NEXT:    slli a0, a1, 32
652; LP64E-FPELIM-NEXT:    srli a0, a0, 32
653; LP64E-FPELIM-NEXT:    addi a0, a0, 7
654; LP64E-FPELIM-NEXT:    andi a0, a0, -8
655; LP64E-FPELIM-NEXT:    sub a0, sp, a0
656; LP64E-FPELIM-NEXT:    mv sp, a0
657; LP64E-FPELIM-NEXT:    call notdead
658; LP64E-FPELIM-NEXT:    mv a0, s1
659; LP64E-FPELIM-NEXT:    addi sp, s0, -32
660; LP64E-FPELIM-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
661; LP64E-FPELIM-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
662; LP64E-FPELIM-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
663; LP64E-FPELIM-NEXT:    addi sp, sp, 80
664; LP64E-FPELIM-NEXT:    ret
665;
666; LP64E-WITHFP-LABEL: va1_va_arg_alloca:
667; LP64E-WITHFP:       # %bb.0:
668; LP64E-WITHFP-NEXT:    addi sp, sp, -80
669; LP64E-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
670; LP64E-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
671; LP64E-WITHFP-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
672; LP64E-WITHFP-NEXT:    addi s0, sp, 32
673; LP64E-WITHFP-NEXT:    mv s1, a1
674; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
675; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
676; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
677; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
678; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
679; LP64E-WITHFP-NEXT:    addi a0, s0, 16
680; LP64E-WITHFP-NEXT:    sd a0, -32(s0)
681; LP64E-WITHFP-NEXT:    slli a0, a1, 32
682; LP64E-WITHFP-NEXT:    srli a0, a0, 32
683; LP64E-WITHFP-NEXT:    addi a0, a0, 7
684; LP64E-WITHFP-NEXT:    andi a0, a0, -8
685; LP64E-WITHFP-NEXT:    sub a0, sp, a0
686; LP64E-WITHFP-NEXT:    mv sp, a0
687; LP64E-WITHFP-NEXT:    call notdead
688; LP64E-WITHFP-NEXT:    mv a0, s1
689; LP64E-WITHFP-NEXT:    addi sp, s0, -32
690; LP64E-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
691; LP64E-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
692; LP64E-WITHFP-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
693; LP64E-WITHFP-NEXT:    addi sp, sp, 80
694; LP64E-WITHFP-NEXT:    ret
695  %va = alloca ptr
696  call void @llvm.va_start(ptr %va)
697  %1 = va_arg ptr %va, i32
698  %2 = alloca i8, i32 %1
699  call void @notdead(ptr %2)
700  call void @llvm.va_end(ptr %va)
701  ret i32 %1
702}
703
704define void @va1_caller() nounwind {
705; Pass a double, as a float would be promoted by a C/C++ frontend
706; ILP32-ILP32F-FPELIM-LABEL: va1_caller:
707; ILP32-ILP32F-FPELIM:       # %bb.0:
708; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -16
709; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
710; ILP32-ILP32F-FPELIM-NEXT:    lui a3, 261888
711; ILP32-ILP32F-FPELIM-NEXT:    li a4, 2
712; ILP32-ILP32F-FPELIM-NEXT:    li a2, 0
713; ILP32-ILP32F-FPELIM-NEXT:    call va1
714; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
715; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 16
716; ILP32-ILP32F-FPELIM-NEXT:    ret
717;
718; ILP32-ILP32F-WITHFP-LABEL: va1_caller:
719; ILP32-ILP32F-WITHFP:       # %bb.0:
720; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -16
721; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
722; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
723; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
724; ILP32-ILP32F-WITHFP-NEXT:    lui a3, 261888
725; ILP32-ILP32F-WITHFP-NEXT:    li a4, 2
726; ILP32-ILP32F-WITHFP-NEXT:    li a2, 0
727; ILP32-ILP32F-WITHFP-NEXT:    call va1
728; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
729; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
730; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 16
731; ILP32-ILP32F-WITHFP-NEXT:    ret
732;
733; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va1_caller:
734; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
735; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -16
736; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
737; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a3, 261888
738; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a4, 2
739; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a2, 0
740; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call va1
741; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
742; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 16
743; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
744;
745; ILP32E-FPELIM-LABEL: va1_caller:
746; ILP32E-FPELIM:       # %bb.0:
747; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
748; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
749; ILP32E-FPELIM-NEXT:    lui a2, 261888
750; ILP32E-FPELIM-NEXT:    li a3, 2
751; ILP32E-FPELIM-NEXT:    li a1, 0
752; ILP32E-FPELIM-NEXT:    call va1
753; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
754; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
755; ILP32E-FPELIM-NEXT:    ret
756;
757; ILP32E-WITHFP-LABEL: va1_caller:
758; ILP32E-WITHFP:       # %bb.0:
759; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
760; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
761; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
762; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
763; ILP32E-WITHFP-NEXT:    lui a2, 261888
764; ILP32E-WITHFP-NEXT:    li a3, 2
765; ILP32E-WITHFP-NEXT:    li a1, 0
766; ILP32E-WITHFP-NEXT:    call va1
767; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
768; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
769; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
770; ILP32E-WITHFP-NEXT:    ret
771;
772; LP64-LP64F-LP64D-FPELIM-LABEL: va1_caller:
773; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
774; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -16
775; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
776; LP64-LP64F-LP64D-FPELIM-NEXT:    li a1, 1023
777; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a1, a1, 52
778; LP64-LP64F-LP64D-FPELIM-NEXT:    li a2, 2
779; LP64-LP64F-LP64D-FPELIM-NEXT:    call va1
780; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
781; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 16
782; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
783;
784; LP64-LP64F-LP64D-WITHFP-LABEL: va1_caller:
785; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
786; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -16
787; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
788; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
789; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 16
790; LP64-LP64F-LP64D-WITHFP-NEXT:    li a1, 1023
791; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a1, a1, 52
792; LP64-LP64F-LP64D-WITHFP-NEXT:    li a2, 2
793; LP64-LP64F-LP64D-WITHFP-NEXT:    call va1
794; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
795; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
796; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 16
797; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
798;
799; LP64E-FPELIM-LABEL: va1_caller:
800; LP64E-FPELIM:       # %bb.0:
801; LP64E-FPELIM-NEXT:    addi sp, sp, -8
802; LP64E-FPELIM-NEXT:    sd ra, 0(sp) # 8-byte Folded Spill
803; LP64E-FPELIM-NEXT:    li a1, 1023
804; LP64E-FPELIM-NEXT:    slli a1, a1, 52
805; LP64E-FPELIM-NEXT:    li a2, 2
806; LP64E-FPELIM-NEXT:    call va1
807; LP64E-FPELIM-NEXT:    ld ra, 0(sp) # 8-byte Folded Reload
808; LP64E-FPELIM-NEXT:    addi sp, sp, 8
809; LP64E-FPELIM-NEXT:    ret
810;
811; LP64E-WITHFP-LABEL: va1_caller:
812; LP64E-WITHFP:       # %bb.0:
813; LP64E-WITHFP-NEXT:    addi sp, sp, -16
814; LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
815; LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
816; LP64E-WITHFP-NEXT:    addi s0, sp, 16
817; LP64E-WITHFP-NEXT:    li a1, 1023
818; LP64E-WITHFP-NEXT:    slli a1, a1, 52
819; LP64E-WITHFP-NEXT:    li a2, 2
820; LP64E-WITHFP-NEXT:    call va1
821; LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
822; LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
823; LP64E-WITHFP-NEXT:    addi sp, sp, 16
824; LP64E-WITHFP-NEXT:    ret
825  %1 = call i32 (ptr, ...) @va1(ptr undef, double 1.0, i32 2)
826  ret void
827}
828
829; Ensure that 2x xlen size+alignment varargs are accessed via an "aligned"
830; register pair (where the first register is even-numbered).
831
832define i64 @va2(ptr %fmt, ...) nounwind {
833; ILP32-ILP32F-FPELIM-LABEL: va2:
834; ILP32-ILP32F-FPELIM:       # %bb.0:
835; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
836; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
837; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
838; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
839; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
840; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
841; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
842; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
843; ILP32-ILP32F-FPELIM-NEXT:    addi a0, sp, 20
844; ILP32-ILP32F-FPELIM-NEXT:    addi a1, sp, 27
845; ILP32-ILP32F-FPELIM-NEXT:    addi a2, sp, 35
846; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 12(sp)
847; ILP32-ILP32F-FPELIM-NEXT:    andi a1, a1, -8
848; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 12(sp)
849; ILP32-ILP32F-FPELIM-NEXT:    lw a0, 0(a1)
850; ILP32-ILP32F-FPELIM-NEXT:    lw a1, 4(a1)
851; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
852; ILP32-ILP32F-FPELIM-NEXT:    ret
853;
854; ILP32-ILP32F-WITHFP-LABEL: va2:
855; ILP32-ILP32F-WITHFP:       # %bb.0:
856; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
857; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
858; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
859; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
860; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
861; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
862; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
863; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
864; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
865; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
866; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
867; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 4
868; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 11
869; ILP32-ILP32F-WITHFP-NEXT:    addi a2, s0, 19
870; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -12(s0)
871; ILP32-ILP32F-WITHFP-NEXT:    andi a1, a1, -8
872; ILP32-ILP32F-WITHFP-NEXT:    sw a2, -12(s0)
873; ILP32-ILP32F-WITHFP-NEXT:    lw a0, 0(a1)
874; ILP32-ILP32F-WITHFP-NEXT:    lw a1, 4(a1)
875; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
876; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
877; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
878; ILP32-ILP32F-WITHFP-NEXT:    ret
879;
880; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2:
881; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
882; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
883; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
884; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
885; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
886; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
887; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
888; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
889; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
890; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, sp, 20
891; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, sp, 27
892; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, sp, 35
893; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 12(sp)
894; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a1, a1, -8
895; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 12(sp)
896; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 0(a1)
897; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a1, 4(a1)
898; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
899; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
900;
901; ILP32E-FPELIM-LABEL: va2:
902; ILP32E-FPELIM:       # %bb.0:
903; ILP32E-FPELIM-NEXT:    addi sp, sp, -28
904; ILP32E-FPELIM-NEXT:    sw a5, 24(sp)
905; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
906; ILP32E-FPELIM-NEXT:    sw a2, 12(sp)
907; ILP32E-FPELIM-NEXT:    sw a3, 16(sp)
908; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
909; ILP32E-FPELIM-NEXT:    addi a0, sp, 8
910; ILP32E-FPELIM-NEXT:    addi a1, sp, 15
911; ILP32E-FPELIM-NEXT:    addi a2, sp, 23
912; ILP32E-FPELIM-NEXT:    sw a0, 0(sp)
913; ILP32E-FPELIM-NEXT:    andi a1, a1, -8
914; ILP32E-FPELIM-NEXT:    sw a2, 0(sp)
915; ILP32E-FPELIM-NEXT:    lw a0, 0(a1)
916; ILP32E-FPELIM-NEXT:    lw a1, 4(a1)
917; ILP32E-FPELIM-NEXT:    addi sp, sp, 28
918; ILP32E-FPELIM-NEXT:    ret
919;
920; ILP32E-WITHFP-LABEL: va2:
921; ILP32E-WITHFP:       # %bb.0:
922; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
923; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
924; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
925; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
926; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
927; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
928; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
929; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
930; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
931; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
932; ILP32E-WITHFP-NEXT:    addi a1, s0, 11
933; ILP32E-WITHFP-NEXT:    addi a2, s0, 19
934; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
935; ILP32E-WITHFP-NEXT:    andi a1, a1, -8
936; ILP32E-WITHFP-NEXT:    sw a2, -12(s0)
937; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
938; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
939; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
940; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
941; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
942; ILP32E-WITHFP-NEXT:    ret
943;
944; LP64-LP64F-LP64D-FPELIM-LABEL: va2:
945; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
946; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
947; LP64-LP64F-LP64D-FPELIM-NEXT:    mv a0, a1
948; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
949; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
950; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
951; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
952; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
953; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
954; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
955; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, sp, 39
956; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
957; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
958; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
959;
960; LP64-LP64F-LP64D-WITHFP-LABEL: va2:
961; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
962; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
963; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
964; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
965; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
966; LP64-LP64F-LP64D-WITHFP-NEXT:    mv a0, a1
967; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
968; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
969; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
970; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
971; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
972; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
973; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
974; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, s0, 23
975; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -24(s0)
976; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
977; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
978; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
979; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
980;
981; LP64E-FPELIM-LABEL: va2:
982; LP64E-FPELIM:       # %bb.0:
983; LP64E-FPELIM-NEXT:    addi sp, sp, -56
984; LP64E-FPELIM-NEXT:    mv a0, a1
985; LP64E-FPELIM-NEXT:    sd a5, 48(sp)
986; LP64E-FPELIM-NEXT:    sd a1, 16(sp)
987; LP64E-FPELIM-NEXT:    sd a2, 24(sp)
988; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
989; LP64E-FPELIM-NEXT:    sd a4, 40(sp)
990; LP64E-FPELIM-NEXT:    addi a1, sp, 31
991; LP64E-FPELIM-NEXT:    sd a1, 0(sp)
992; LP64E-FPELIM-NEXT:    addi sp, sp, 56
993; LP64E-FPELIM-NEXT:    ret
994;
995; LP64E-WITHFP-LABEL: va2:
996; LP64E-WITHFP:       # %bb.0:
997; LP64E-WITHFP-NEXT:    addi sp, sp, -72
998; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
999; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
1000; LP64E-WITHFP-NEXT:    addi s0, sp, 24
1001; LP64E-WITHFP-NEXT:    mv a0, a1
1002; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
1003; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
1004; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
1005; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
1006; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
1007; LP64E-WITHFP-NEXT:    addi a1, s0, 23
1008; LP64E-WITHFP-NEXT:    sd a1, -24(s0)
1009; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
1010; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
1011; LP64E-WITHFP-NEXT:    addi sp, sp, 72
1012; LP64E-WITHFP-NEXT:    ret
1013  %va = alloca ptr
1014  call void @llvm.va_start(ptr %va)
1015  %argp.cur = load ptr, ptr %va
1016  %ptrint = ptrtoint ptr %argp.cur to iXLen
1017  %1 = add iXLen %ptrint, 7
1018  %2 = and iXLen %1, -8
1019  %argp.cur.aligned = inttoptr iXLen %1 to ptr
1020  %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8
1021  store ptr %argp.next, ptr %va
1022  %3 = inttoptr iXLen %2 to ptr
1023  %4 = load double, ptr %3, align 8
1024  %5 = bitcast double %4 to i64
1025  call void @llvm.va_end(ptr %va)
1026  ret i64 %5
1027}
1028
1029define i64 @va2_va_arg(ptr %fmt, ...) nounwind {
1030; ILP32-ILP32F-FPELIM-LABEL: va2_va_arg:
1031; ILP32-ILP32F-FPELIM:       # %bb.0:
1032; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
1033; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
1034; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
1035; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
1036; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
1037; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
1038; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
1039; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
1040; ILP32-ILP32F-FPELIM-NEXT:    addi a0, sp, 27
1041; ILP32-ILP32F-FPELIM-NEXT:    andi a1, a0, -8
1042; ILP32-ILP32F-FPELIM-NEXT:    addi a0, a1, 4
1043; ILP32-ILP32F-FPELIM-NEXT:    addi a2, a1, 8
1044; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 12(sp)
1045; ILP32-ILP32F-FPELIM-NEXT:    lw a0, 0(a1)
1046; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 12(sp)
1047; ILP32-ILP32F-FPELIM-NEXT:    lw a1, 4(a1)
1048; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
1049; ILP32-ILP32F-FPELIM-NEXT:    ret
1050;
1051; ILP32-ILP32F-WITHFP-LABEL: va2_va_arg:
1052; ILP32-ILP32F-WITHFP:       # %bb.0:
1053; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
1054; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1055; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1056; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
1057; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
1058; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
1059; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
1060; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
1061; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
1062; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
1063; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
1064; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 11
1065; ILP32-ILP32F-WITHFP-NEXT:    andi a1, a0, -8
1066; ILP32-ILP32F-WITHFP-NEXT:    addi a0, a1, 4
1067; ILP32-ILP32F-WITHFP-NEXT:    addi a2, a1, 8
1068; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -12(s0)
1069; ILP32-ILP32F-WITHFP-NEXT:    lw a0, 0(a1)
1070; ILP32-ILP32F-WITHFP-NEXT:    sw a2, -12(s0)
1071; ILP32-ILP32F-WITHFP-NEXT:    lw a1, 4(a1)
1072; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1073; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1074; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
1075; ILP32-ILP32F-WITHFP-NEXT:    ret
1076;
1077; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_va_arg:
1078; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1079; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
1080; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
1081; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
1082; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
1083; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
1084; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
1085; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
1086; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
1087; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, sp, 27
1088; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a0, a0, -8
1089; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a0, 8
1090; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
1091; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    fld fa5, 0(a0)
1092; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    fsd fa5, 0(sp)
1093; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 0(sp)
1094; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a1, 4(sp)
1095; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
1096; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1097;
1098; ILP32E-FPELIM-LABEL: va2_va_arg:
1099; ILP32E-FPELIM:       # %bb.0:
1100; ILP32E-FPELIM-NEXT:    addi sp, sp, -28
1101; ILP32E-FPELIM-NEXT:    sw a5, 24(sp)
1102; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
1103; ILP32E-FPELIM-NEXT:    sw a2, 12(sp)
1104; ILP32E-FPELIM-NEXT:    sw a3, 16(sp)
1105; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
1106; ILP32E-FPELIM-NEXT:    addi a0, sp, 15
1107; ILP32E-FPELIM-NEXT:    andi a1, a0, -8
1108; ILP32E-FPELIM-NEXT:    addi a0, a1, 4
1109; ILP32E-FPELIM-NEXT:    addi a2, a1, 8
1110; ILP32E-FPELIM-NEXT:    sw a0, 0(sp)
1111; ILP32E-FPELIM-NEXT:    lw a0, 0(a1)
1112; ILP32E-FPELIM-NEXT:    sw a2, 0(sp)
1113; ILP32E-FPELIM-NEXT:    lw a1, 4(a1)
1114; ILP32E-FPELIM-NEXT:    addi sp, sp, 28
1115; ILP32E-FPELIM-NEXT:    ret
1116;
1117; ILP32E-WITHFP-LABEL: va2_va_arg:
1118; ILP32E-WITHFP:       # %bb.0:
1119; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
1120; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
1121; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
1122; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
1123; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
1124; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
1125; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
1126; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
1127; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
1128; ILP32E-WITHFP-NEXT:    addi a0, s0, 11
1129; ILP32E-WITHFP-NEXT:    andi a1, a0, -8
1130; ILP32E-WITHFP-NEXT:    addi a0, a1, 4
1131; ILP32E-WITHFP-NEXT:    addi a2, a1, 8
1132; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
1133; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
1134; ILP32E-WITHFP-NEXT:    sw a2, -12(s0)
1135; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
1136; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
1137; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
1138; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
1139; ILP32E-WITHFP-NEXT:    ret
1140;
1141; LP64-LP64F-LP64D-FPELIM-LABEL: va2_va_arg:
1142; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1143; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
1144; LP64-LP64F-LP64D-FPELIM-NEXT:    mv a0, a1
1145; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
1146; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
1147; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
1148; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
1149; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
1150; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
1151; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
1152; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, sp, 32
1153; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
1154; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
1155; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1156;
1157; LP64-LP64F-LP64D-WITHFP-LABEL: va2_va_arg:
1158; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1159; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
1160; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1161; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1162; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
1163; LP64-LP64F-LP64D-WITHFP-NEXT:    mv a0, a1
1164; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
1165; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
1166; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
1167; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
1168; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
1169; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
1170; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
1171; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, s0, 16
1172; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -24(s0)
1173; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1174; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1175; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
1176; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1177;
1178; LP64E-FPELIM-LABEL: va2_va_arg:
1179; LP64E-FPELIM:       # %bb.0:
1180; LP64E-FPELIM-NEXT:    addi sp, sp, -56
1181; LP64E-FPELIM-NEXT:    mv a0, a1
1182; LP64E-FPELIM-NEXT:    sd a5, 48(sp)
1183; LP64E-FPELIM-NEXT:    sd a1, 16(sp)
1184; LP64E-FPELIM-NEXT:    sd a2, 24(sp)
1185; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
1186; LP64E-FPELIM-NEXT:    sd a4, 40(sp)
1187; LP64E-FPELIM-NEXT:    addi a1, sp, 24
1188; LP64E-FPELIM-NEXT:    sd a1, 0(sp)
1189; LP64E-FPELIM-NEXT:    addi sp, sp, 56
1190; LP64E-FPELIM-NEXT:    ret
1191;
1192; LP64E-WITHFP-LABEL: va2_va_arg:
1193; LP64E-WITHFP:       # %bb.0:
1194; LP64E-WITHFP-NEXT:    addi sp, sp, -72
1195; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
1196; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
1197; LP64E-WITHFP-NEXT:    addi s0, sp, 24
1198; LP64E-WITHFP-NEXT:    mv a0, a1
1199; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
1200; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
1201; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
1202; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
1203; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
1204; LP64E-WITHFP-NEXT:    addi a1, s0, 16
1205; LP64E-WITHFP-NEXT:    sd a1, -24(s0)
1206; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
1207; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
1208; LP64E-WITHFP-NEXT:    addi sp, sp, 72
1209; LP64E-WITHFP-NEXT:    ret
1210  %va = alloca ptr
1211  call void @llvm.va_start(ptr %va)
1212  %1 = va_arg ptr %va, double
1213  call void @llvm.va_end(ptr %va)
1214  %2 = bitcast double %1 to i64
1215  ret i64 %2
1216}
1217
1218define void @va2_caller() nounwind {
1219; ILP32-ILP32F-FPELIM-LABEL: va2_caller:
1220; ILP32-ILP32F-FPELIM:       # %bb.0:
1221; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -16
1222; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1223; ILP32-ILP32F-FPELIM-NEXT:    lui a3, 261888
1224; ILP32-ILP32F-FPELIM-NEXT:    li a2, 0
1225; ILP32-ILP32F-FPELIM-NEXT:    call va2
1226; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1227; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 16
1228; ILP32-ILP32F-FPELIM-NEXT:    ret
1229;
1230; ILP32-ILP32F-WITHFP-LABEL: va2_caller:
1231; ILP32-ILP32F-WITHFP:       # %bb.0:
1232; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -16
1233; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1234; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1235; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
1236; ILP32-ILP32F-WITHFP-NEXT:    lui a3, 261888
1237; ILP32-ILP32F-WITHFP-NEXT:    li a2, 0
1238; ILP32-ILP32F-WITHFP-NEXT:    call va2
1239; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1240; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1241; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 16
1242; ILP32-ILP32F-WITHFP-NEXT:    ret
1243;
1244; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va2_caller:
1245; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1246; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -16
1247; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1248; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a3, 261888
1249; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a2, 0
1250; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call va2
1251; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1252; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 16
1253; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1254;
1255; ILP32E-FPELIM-LABEL: va2_caller:
1256; ILP32E-FPELIM:       # %bb.0:
1257; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
1258; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
1259; ILP32E-FPELIM-NEXT:    lui a2, 261888
1260; ILP32E-FPELIM-NEXT:    li a1, 0
1261; ILP32E-FPELIM-NEXT:    call va2
1262; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
1263; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
1264; ILP32E-FPELIM-NEXT:    ret
1265;
1266; ILP32E-WITHFP-LABEL: va2_caller:
1267; ILP32E-WITHFP:       # %bb.0:
1268; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1269; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1270; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1271; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1272; ILP32E-WITHFP-NEXT:    lui a2, 261888
1273; ILP32E-WITHFP-NEXT:    li a1, 0
1274; ILP32E-WITHFP-NEXT:    call va2
1275; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1276; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1277; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1278; ILP32E-WITHFP-NEXT:    ret
1279;
1280; LP64-LP64F-LP64D-FPELIM-LABEL: va2_caller:
1281; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1282; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -16
1283; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1284; LP64-LP64F-LP64D-FPELIM-NEXT:    li a1, 1023
1285; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a1, a1, 52
1286; LP64-LP64F-LP64D-FPELIM-NEXT:    call va2
1287; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1288; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 16
1289; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1290;
1291; LP64-LP64F-LP64D-WITHFP-LABEL: va2_caller:
1292; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1293; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -16
1294; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1295; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
1296; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 16
1297; LP64-LP64F-LP64D-WITHFP-NEXT:    li a1, 1023
1298; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a1, a1, 52
1299; LP64-LP64F-LP64D-WITHFP-NEXT:    call va2
1300; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1301; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1302; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 16
1303; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1304;
1305; LP64E-FPELIM-LABEL: va2_caller:
1306; LP64E-FPELIM:       # %bb.0:
1307; LP64E-FPELIM-NEXT:    addi sp, sp, -8
1308; LP64E-FPELIM-NEXT:    sd ra, 0(sp) # 8-byte Folded Spill
1309; LP64E-FPELIM-NEXT:    li a1, 1023
1310; LP64E-FPELIM-NEXT:    slli a1, a1, 52
1311; LP64E-FPELIM-NEXT:    call va2
1312; LP64E-FPELIM-NEXT:    ld ra, 0(sp) # 8-byte Folded Reload
1313; LP64E-FPELIM-NEXT:    addi sp, sp, 8
1314; LP64E-FPELIM-NEXT:    ret
1315;
1316; LP64E-WITHFP-LABEL: va2_caller:
1317; LP64E-WITHFP:       # %bb.0:
1318; LP64E-WITHFP-NEXT:    addi sp, sp, -16
1319; LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1320; LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
1321; LP64E-WITHFP-NEXT:    addi s0, sp, 16
1322; LP64E-WITHFP-NEXT:    li a1, 1023
1323; LP64E-WITHFP-NEXT:    slli a1, a1, 52
1324; LP64E-WITHFP-NEXT:    call va2
1325; LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1326; LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1327; LP64E-WITHFP-NEXT:    addi sp, sp, 16
1328; LP64E-WITHFP-NEXT:    ret
1329 %1 = call i64 (ptr, ...) @va2(ptr undef, double 1.000000e+00)
1330 ret void
1331}
1332
1333; On RV32, Ensure a named 2*xlen argument is passed in a1 and a2, while the
1334; vararg double is passed in a4 and a5 (rather than a3 and a4)
1335
1336define i64 @va3(i32 %a, i64 %b, ...) nounwind {
1337; ILP32-ILP32F-FPELIM-LABEL: va3:
1338; ILP32-ILP32F-FPELIM:       # %bb.0:
1339; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -32
1340; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 28(sp)
1341; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 12(sp)
1342; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 16(sp)
1343; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 20(sp)
1344; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 24(sp)
1345; ILP32-ILP32F-FPELIM-NEXT:    addi a0, sp, 12
1346; ILP32-ILP32F-FPELIM-NEXT:    addi a3, sp, 19
1347; ILP32-ILP32F-FPELIM-NEXT:    addi a4, sp, 27
1348; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 4(sp)
1349; ILP32-ILP32F-FPELIM-NEXT:    andi a3, a3, -8
1350; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 4(sp)
1351; ILP32-ILP32F-FPELIM-NEXT:    lw a0, 4(a3)
1352; ILP32-ILP32F-FPELIM-NEXT:    lw a3, 0(a3)
1353; ILP32-ILP32F-FPELIM-NEXT:    add a2, a2, a0
1354; ILP32-ILP32F-FPELIM-NEXT:    add a0, a1, a3
1355; ILP32-ILP32F-FPELIM-NEXT:    sltu a1, a0, a1
1356; ILP32-ILP32F-FPELIM-NEXT:    add a1, a2, a1
1357; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 32
1358; ILP32-ILP32F-FPELIM-NEXT:    ret
1359;
1360; ILP32-ILP32F-WITHFP-LABEL: va3:
1361; ILP32-ILP32F-WITHFP:       # %bb.0:
1362; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
1363; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
1364; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
1365; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 24
1366; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 20(s0)
1367; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 4(s0)
1368; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 8(s0)
1369; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 12(s0)
1370; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 16(s0)
1371; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 4
1372; ILP32-ILP32F-WITHFP-NEXT:    addi a3, s0, 11
1373; ILP32-ILP32F-WITHFP-NEXT:    addi a4, s0, 19
1374; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -12(s0)
1375; ILP32-ILP32F-WITHFP-NEXT:    andi a3, a3, -8
1376; ILP32-ILP32F-WITHFP-NEXT:    sw a4, -12(s0)
1377; ILP32-ILP32F-WITHFP-NEXT:    lw a0, 4(a3)
1378; ILP32-ILP32F-WITHFP-NEXT:    lw a3, 0(a3)
1379; ILP32-ILP32F-WITHFP-NEXT:    add a2, a2, a0
1380; ILP32-ILP32F-WITHFP-NEXT:    add a0, a1, a3
1381; ILP32-ILP32F-WITHFP-NEXT:    sltu a1, a0, a1
1382; ILP32-ILP32F-WITHFP-NEXT:    add a1, a2, a1
1383; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
1384; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
1385; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
1386; ILP32-ILP32F-WITHFP-NEXT:    ret
1387;
1388; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3:
1389; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1390; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -32
1391; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 28(sp)
1392; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 12(sp)
1393; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 16(sp)
1394; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 20(sp)
1395; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 24(sp)
1396; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, sp, 12
1397; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a3, sp, 19
1398; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a4, sp, 27
1399; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 4(sp)
1400; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a3, a3, -8
1401; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 4(sp)
1402; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 4(a3)
1403; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a3, 0(a3)
1404; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a2, a2, a0
1405; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a0, a1, a3
1406; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sltu a1, a0, a1
1407; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, a2, a1
1408; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 32
1409; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1410;
1411; ILP32E-FPELIM-LABEL: va3:
1412; ILP32E-FPELIM:       # %bb.0:
1413; ILP32E-FPELIM-NEXT:    addi sp, sp, -20
1414; ILP32E-FPELIM-NEXT:    sw a3, 8(sp)
1415; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
1416; ILP32E-FPELIM-NEXT:    sw a5, 16(sp)
1417; ILP32E-FPELIM-NEXT:    addi a0, sp, 8
1418; ILP32E-FPELIM-NEXT:    addi a3, sp, 15
1419; ILP32E-FPELIM-NEXT:    addi a4, sp, 23
1420; ILP32E-FPELIM-NEXT:    sw a0, 0(sp)
1421; ILP32E-FPELIM-NEXT:    andi a3, a3, -8
1422; ILP32E-FPELIM-NEXT:    sw a4, 0(sp)
1423; ILP32E-FPELIM-NEXT:    lw a0, 4(a3)
1424; ILP32E-FPELIM-NEXT:    lw a3, 0(a3)
1425; ILP32E-FPELIM-NEXT:    add a2, a2, a0
1426; ILP32E-FPELIM-NEXT:    add a0, a1, a3
1427; ILP32E-FPELIM-NEXT:    sltu a1, a0, a1
1428; ILP32E-FPELIM-NEXT:    add a1, a2, a1
1429; ILP32E-FPELIM-NEXT:    addi sp, sp, 20
1430; ILP32E-FPELIM-NEXT:    ret
1431;
1432; ILP32E-WITHFP-LABEL: va3:
1433; ILP32E-WITHFP:       # %bb.0:
1434; ILP32E-WITHFP-NEXT:    addi sp, sp, -28
1435; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
1436; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
1437; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
1438; ILP32E-WITHFP-NEXT:    sw a3, 4(s0)
1439; ILP32E-WITHFP-NEXT:    sw a4, 8(s0)
1440; ILP32E-WITHFP-NEXT:    sw a5, 12(s0)
1441; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
1442; ILP32E-WITHFP-NEXT:    addi a3, s0, 11
1443; ILP32E-WITHFP-NEXT:    addi a4, s0, 19
1444; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
1445; ILP32E-WITHFP-NEXT:    andi a3, a3, -8
1446; ILP32E-WITHFP-NEXT:    sw a4, -12(s0)
1447; ILP32E-WITHFP-NEXT:    lw a0, 4(a3)
1448; ILP32E-WITHFP-NEXT:    lw a3, 0(a3)
1449; ILP32E-WITHFP-NEXT:    add a2, a2, a0
1450; ILP32E-WITHFP-NEXT:    add a0, a1, a3
1451; ILP32E-WITHFP-NEXT:    sltu a1, a0, a1
1452; ILP32E-WITHFP-NEXT:    add a1, a2, a1
1453; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
1454; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
1455; ILP32E-WITHFP-NEXT:    addi sp, sp, 28
1456; ILP32E-WITHFP-NEXT:    ret
1457;
1458; LP64-LP64F-LP64D-FPELIM-LABEL: va3:
1459; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1460; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -64
1461; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 48(sp)
1462; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 56(sp)
1463; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 16(sp)
1464; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 24(sp)
1465; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 32(sp)
1466; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 40(sp)
1467; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a3, sp, 31
1468; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, a1, a2
1469; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 8(sp)
1470; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 64
1471; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1472;
1473; LP64-LP64F-LP64D-WITHFP-LABEL: va3:
1474; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1475; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -80
1476; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1477; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1478; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
1479; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 32(s0)
1480; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 40(s0)
1481; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 0(s0)
1482; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 8(s0)
1483; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 16(s0)
1484; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 24(s0)
1485; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a3, s0, 15
1486; LP64-LP64F-LP64D-WITHFP-NEXT:    add a0, a1, a2
1487; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, -24(s0)
1488; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1489; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1490; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 80
1491; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1492;
1493; LP64E-FPELIM-LABEL: va3:
1494; LP64E-FPELIM:       # %bb.0:
1495; LP64E-FPELIM-NEXT:    addi sp, sp, -40
1496; LP64E-FPELIM-NEXT:    sd a2, 8(sp)
1497; LP64E-FPELIM-NEXT:    sd a3, 16(sp)
1498; LP64E-FPELIM-NEXT:    sd a4, 24(sp)
1499; LP64E-FPELIM-NEXT:    sd a5, 32(sp)
1500; LP64E-FPELIM-NEXT:    addi a3, sp, 23
1501; LP64E-FPELIM-NEXT:    add a0, a1, a2
1502; LP64E-FPELIM-NEXT:    sd a3, 0(sp)
1503; LP64E-FPELIM-NEXT:    addi sp, sp, 40
1504; LP64E-FPELIM-NEXT:    ret
1505;
1506; LP64E-WITHFP-LABEL: va3:
1507; LP64E-WITHFP:       # %bb.0:
1508; LP64E-WITHFP-NEXT:    addi sp, sp, -56
1509; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
1510; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
1511; LP64E-WITHFP-NEXT:    addi s0, sp, 24
1512; LP64E-WITHFP-NEXT:    sd a2, 0(s0)
1513; LP64E-WITHFP-NEXT:    sd a3, 8(s0)
1514; LP64E-WITHFP-NEXT:    sd a4, 16(s0)
1515; LP64E-WITHFP-NEXT:    sd a5, 24(s0)
1516; LP64E-WITHFP-NEXT:    addi a3, s0, 15
1517; LP64E-WITHFP-NEXT:    add a0, a1, a2
1518; LP64E-WITHFP-NEXT:    sd a3, -24(s0)
1519; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
1520; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
1521; LP64E-WITHFP-NEXT:    addi sp, sp, 56
1522; LP64E-WITHFP-NEXT:    ret
1523  %va = alloca ptr
1524  call void @llvm.va_start(ptr %va)
1525  %argp.cur = load ptr, ptr %va
1526  %ptrint = ptrtoint ptr %argp.cur to iXLen
1527  %1 = add iXLen %ptrint, 7
1528  %2 = and iXLen %1, -8
1529  %argp.cur.aligned = inttoptr iXLen %1 to ptr
1530  %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8
1531  store ptr %argp.next, ptr %va
1532  %3 = inttoptr iXLen %2 to ptr
1533  %4 = load double, ptr %3, align 8
1534  call void @llvm.va_end(ptr %va)
1535  %5 = bitcast double %4 to i64
1536  %6 = add i64 %b, %5
1537  ret i64 %6
1538}
1539
1540define i64 @va3_va_arg(i32 %a, i64 %b, ...) nounwind {
1541; ILP32-ILP32F-FPELIM-LABEL: va3_va_arg:
1542; ILP32-ILP32F-FPELIM:       # %bb.0:
1543; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -32
1544; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 28(sp)
1545; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 12(sp)
1546; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 16(sp)
1547; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 20(sp)
1548; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 24(sp)
1549; ILP32-ILP32F-FPELIM-NEXT:    addi a0, sp, 19
1550; ILP32-ILP32F-FPELIM-NEXT:    andi a0, a0, -8
1551; ILP32-ILP32F-FPELIM-NEXT:    addi a3, a0, 4
1552; ILP32-ILP32F-FPELIM-NEXT:    addi a4, a0, 8
1553; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 4(sp)
1554; ILP32-ILP32F-FPELIM-NEXT:    lw a3, 0(a0)
1555; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 4(sp)
1556; ILP32-ILP32F-FPELIM-NEXT:    lw a4, 4(a0)
1557; ILP32-ILP32F-FPELIM-NEXT:    add a0, a1, a3
1558; ILP32-ILP32F-FPELIM-NEXT:    sltu a1, a0, a1
1559; ILP32-ILP32F-FPELIM-NEXT:    add a2, a2, a4
1560; ILP32-ILP32F-FPELIM-NEXT:    add a1, a2, a1
1561; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 32
1562; ILP32-ILP32F-FPELIM-NEXT:    ret
1563;
1564; ILP32-ILP32F-WITHFP-LABEL: va3_va_arg:
1565; ILP32-ILP32F-WITHFP:       # %bb.0:
1566; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
1567; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 20(sp) # 4-byte Folded Spill
1568; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 16(sp) # 4-byte Folded Spill
1569; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 24
1570; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 20(s0)
1571; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 4(s0)
1572; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 8(s0)
1573; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 12(s0)
1574; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 16(s0)
1575; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 11
1576; ILP32-ILP32F-WITHFP-NEXT:    andi a0, a0, -8
1577; ILP32-ILP32F-WITHFP-NEXT:    addi a3, a0, 4
1578; ILP32-ILP32F-WITHFP-NEXT:    addi a4, a0, 8
1579; ILP32-ILP32F-WITHFP-NEXT:    sw a3, -12(s0)
1580; ILP32-ILP32F-WITHFP-NEXT:    lw a3, 0(a0)
1581; ILP32-ILP32F-WITHFP-NEXT:    sw a4, -12(s0)
1582; ILP32-ILP32F-WITHFP-NEXT:    lw a4, 4(a0)
1583; ILP32-ILP32F-WITHFP-NEXT:    add a0, a1, a3
1584; ILP32-ILP32F-WITHFP-NEXT:    sltu a1, a0, a1
1585; ILP32-ILP32F-WITHFP-NEXT:    add a2, a2, a4
1586; ILP32-ILP32F-WITHFP-NEXT:    add a1, a2, a1
1587; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 20(sp) # 4-byte Folded Reload
1588; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 16(sp) # 4-byte Folded Reload
1589; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
1590; ILP32-ILP32F-WITHFP-NEXT:    ret
1591;
1592; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_va_arg:
1593; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1594; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
1595; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
1596; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
1597; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
1598; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
1599; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
1600; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, sp, 35
1601; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a0, a0, -8
1602; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a3, a0, 8
1603; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 20(sp)
1604; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    fld fa5, 0(a0)
1605; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    fsd fa5, 8(sp)
1606; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 12(sp)
1607; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a3, 8(sp)
1608; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a2, a2, a0
1609; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a0, a1, a3
1610; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sltu a1, a0, a1
1611; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, a2, a1
1612; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
1613; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1614;
1615; ILP32E-FPELIM-LABEL: va3_va_arg:
1616; ILP32E-FPELIM:       # %bb.0:
1617; ILP32E-FPELIM-NEXT:    addi sp, sp, -20
1618; ILP32E-FPELIM-NEXT:    sw a3, 8(sp)
1619; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
1620; ILP32E-FPELIM-NEXT:    sw a5, 16(sp)
1621; ILP32E-FPELIM-NEXT:    addi a0, sp, 15
1622; ILP32E-FPELIM-NEXT:    andi a0, a0, -8
1623; ILP32E-FPELIM-NEXT:    addi a3, a0, 4
1624; ILP32E-FPELIM-NEXT:    addi a4, a0, 8
1625; ILP32E-FPELIM-NEXT:    sw a3, 0(sp)
1626; ILP32E-FPELIM-NEXT:    lw a3, 0(a0)
1627; ILP32E-FPELIM-NEXT:    sw a4, 0(sp)
1628; ILP32E-FPELIM-NEXT:    lw a4, 4(a0)
1629; ILP32E-FPELIM-NEXT:    add a0, a1, a3
1630; ILP32E-FPELIM-NEXT:    sltu a1, a0, a1
1631; ILP32E-FPELIM-NEXT:    add a2, a2, a4
1632; ILP32E-FPELIM-NEXT:    add a1, a2, a1
1633; ILP32E-FPELIM-NEXT:    addi sp, sp, 20
1634; ILP32E-FPELIM-NEXT:    ret
1635;
1636; ILP32E-WITHFP-LABEL: va3_va_arg:
1637; ILP32E-WITHFP:       # %bb.0:
1638; ILP32E-WITHFP-NEXT:    addi sp, sp, -28
1639; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
1640; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
1641; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
1642; ILP32E-WITHFP-NEXT:    sw a3, 4(s0)
1643; ILP32E-WITHFP-NEXT:    sw a4, 8(s0)
1644; ILP32E-WITHFP-NEXT:    sw a5, 12(s0)
1645; ILP32E-WITHFP-NEXT:    addi a0, s0, 11
1646; ILP32E-WITHFP-NEXT:    andi a0, a0, -8
1647; ILP32E-WITHFP-NEXT:    addi a3, a0, 4
1648; ILP32E-WITHFP-NEXT:    addi a4, a0, 8
1649; ILP32E-WITHFP-NEXT:    sw a3, -12(s0)
1650; ILP32E-WITHFP-NEXT:    lw a3, 0(a0)
1651; ILP32E-WITHFP-NEXT:    sw a4, -12(s0)
1652; ILP32E-WITHFP-NEXT:    lw a4, 4(a0)
1653; ILP32E-WITHFP-NEXT:    add a0, a1, a3
1654; ILP32E-WITHFP-NEXT:    sltu a1, a0, a1
1655; ILP32E-WITHFP-NEXT:    add a2, a2, a4
1656; ILP32E-WITHFP-NEXT:    add a1, a2, a1
1657; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
1658; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
1659; ILP32E-WITHFP-NEXT:    addi sp, sp, 28
1660; ILP32E-WITHFP-NEXT:    ret
1661;
1662; LP64-LP64F-LP64D-FPELIM-LABEL: va3_va_arg:
1663; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1664; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -64
1665; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 48(sp)
1666; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 56(sp)
1667; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 16(sp)
1668; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 24(sp)
1669; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 32(sp)
1670; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 40(sp)
1671; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a3, sp, 24
1672; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, a1, a2
1673; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 8(sp)
1674; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 64
1675; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1676;
1677; LP64-LP64F-LP64D-WITHFP-LABEL: va3_va_arg:
1678; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1679; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -80
1680; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
1681; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
1682; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
1683; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 32(s0)
1684; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 40(s0)
1685; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 0(s0)
1686; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 8(s0)
1687; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 16(s0)
1688; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 24(s0)
1689; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a3, s0, 8
1690; LP64-LP64F-LP64D-WITHFP-NEXT:    add a0, a1, a2
1691; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, -24(s0)
1692; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
1693; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
1694; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 80
1695; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1696;
1697; LP64E-FPELIM-LABEL: va3_va_arg:
1698; LP64E-FPELIM:       # %bb.0:
1699; LP64E-FPELIM-NEXT:    addi sp, sp, -40
1700; LP64E-FPELIM-NEXT:    sd a2, 8(sp)
1701; LP64E-FPELIM-NEXT:    sd a3, 16(sp)
1702; LP64E-FPELIM-NEXT:    sd a4, 24(sp)
1703; LP64E-FPELIM-NEXT:    sd a5, 32(sp)
1704; LP64E-FPELIM-NEXT:    addi a3, sp, 16
1705; LP64E-FPELIM-NEXT:    add a0, a1, a2
1706; LP64E-FPELIM-NEXT:    sd a3, 0(sp)
1707; LP64E-FPELIM-NEXT:    addi sp, sp, 40
1708; LP64E-FPELIM-NEXT:    ret
1709;
1710; LP64E-WITHFP-LABEL: va3_va_arg:
1711; LP64E-WITHFP:       # %bb.0:
1712; LP64E-WITHFP-NEXT:    addi sp, sp, -56
1713; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
1714; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
1715; LP64E-WITHFP-NEXT:    addi s0, sp, 24
1716; LP64E-WITHFP-NEXT:    sd a2, 0(s0)
1717; LP64E-WITHFP-NEXT:    sd a3, 8(s0)
1718; LP64E-WITHFP-NEXT:    sd a4, 16(s0)
1719; LP64E-WITHFP-NEXT:    sd a5, 24(s0)
1720; LP64E-WITHFP-NEXT:    addi a3, s0, 8
1721; LP64E-WITHFP-NEXT:    add a0, a1, a2
1722; LP64E-WITHFP-NEXT:    sd a3, -24(s0)
1723; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
1724; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
1725; LP64E-WITHFP-NEXT:    addi sp, sp, 56
1726; LP64E-WITHFP-NEXT:    ret
1727  %va = alloca ptr
1728  call void @llvm.va_start(ptr %va)
1729  %1 = va_arg ptr %va, double
1730  call void @llvm.va_end(ptr %va)
1731  %2 = bitcast double %1 to i64
1732  %3 = add i64 %b, %2
1733  ret i64 %3
1734}
1735
1736define void @va3_caller() nounwind {
1737; ILP32-ILP32F-FPELIM-LABEL: va3_caller:
1738; ILP32-ILP32F-FPELIM:       # %bb.0:
1739; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -16
1740; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1741; ILP32-ILP32F-FPELIM-NEXT:    li a0, 2
1742; ILP32-ILP32F-FPELIM-NEXT:    li a1, 1111
1743; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 262144
1744; ILP32-ILP32F-FPELIM-NEXT:    li a2, 0
1745; ILP32-ILP32F-FPELIM-NEXT:    li a4, 0
1746; ILP32-ILP32F-FPELIM-NEXT:    call va3
1747; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1748; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 16
1749; ILP32-ILP32F-FPELIM-NEXT:    ret
1750;
1751; ILP32-ILP32F-WITHFP-LABEL: va3_caller:
1752; ILP32-ILP32F-WITHFP:       # %bb.0:
1753; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -16
1754; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1755; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1756; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
1757; ILP32-ILP32F-WITHFP-NEXT:    li a0, 2
1758; ILP32-ILP32F-WITHFP-NEXT:    li a1, 1111
1759; ILP32-ILP32F-WITHFP-NEXT:    lui a5, 262144
1760; ILP32-ILP32F-WITHFP-NEXT:    li a2, 0
1761; ILP32-ILP32F-WITHFP-NEXT:    li a4, 0
1762; ILP32-ILP32F-WITHFP-NEXT:    call va3
1763; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1764; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1765; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 16
1766; ILP32-ILP32F-WITHFP-NEXT:    ret
1767;
1768; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va3_caller:
1769; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1770; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -16
1771; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1772; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a0, 2
1773; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a1, 1111
1774; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 262144
1775; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a2, 0
1776; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a4, 0
1777; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call va3
1778; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1779; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 16
1780; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
1781;
1782; ILP32E-FPELIM-LABEL: va3_caller:
1783; ILP32E-FPELIM:       # %bb.0:
1784; ILP32E-FPELIM-NEXT:    addi sp, sp, -4
1785; ILP32E-FPELIM-NEXT:    sw ra, 0(sp) # 4-byte Folded Spill
1786; ILP32E-FPELIM-NEXT:    li a0, 2
1787; ILP32E-FPELIM-NEXT:    li a1, 1111
1788; ILP32E-FPELIM-NEXT:    lui a4, 262144
1789; ILP32E-FPELIM-NEXT:    li a2, 0
1790; ILP32E-FPELIM-NEXT:    li a3, 0
1791; ILP32E-FPELIM-NEXT:    call va3
1792; ILP32E-FPELIM-NEXT:    lw ra, 0(sp) # 4-byte Folded Reload
1793; ILP32E-FPELIM-NEXT:    addi sp, sp, 4
1794; ILP32E-FPELIM-NEXT:    ret
1795;
1796; ILP32E-WITHFP-LABEL: va3_caller:
1797; ILP32E-WITHFP:       # %bb.0:
1798; ILP32E-WITHFP-NEXT:    addi sp, sp, -8
1799; ILP32E-WITHFP-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
1800; ILP32E-WITHFP-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
1801; ILP32E-WITHFP-NEXT:    addi s0, sp, 8
1802; ILP32E-WITHFP-NEXT:    li a0, 2
1803; ILP32E-WITHFP-NEXT:    li a1, 1111
1804; ILP32E-WITHFP-NEXT:    lui a4, 262144
1805; ILP32E-WITHFP-NEXT:    li a2, 0
1806; ILP32E-WITHFP-NEXT:    li a3, 0
1807; ILP32E-WITHFP-NEXT:    call va3
1808; ILP32E-WITHFP-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
1809; ILP32E-WITHFP-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
1810; ILP32E-WITHFP-NEXT:    addi sp, sp, 8
1811; ILP32E-WITHFP-NEXT:    ret
1812;
1813; LP64-LP64F-LP64D-FPELIM-LABEL: va3_caller:
1814; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
1815; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -16
1816; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1817; LP64-LP64F-LP64D-FPELIM-NEXT:    li a2, 1
1818; LP64-LP64F-LP64D-FPELIM-NEXT:    li a0, 2
1819; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a2, a2, 62
1820; LP64-LP64F-LP64D-FPELIM-NEXT:    li a1, 1111
1821; LP64-LP64F-LP64D-FPELIM-NEXT:    call va3
1822; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1823; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 16
1824; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
1825;
1826; LP64-LP64F-LP64D-WITHFP-LABEL: va3_caller:
1827; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
1828; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -16
1829; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1830; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
1831; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 16
1832; LP64-LP64F-LP64D-WITHFP-NEXT:    li a2, 1
1833; LP64-LP64F-LP64D-WITHFP-NEXT:    li a0, 2
1834; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a2, a2, 62
1835; LP64-LP64F-LP64D-WITHFP-NEXT:    li a1, 1111
1836; LP64-LP64F-LP64D-WITHFP-NEXT:    call va3
1837; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1838; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1839; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 16
1840; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
1841;
1842; LP64E-FPELIM-LABEL: va3_caller:
1843; LP64E-FPELIM:       # %bb.0:
1844; LP64E-FPELIM-NEXT:    addi sp, sp, -8
1845; LP64E-FPELIM-NEXT:    sd ra, 0(sp) # 8-byte Folded Spill
1846; LP64E-FPELIM-NEXT:    li a2, 1
1847; LP64E-FPELIM-NEXT:    li a0, 2
1848; LP64E-FPELIM-NEXT:    slli a2, a2, 62
1849; LP64E-FPELIM-NEXT:    li a1, 1111
1850; LP64E-FPELIM-NEXT:    call va3
1851; LP64E-FPELIM-NEXT:    ld ra, 0(sp) # 8-byte Folded Reload
1852; LP64E-FPELIM-NEXT:    addi sp, sp, 8
1853; LP64E-FPELIM-NEXT:    ret
1854;
1855; LP64E-WITHFP-LABEL: va3_caller:
1856; LP64E-WITHFP:       # %bb.0:
1857; LP64E-WITHFP-NEXT:    addi sp, sp, -16
1858; LP64E-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
1859; LP64E-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
1860; LP64E-WITHFP-NEXT:    addi s0, sp, 16
1861; LP64E-WITHFP-NEXT:    li a2, 1
1862; LP64E-WITHFP-NEXT:    li a0, 2
1863; LP64E-WITHFP-NEXT:    slli a2, a2, 62
1864; LP64E-WITHFP-NEXT:    li a1, 1111
1865; LP64E-WITHFP-NEXT:    call va3
1866; LP64E-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
1867; LP64E-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
1868; LP64E-WITHFP-NEXT:    addi sp, sp, 16
1869; LP64E-WITHFP-NEXT:    ret
1870 %1 = call i64 (i32, i64, ...) @va3(i32 2, i64 1111, double 2.000000e+00)
1871 ret void
1872}
1873
1874declare void @llvm.va_copy(ptr, ptr)
1875
1876define i32 @va4_va_copy(i32 %argno, ...) nounwind {
1877; ILP32-ILP32F-FPELIM-LABEL: va4_va_copy:
1878; ILP32-ILP32F-FPELIM:       # %bb.0:
1879; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
1880; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1881; ILP32-ILP32F-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1882; ILP32-ILP32F-FPELIM-NEXT:    mv s0, a1
1883; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
1884; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
1885; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
1886; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
1887; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
1888; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
1889; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
1890; ILP32-ILP32F-FPELIM-NEXT:    addi a0, sp, 24
1891; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 4(sp)
1892; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 0(sp)
1893; ILP32-ILP32F-FPELIM-NEXT:    call notdead
1894; ILP32-ILP32F-FPELIM-NEXT:    lw a0, 4(sp)
1895; ILP32-ILP32F-FPELIM-NEXT:    addi a0, a0, 3
1896; ILP32-ILP32F-FPELIM-NEXT:    andi a0, a0, -4
1897; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a0, 4
1898; ILP32-ILP32F-FPELIM-NEXT:    addi a2, a0, 7
1899; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 4(sp)
1900; ILP32-ILP32F-FPELIM-NEXT:    andi a2, a2, -4
1901; ILP32-ILP32F-FPELIM-NEXT:    lw a0, 0(a0)
1902; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a2, 4
1903; ILP32-ILP32F-FPELIM-NEXT:    addi a3, a2, 7
1904; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 4(sp)
1905; ILP32-ILP32F-FPELIM-NEXT:    andi a3, a3, -4
1906; ILP32-ILP32F-FPELIM-NEXT:    lw a1, 0(a2)
1907; ILP32-ILP32F-FPELIM-NEXT:    addi a2, a3, 4
1908; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 4(sp)
1909; ILP32-ILP32F-FPELIM-NEXT:    lw a2, 0(a3)
1910; ILP32-ILP32F-FPELIM-NEXT:    add a0, a0, s0
1911; ILP32-ILP32F-FPELIM-NEXT:    add a0, a0, a1
1912; ILP32-ILP32F-FPELIM-NEXT:    add a0, a0, a2
1913; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1914; ILP32-ILP32F-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
1915; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
1916; ILP32-ILP32F-FPELIM-NEXT:    ret
1917;
1918; ILP32-ILP32F-WITHFP-LABEL: va4_va_copy:
1919; ILP32-ILP32F-WITHFP:       # %bb.0:
1920; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -64
1921; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 28(sp) # 4-byte Folded Spill
1922; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 24(sp) # 4-byte Folded Spill
1923; ILP32-ILP32F-WITHFP-NEXT:    sw s1, 20(sp) # 4-byte Folded Spill
1924; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 32
1925; ILP32-ILP32F-WITHFP-NEXT:    mv s1, a1
1926; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
1927; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
1928; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
1929; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
1930; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
1931; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
1932; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
1933; ILP32-ILP32F-WITHFP-NEXT:    addi a0, s0, 8
1934; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -16(s0)
1935; ILP32-ILP32F-WITHFP-NEXT:    sw a0, -20(s0)
1936; ILP32-ILP32F-WITHFP-NEXT:    call notdead
1937; ILP32-ILP32F-WITHFP-NEXT:    lw a0, -16(s0)
1938; ILP32-ILP32F-WITHFP-NEXT:    addi a0, a0, 3
1939; ILP32-ILP32F-WITHFP-NEXT:    andi a0, a0, -4
1940; ILP32-ILP32F-WITHFP-NEXT:    addi a1, a0, 4
1941; ILP32-ILP32F-WITHFP-NEXT:    addi a2, a0, 7
1942; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -16(s0)
1943; ILP32-ILP32F-WITHFP-NEXT:    andi a2, a2, -4
1944; ILP32-ILP32F-WITHFP-NEXT:    lw a0, 0(a0)
1945; ILP32-ILP32F-WITHFP-NEXT:    addi a1, a2, 4
1946; ILP32-ILP32F-WITHFP-NEXT:    addi a3, a2, 7
1947; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -16(s0)
1948; ILP32-ILP32F-WITHFP-NEXT:    andi a3, a3, -4
1949; ILP32-ILP32F-WITHFP-NEXT:    lw a1, 0(a2)
1950; ILP32-ILP32F-WITHFP-NEXT:    addi a2, a3, 4
1951; ILP32-ILP32F-WITHFP-NEXT:    sw a2, -16(s0)
1952; ILP32-ILP32F-WITHFP-NEXT:    lw a2, 0(a3)
1953; ILP32-ILP32F-WITHFP-NEXT:    add a0, a0, s1
1954; ILP32-ILP32F-WITHFP-NEXT:    add a0, a0, a1
1955; ILP32-ILP32F-WITHFP-NEXT:    add a0, a0, a2
1956; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 28(sp) # 4-byte Folded Reload
1957; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 24(sp) # 4-byte Folded Reload
1958; ILP32-ILP32F-WITHFP-NEXT:    lw s1, 20(sp) # 4-byte Folded Reload
1959; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 64
1960; ILP32-ILP32F-WITHFP-NEXT:    ret
1961;
1962; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va4_va_copy:
1963; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
1964; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
1965; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
1966; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
1967; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv s0, a1
1968; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
1969; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
1970; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
1971; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
1972; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
1973; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
1974; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
1975; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, sp, 24
1976; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 4(sp)
1977; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 0(sp)
1978; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call notdead
1979; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 4(sp)
1980; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, a0, 3
1981; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a0, a0, -4
1982; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a0, 4
1983; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, a0, 7
1984; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 4(sp)
1985; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a2, a2, -4
1986; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a0, 0(a0)
1987; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a2, 4
1988; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a3, a2, 7
1989; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 4(sp)
1990; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    andi a3, a3, -4
1991; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a1, 0(a2)
1992; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, a3, 4
1993; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 4(sp)
1994; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw a2, 0(a3)
1995; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a0, a0, s0
1996; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a0, a0, a1
1997; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a0, a0, a2
1998; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
1999; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2000; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
2001; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
2002;
2003; ILP32E-FPELIM-LABEL: va4_va_copy:
2004; ILP32E-FPELIM:       # %bb.0:
2005; ILP32E-FPELIM-NEXT:    addi sp, sp, -40
2006; ILP32E-FPELIM-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2007; ILP32E-FPELIM-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2008; ILP32E-FPELIM-NEXT:    mv s0, a1
2009; ILP32E-FPELIM-NEXT:    sw a5, 36(sp)
2010; ILP32E-FPELIM-NEXT:    sw a1, 20(sp)
2011; ILP32E-FPELIM-NEXT:    sw a2, 24(sp)
2012; ILP32E-FPELIM-NEXT:    sw a3, 28(sp)
2013; ILP32E-FPELIM-NEXT:    sw a4, 32(sp)
2014; ILP32E-FPELIM-NEXT:    addi a0, sp, 24
2015; ILP32E-FPELIM-NEXT:    sw a0, 4(sp)
2016; ILP32E-FPELIM-NEXT:    sw a0, 0(sp)
2017; ILP32E-FPELIM-NEXT:    call notdead
2018; ILP32E-FPELIM-NEXT:    lw a0, 4(sp)
2019; ILP32E-FPELIM-NEXT:    addi a0, a0, 3
2020; ILP32E-FPELIM-NEXT:    andi a0, a0, -4
2021; ILP32E-FPELIM-NEXT:    addi a1, a0, 4
2022; ILP32E-FPELIM-NEXT:    addi a2, a0, 7
2023; ILP32E-FPELIM-NEXT:    sw a1, 4(sp)
2024; ILP32E-FPELIM-NEXT:    andi a2, a2, -4
2025; ILP32E-FPELIM-NEXT:    lw a0, 0(a0)
2026; ILP32E-FPELIM-NEXT:    addi a1, a2, 4
2027; ILP32E-FPELIM-NEXT:    addi a3, a2, 7
2028; ILP32E-FPELIM-NEXT:    sw a1, 4(sp)
2029; ILP32E-FPELIM-NEXT:    andi a3, a3, -4
2030; ILP32E-FPELIM-NEXT:    lw a1, 0(a2)
2031; ILP32E-FPELIM-NEXT:    addi a2, a3, 4
2032; ILP32E-FPELIM-NEXT:    sw a2, 4(sp)
2033; ILP32E-FPELIM-NEXT:    lw a2, 0(a3)
2034; ILP32E-FPELIM-NEXT:    add a0, a0, s0
2035; ILP32E-FPELIM-NEXT:    add a0, a0, a1
2036; ILP32E-FPELIM-NEXT:    add a0, a0, a2
2037; ILP32E-FPELIM-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2038; ILP32E-FPELIM-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2039; ILP32E-FPELIM-NEXT:    addi sp, sp, 40
2040; ILP32E-FPELIM-NEXT:    ret
2041;
2042; ILP32E-WITHFP-LABEL: va4_va_copy:
2043; ILP32E-WITHFP:       # %bb.0:
2044; ILP32E-WITHFP-NEXT:    addi sp, sp, -44
2045; ILP32E-WITHFP-NEXT:    sw ra, 16(sp) # 4-byte Folded Spill
2046; ILP32E-WITHFP-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
2047; ILP32E-WITHFP-NEXT:    sw s1, 8(sp) # 4-byte Folded Spill
2048; ILP32E-WITHFP-NEXT:    addi s0, sp, 20
2049; ILP32E-WITHFP-NEXT:    mv s1, a1
2050; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
2051; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
2052; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
2053; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
2054; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
2055; ILP32E-WITHFP-NEXT:    addi a0, s0, 8
2056; ILP32E-WITHFP-NEXT:    sw a0, -16(s0)
2057; ILP32E-WITHFP-NEXT:    sw a0, -20(s0)
2058; ILP32E-WITHFP-NEXT:    call notdead
2059; ILP32E-WITHFP-NEXT:    lw a0, -16(s0)
2060; ILP32E-WITHFP-NEXT:    addi a0, a0, 3
2061; ILP32E-WITHFP-NEXT:    andi a0, a0, -4
2062; ILP32E-WITHFP-NEXT:    addi a1, a0, 4
2063; ILP32E-WITHFP-NEXT:    addi a2, a0, 7
2064; ILP32E-WITHFP-NEXT:    sw a1, -16(s0)
2065; ILP32E-WITHFP-NEXT:    andi a2, a2, -4
2066; ILP32E-WITHFP-NEXT:    lw a0, 0(a0)
2067; ILP32E-WITHFP-NEXT:    addi a1, a2, 4
2068; ILP32E-WITHFP-NEXT:    addi a3, a2, 7
2069; ILP32E-WITHFP-NEXT:    sw a1, -16(s0)
2070; ILP32E-WITHFP-NEXT:    andi a3, a3, -4
2071; ILP32E-WITHFP-NEXT:    lw a1, 0(a2)
2072; ILP32E-WITHFP-NEXT:    addi a2, a3, 4
2073; ILP32E-WITHFP-NEXT:    sw a2, -16(s0)
2074; ILP32E-WITHFP-NEXT:    lw a2, 0(a3)
2075; ILP32E-WITHFP-NEXT:    add a0, a0, s1
2076; ILP32E-WITHFP-NEXT:    add a0, a0, a1
2077; ILP32E-WITHFP-NEXT:    add a0, a0, a2
2078; ILP32E-WITHFP-NEXT:    lw ra, 16(sp) # 4-byte Folded Reload
2079; ILP32E-WITHFP-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
2080; ILP32E-WITHFP-NEXT:    lw s1, 8(sp) # 4-byte Folded Reload
2081; ILP32E-WITHFP-NEXT:    addi sp, sp, 44
2082; ILP32E-WITHFP-NEXT:    ret
2083;
2084; LP64-LP64F-LP64D-FPELIM-LABEL: va4_va_copy:
2085; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
2086; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -96
2087; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2088; LP64-LP64F-LP64D-FPELIM-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2089; LP64-LP64F-LP64D-FPELIM-NEXT:    mv s0, a1
2090; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 72(sp)
2091; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 80(sp)
2092; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 88(sp)
2093; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 40(sp)
2094; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 48(sp)
2095; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 56(sp)
2096; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 64(sp)
2097; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, sp, 48
2098; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 8(sp)
2099; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 0(sp)
2100; LP64-LP64F-LP64D-FPELIM-NEXT:    call notdead
2101; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a0, 8(sp)
2102; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a0, a0, 3
2103; LP64-LP64F-LP64D-FPELIM-NEXT:    andi a0, a0, -4
2104; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, a0, 8
2105; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a2, a0, 11
2106; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
2107; LP64-LP64F-LP64D-FPELIM-NEXT:    andi a2, a2, -4
2108; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a0, 0(a0)
2109; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, a2, 8
2110; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a3, a2, 11
2111; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
2112; LP64-LP64F-LP64D-FPELIM-NEXT:    andi a3, a3, -4
2113; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a1, 0(a2)
2114; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a2, a3, 8
2115; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 8(sp)
2116; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a2, 0(a3)
2117; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, a0, s0
2118; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, a0, a1
2119; LP64-LP64F-LP64D-FPELIM-NEXT:    addw a0, a0, a2
2120; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2121; LP64-LP64F-LP64D-FPELIM-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2122; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 96
2123; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
2124;
2125; LP64-LP64F-LP64D-WITHFP-LABEL: va4_va_copy:
2126; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
2127; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -112
2128; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2129; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2130; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s1, 24(sp) # 8-byte Folded Spill
2131; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 48
2132; LP64-LP64F-LP64D-WITHFP-NEXT:    mv s1, a1
2133; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
2134; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
2135; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
2136; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
2137; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
2138; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
2139; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
2140; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, s0, 16
2141; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, -32(s0)
2142; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, -40(s0)
2143; LP64-LP64F-LP64D-WITHFP-NEXT:    call notdead
2144; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a0, -32(s0)
2145; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, a0, 3
2146; LP64-LP64F-LP64D-WITHFP-NEXT:    andi a0, a0, -4
2147; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, a0, 8
2148; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a2, a0, 11
2149; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -32(s0)
2150; LP64-LP64F-LP64D-WITHFP-NEXT:    andi a2, a2, -4
2151; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a0, 0(a0)
2152; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, a2, 8
2153; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a3, a2, 11
2154; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -32(s0)
2155; LP64-LP64F-LP64D-WITHFP-NEXT:    andi a3, a3, -4
2156; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a1, 0(a2)
2157; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a2, a3, 8
2158; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, -32(s0)
2159; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a2, 0(a3)
2160; LP64-LP64F-LP64D-WITHFP-NEXT:    add a0, a0, s1
2161; LP64-LP64F-LP64D-WITHFP-NEXT:    add a0, a0, a1
2162; LP64-LP64F-LP64D-WITHFP-NEXT:    addw a0, a0, a2
2163; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2164; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2165; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s1, 24(sp) # 8-byte Folded Reload
2166; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 112
2167; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
2168;
2169; LP64E-FPELIM-LABEL: va4_va_copy:
2170; LP64E-FPELIM:       # %bb.0:
2171; LP64E-FPELIM-NEXT:    addi sp, sp, -80
2172; LP64E-FPELIM-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2173; LP64E-FPELIM-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2174; LP64E-FPELIM-NEXT:    mv s0, a1
2175; LP64E-FPELIM-NEXT:    sd a5, 72(sp)
2176; LP64E-FPELIM-NEXT:    sd a1, 40(sp)
2177; LP64E-FPELIM-NEXT:    sd a2, 48(sp)
2178; LP64E-FPELIM-NEXT:    sd a3, 56(sp)
2179; LP64E-FPELIM-NEXT:    sd a4, 64(sp)
2180; LP64E-FPELIM-NEXT:    addi a0, sp, 48
2181; LP64E-FPELIM-NEXT:    sd a0, 8(sp)
2182; LP64E-FPELIM-NEXT:    sd a0, 0(sp)
2183; LP64E-FPELIM-NEXT:    call notdead
2184; LP64E-FPELIM-NEXT:    ld a0, 8(sp)
2185; LP64E-FPELIM-NEXT:    addi a0, a0, 3
2186; LP64E-FPELIM-NEXT:    andi a0, a0, -4
2187; LP64E-FPELIM-NEXT:    addi a1, a0, 8
2188; LP64E-FPELIM-NEXT:    addi a2, a0, 11
2189; LP64E-FPELIM-NEXT:    sd a1, 8(sp)
2190; LP64E-FPELIM-NEXT:    andi a2, a2, -4
2191; LP64E-FPELIM-NEXT:    ld a0, 0(a0)
2192; LP64E-FPELIM-NEXT:    addi a1, a2, 8
2193; LP64E-FPELIM-NEXT:    addi a3, a2, 11
2194; LP64E-FPELIM-NEXT:    sd a1, 8(sp)
2195; LP64E-FPELIM-NEXT:    andi a3, a3, -4
2196; LP64E-FPELIM-NEXT:    ld a1, 0(a2)
2197; LP64E-FPELIM-NEXT:    addi a2, a3, 8
2198; LP64E-FPELIM-NEXT:    sd a2, 8(sp)
2199; LP64E-FPELIM-NEXT:    ld a2, 0(a3)
2200; LP64E-FPELIM-NEXT:    add a0, a0, s0
2201; LP64E-FPELIM-NEXT:    add a0, a0, a1
2202; LP64E-FPELIM-NEXT:    addw a0, a0, a2
2203; LP64E-FPELIM-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2204; LP64E-FPELIM-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2205; LP64E-FPELIM-NEXT:    addi sp, sp, 80
2206; LP64E-FPELIM-NEXT:    ret
2207;
2208; LP64E-WITHFP-LABEL: va4_va_copy:
2209; LP64E-WITHFP:       # %bb.0:
2210; LP64E-WITHFP-NEXT:    addi sp, sp, -88
2211; LP64E-WITHFP-NEXT:    sd ra, 32(sp) # 8-byte Folded Spill
2212; LP64E-WITHFP-NEXT:    sd s0, 24(sp) # 8-byte Folded Spill
2213; LP64E-WITHFP-NEXT:    sd s1, 16(sp) # 8-byte Folded Spill
2214; LP64E-WITHFP-NEXT:    addi s0, sp, 40
2215; LP64E-WITHFP-NEXT:    mv s1, a1
2216; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
2217; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
2218; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
2219; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
2220; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
2221; LP64E-WITHFP-NEXT:    addi a0, s0, 16
2222; LP64E-WITHFP-NEXT:    sd a0, -32(s0)
2223; LP64E-WITHFP-NEXT:    sd a0, -40(s0)
2224; LP64E-WITHFP-NEXT:    call notdead
2225; LP64E-WITHFP-NEXT:    ld a0, -32(s0)
2226; LP64E-WITHFP-NEXT:    addi a0, a0, 3
2227; LP64E-WITHFP-NEXT:    andi a0, a0, -4
2228; LP64E-WITHFP-NEXT:    addi a1, a0, 8
2229; LP64E-WITHFP-NEXT:    addi a2, a0, 11
2230; LP64E-WITHFP-NEXT:    sd a1, -32(s0)
2231; LP64E-WITHFP-NEXT:    andi a2, a2, -4
2232; LP64E-WITHFP-NEXT:    ld a0, 0(a0)
2233; LP64E-WITHFP-NEXT:    addi a1, a2, 8
2234; LP64E-WITHFP-NEXT:    addi a3, a2, 11
2235; LP64E-WITHFP-NEXT:    sd a1, -32(s0)
2236; LP64E-WITHFP-NEXT:    andi a3, a3, -4
2237; LP64E-WITHFP-NEXT:    ld a1, 0(a2)
2238; LP64E-WITHFP-NEXT:    addi a2, a3, 8
2239; LP64E-WITHFP-NEXT:    sd a2, -32(s0)
2240; LP64E-WITHFP-NEXT:    ld a2, 0(a3)
2241; LP64E-WITHFP-NEXT:    add a0, a0, s1
2242; LP64E-WITHFP-NEXT:    add a0, a0, a1
2243; LP64E-WITHFP-NEXT:    addw a0, a0, a2
2244; LP64E-WITHFP-NEXT:    ld ra, 32(sp) # 8-byte Folded Reload
2245; LP64E-WITHFP-NEXT:    ld s0, 24(sp) # 8-byte Folded Reload
2246; LP64E-WITHFP-NEXT:    ld s1, 16(sp) # 8-byte Folded Reload
2247; LP64E-WITHFP-NEXT:    addi sp, sp, 88
2248; LP64E-WITHFP-NEXT:    ret
2249  %vargs = alloca ptr
2250  %wargs = alloca ptr
2251  call void @llvm.va_start(ptr %vargs)
2252  %1 = va_arg ptr %vargs, i32
2253  call void @llvm.va_copy(ptr %wargs, ptr %vargs)
2254  %2 = load ptr, ptr %wargs, align 4
2255  call void @notdead(ptr %2)
2256  %3 = va_arg ptr %vargs, i32
2257  %4 = va_arg ptr %vargs, i32
2258  %5 = va_arg ptr %vargs, i32
2259  call void @llvm.va_end(ptr %vargs)
2260  call void @llvm.va_end(ptr %wargs)
2261  %add1 = add i32 %3, %1
2262  %add2 = add i32 %add1, %4
2263  %add3 = add i32 %add2, %5
2264  ret i32 %add3
2265}
2266
2267; Check 2x*xlen values are aligned appropriately when passed on the stack in a vararg call
2268
2269declare i32 @va5_aligned_stack_callee(i32, ...)
2270
2271define void @va5_aligned_stack_caller() nounwind {
2272; The double should be 8-byte aligned on the stack, but the two-element array
2273; should only be 4-byte aligned
2274; ILP32-ILP32F-FPELIM-LABEL: va5_aligned_stack_caller:
2275; ILP32-ILP32F-FPELIM:       # %bb.0:
2276; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -64
2277; ILP32-ILP32F-FPELIM-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
2278; ILP32-ILP32F-FPELIM-NEXT:    li a4, 17
2279; ILP32-ILP32F-FPELIM-NEXT:    li a5, 16
2280; ILP32-ILP32F-FPELIM-NEXT:    li a6, 15
2281; ILP32-ILP32F-FPELIM-NEXT:    lui a7, 262236
2282; ILP32-ILP32F-FPELIM-NEXT:    lui t0, 377487
2283; ILP32-ILP32F-FPELIM-NEXT:    li t1, 14
2284; ILP32-ILP32F-FPELIM-NEXT:    lui t2, 262153
2285; ILP32-ILP32F-FPELIM-NEXT:    lui t3, 545260
2286; ILP32-ILP32F-FPELIM-NEXT:    lui t4, 964690
2287; ILP32-ILP32F-FPELIM-NEXT:    lui t5, 335544
2288; ILP32-ILP32F-FPELIM-NEXT:    lui t6, 688509
2289; ILP32-ILP32F-FPELIM-NEXT:    li a0, 1
2290; ILP32-ILP32F-FPELIM-NEXT:    li a1, 11
2291; ILP32-ILP32F-FPELIM-NEXT:    addi a2, sp, 32
2292; ILP32-ILP32F-FPELIM-NEXT:    li a3, 12
2293; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 20(sp)
2294; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 24(sp)
2295; ILP32-ILP32F-FPELIM-NEXT:    li a4, 13
2296; ILP32-ILP32F-FPELIM-NEXT:    addi a5, a7, 655
2297; ILP32-ILP32F-FPELIM-NEXT:    addi a7, t0, 1475
2298; ILP32-ILP32F-FPELIM-NEXT:    sw t1, 0(sp)
2299; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 8(sp)
2300; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 12(sp)
2301; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 16(sp)
2302; ILP32-ILP32F-FPELIM-NEXT:    li a7, 4
2303; ILP32-ILP32F-FPELIM-NEXT:    addi a5, t2, 491
2304; ILP32-ILP32F-FPELIM-NEXT:    addi t0, t3, -1967
2305; ILP32-ILP32F-FPELIM-NEXT:    addi t1, t4, -328
2306; ILP32-ILP32F-FPELIM-NEXT:    addi t2, t5, 1311
2307; ILP32-ILP32F-FPELIM-NEXT:    addi a6, t6, -2048
2308; ILP32-ILP32F-FPELIM-NEXT:    sw t2, 32(sp)
2309; ILP32-ILP32F-FPELIM-NEXT:    sw t1, 36(sp)
2310; ILP32-ILP32F-FPELIM-NEXT:    sw t0, 40(sp)
2311; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 44(sp)
2312; ILP32-ILP32F-FPELIM-NEXT:    call va5_aligned_stack_callee
2313; ILP32-ILP32F-FPELIM-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
2314; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 64
2315; ILP32-ILP32F-FPELIM-NEXT:    ret
2316;
2317; ILP32-ILP32F-WITHFP-LABEL: va5_aligned_stack_caller:
2318; ILP32-ILP32F-WITHFP:       # %bb.0:
2319; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -64
2320; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
2321; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
2322; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 64
2323; ILP32-ILP32F-WITHFP-NEXT:    li a4, 17
2324; ILP32-ILP32F-WITHFP-NEXT:    li a5, 16
2325; ILP32-ILP32F-WITHFP-NEXT:    li a6, 15
2326; ILP32-ILP32F-WITHFP-NEXT:    lui a7, 262236
2327; ILP32-ILP32F-WITHFP-NEXT:    lui t0, 377487
2328; ILP32-ILP32F-WITHFP-NEXT:    li t1, 14
2329; ILP32-ILP32F-WITHFP-NEXT:    lui t2, 262153
2330; ILP32-ILP32F-WITHFP-NEXT:    lui t3, 545260
2331; ILP32-ILP32F-WITHFP-NEXT:    lui t4, 964690
2332; ILP32-ILP32F-WITHFP-NEXT:    lui t5, 335544
2333; ILP32-ILP32F-WITHFP-NEXT:    lui t6, 688509
2334; ILP32-ILP32F-WITHFP-NEXT:    li a0, 1
2335; ILP32-ILP32F-WITHFP-NEXT:    li a1, 11
2336; ILP32-ILP32F-WITHFP-NEXT:    addi a2, s0, -32
2337; ILP32-ILP32F-WITHFP-NEXT:    li a3, 12
2338; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(sp)
2339; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 24(sp)
2340; ILP32-ILP32F-WITHFP-NEXT:    li a4, 13
2341; ILP32-ILP32F-WITHFP-NEXT:    addi a5, a7, 655
2342; ILP32-ILP32F-WITHFP-NEXT:    addi a7, t0, 1475
2343; ILP32-ILP32F-WITHFP-NEXT:    sw t1, 0(sp)
2344; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 8(sp)
2345; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 12(sp)
2346; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 16(sp)
2347; ILP32-ILP32F-WITHFP-NEXT:    li a7, 4
2348; ILP32-ILP32F-WITHFP-NEXT:    addi a5, t2, 491
2349; ILP32-ILP32F-WITHFP-NEXT:    addi t0, t3, -1967
2350; ILP32-ILP32F-WITHFP-NEXT:    addi t1, t4, -328
2351; ILP32-ILP32F-WITHFP-NEXT:    addi t2, t5, 1311
2352; ILP32-ILP32F-WITHFP-NEXT:    addi a6, t6, -2048
2353; ILP32-ILP32F-WITHFP-NEXT:    sw t2, -32(s0)
2354; ILP32-ILP32F-WITHFP-NEXT:    sw t1, -28(s0)
2355; ILP32-ILP32F-WITHFP-NEXT:    sw t0, -24(s0)
2356; ILP32-ILP32F-WITHFP-NEXT:    sw a5, -20(s0)
2357; ILP32-ILP32F-WITHFP-NEXT:    call va5_aligned_stack_callee
2358; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
2359; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
2360; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 64
2361; ILP32-ILP32F-WITHFP-NEXT:    ret
2362;
2363; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va5_aligned_stack_caller:
2364; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
2365; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -64
2366; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
2367; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 262236
2368; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a6, 377487
2369; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a4, 17
2370; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a7, 16
2371; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li t0, 15
2372; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li t1, 14
2373; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t2, 262153
2374; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t3, 545260
2375; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t4, 964690
2376; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t5, 335544
2377; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t6, 688509
2378; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a0, 1
2379; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a1, 11
2380; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a2, sp, 32
2381; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a3, 12
2382; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 20(sp)
2383; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 24(sp)
2384; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a4, 13
2385; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a5, a5, 655
2386; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a6, a6, 1475
2387; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw t1, 0(sp)
2388; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 8(sp)
2389; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 12(sp)
2390; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw t0, 16(sp)
2391; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    li a7, 4
2392; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a5, t2, 491
2393; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi t0, t3, -1967
2394; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi t1, t4, -328
2395; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi t2, t5, 1311
2396; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a6, t6, -2048
2397; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw t2, 32(sp)
2398; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw t1, 36(sp)
2399; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw t0, 40(sp)
2400; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 44(sp)
2401; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    call va5_aligned_stack_callee
2402; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
2403; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 64
2404; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
2405;
2406; ILP32E-FPELIM-LABEL: va5_aligned_stack_caller:
2407; ILP32E-FPELIM:       # %bb.0:
2408; ILP32E-FPELIM-NEXT:    addi sp, sp, -64
2409; ILP32E-FPELIM-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
2410; ILP32E-FPELIM-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
2411; ILP32E-FPELIM-NEXT:    addi s0, sp, 64
2412; ILP32E-FPELIM-NEXT:    andi sp, sp, -16
2413; ILP32E-FPELIM-NEXT:    li a3, 17
2414; ILP32E-FPELIM-NEXT:    li a4, 16
2415; ILP32E-FPELIM-NEXT:    li a5, 15
2416; ILP32E-FPELIM-NEXT:    lui a6, 262236
2417; ILP32E-FPELIM-NEXT:    lui a7, 377487
2418; ILP32E-FPELIM-NEXT:    li t0, 14
2419; ILP32E-FPELIM-NEXT:    li t1, 4
2420; ILP32E-FPELIM-NEXT:    lui t2, 262153
2421; ILP32E-FPELIM-NEXT:    lui t3, 545260
2422; ILP32E-FPELIM-NEXT:    lui t4, 964690
2423; ILP32E-FPELIM-NEXT:    lui t5, 335544
2424; ILP32E-FPELIM-NEXT:    lui t6, 688509
2425; ILP32E-FPELIM-NEXT:    li a0, 1
2426; ILP32E-FPELIM-NEXT:    li a1, 11
2427; ILP32E-FPELIM-NEXT:    addi a2, sp, 32
2428; ILP32E-FPELIM-NEXT:    sw a5, 16(sp)
2429; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
2430; ILP32E-FPELIM-NEXT:    sw a3, 24(sp)
2431; ILP32E-FPELIM-NEXT:    li a3, 12
2432; ILP32E-FPELIM-NEXT:    addi a4, a6, 655
2433; ILP32E-FPELIM-NEXT:    addi a5, a7, 1475
2434; ILP32E-FPELIM-NEXT:    sw t1, 0(sp)
2435; ILP32E-FPELIM-NEXT:    sw t0, 4(sp)
2436; ILP32E-FPELIM-NEXT:    sw a5, 8(sp)
2437; ILP32E-FPELIM-NEXT:    sw a4, 12(sp)
2438; ILP32E-FPELIM-NEXT:    li a4, 13
2439; ILP32E-FPELIM-NEXT:    addi a6, t2, 491
2440; ILP32E-FPELIM-NEXT:    addi a7, t3, -1967
2441; ILP32E-FPELIM-NEXT:    addi t0, t4, -328
2442; ILP32E-FPELIM-NEXT:    addi t1, t5, 1311
2443; ILP32E-FPELIM-NEXT:    addi a5, t6, -2048
2444; ILP32E-FPELIM-NEXT:    sw t1, 32(sp)
2445; ILP32E-FPELIM-NEXT:    sw t0, 36(sp)
2446; ILP32E-FPELIM-NEXT:    sw a7, 40(sp)
2447; ILP32E-FPELIM-NEXT:    sw a6, 44(sp)
2448; ILP32E-FPELIM-NEXT:    call va5_aligned_stack_callee
2449; ILP32E-FPELIM-NEXT:    addi sp, s0, -64
2450; ILP32E-FPELIM-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
2451; ILP32E-FPELIM-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
2452; ILP32E-FPELIM-NEXT:    addi sp, sp, 64
2453; ILP32E-FPELIM-NEXT:    ret
2454;
2455; ILP32E-WITHFP-LABEL: va5_aligned_stack_caller:
2456; ILP32E-WITHFP:       # %bb.0:
2457; ILP32E-WITHFP-NEXT:    addi sp, sp, -64
2458; ILP32E-WITHFP-NEXT:    sw ra, 60(sp) # 4-byte Folded Spill
2459; ILP32E-WITHFP-NEXT:    sw s0, 56(sp) # 4-byte Folded Spill
2460; ILP32E-WITHFP-NEXT:    addi s0, sp, 64
2461; ILP32E-WITHFP-NEXT:    andi sp, sp, -16
2462; ILP32E-WITHFP-NEXT:    li a3, 17
2463; ILP32E-WITHFP-NEXT:    li a4, 16
2464; ILP32E-WITHFP-NEXT:    li a5, 15
2465; ILP32E-WITHFP-NEXT:    lui a6, 262236
2466; ILP32E-WITHFP-NEXT:    lui a7, 377487
2467; ILP32E-WITHFP-NEXT:    li t0, 14
2468; ILP32E-WITHFP-NEXT:    li t1, 4
2469; ILP32E-WITHFP-NEXT:    lui t2, 262153
2470; ILP32E-WITHFP-NEXT:    lui t3, 545260
2471; ILP32E-WITHFP-NEXT:    lui t4, 964690
2472; ILP32E-WITHFP-NEXT:    lui t5, 335544
2473; ILP32E-WITHFP-NEXT:    lui t6, 688509
2474; ILP32E-WITHFP-NEXT:    li a0, 1
2475; ILP32E-WITHFP-NEXT:    li a1, 11
2476; ILP32E-WITHFP-NEXT:    addi a2, sp, 32
2477; ILP32E-WITHFP-NEXT:    sw a5, 16(sp)
2478; ILP32E-WITHFP-NEXT:    sw a4, 20(sp)
2479; ILP32E-WITHFP-NEXT:    sw a3, 24(sp)
2480; ILP32E-WITHFP-NEXT:    li a3, 12
2481; ILP32E-WITHFP-NEXT:    addi a4, a6, 655
2482; ILP32E-WITHFP-NEXT:    addi a5, a7, 1475
2483; ILP32E-WITHFP-NEXT:    sw t1, 0(sp)
2484; ILP32E-WITHFP-NEXT:    sw t0, 4(sp)
2485; ILP32E-WITHFP-NEXT:    sw a5, 8(sp)
2486; ILP32E-WITHFP-NEXT:    sw a4, 12(sp)
2487; ILP32E-WITHFP-NEXT:    li a4, 13
2488; ILP32E-WITHFP-NEXT:    addi a6, t2, 491
2489; ILP32E-WITHFP-NEXT:    addi a7, t3, -1967
2490; ILP32E-WITHFP-NEXT:    addi t0, t4, -328
2491; ILP32E-WITHFP-NEXT:    addi t1, t5, 1311
2492; ILP32E-WITHFP-NEXT:    addi a5, t6, -2048
2493; ILP32E-WITHFP-NEXT:    sw t1, 32(sp)
2494; ILP32E-WITHFP-NEXT:    sw t0, 36(sp)
2495; ILP32E-WITHFP-NEXT:    sw a7, 40(sp)
2496; ILP32E-WITHFP-NEXT:    sw a6, 44(sp)
2497; ILP32E-WITHFP-NEXT:    call va5_aligned_stack_callee
2498; ILP32E-WITHFP-NEXT:    addi sp, s0, -64
2499; ILP32E-WITHFP-NEXT:    lw ra, 60(sp) # 4-byte Folded Reload
2500; ILP32E-WITHFP-NEXT:    lw s0, 56(sp) # 4-byte Folded Reload
2501; ILP32E-WITHFP-NEXT:    addi sp, sp, 64
2502; ILP32E-WITHFP-NEXT:    ret
2503;
2504; LP64-LP64F-LP64D-FPELIM-LABEL: va5_aligned_stack_caller:
2505; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
2506; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -48
2507; LP64-LP64F-LP64D-FPELIM-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2508; LP64-LP64F-LP64D-FPELIM-NEXT:    li t0, 17
2509; LP64-LP64F-LP64D-FPELIM-NEXT:    li t1, 16
2510; LP64-LP64F-LP64D-FPELIM-NEXT:    li t2, 15
2511; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a2, %hi(.LCPI11_0)
2512; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a3, %hi(.LCPI11_1)
2513; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a6, %hi(.LCPI11_2)
2514; LP64-LP64F-LP64D-FPELIM-NEXT:    lui t3, 2384
2515; LP64-LP64F-LP64D-FPELIM-NEXT:    li a0, 1
2516; LP64-LP64F-LP64D-FPELIM-NEXT:    li a1, 11
2517; LP64-LP64F-LP64D-FPELIM-NEXT:    li a4, 12
2518; LP64-LP64F-LP64D-FPELIM-NEXT:    li a5, 13
2519; LP64-LP64F-LP64D-FPELIM-NEXT:    li a7, 14
2520; LP64-LP64F-LP64D-FPELIM-NEXT:    ld t4, %lo(.LCPI11_0)(a2)
2521; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a2, %lo(.LCPI11_1)(a3)
2522; LP64-LP64F-LP64D-FPELIM-NEXT:    ld a3, %lo(.LCPI11_2)(a6)
2523; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a6, t3, 761
2524; LP64-LP64F-LP64D-FPELIM-NEXT:    slli a6, a6, 11
2525; LP64-LP64F-LP64D-FPELIM-NEXT:    sd t4, 0(sp)
2526; LP64-LP64F-LP64D-FPELIM-NEXT:    sd t2, 8(sp)
2527; LP64-LP64F-LP64D-FPELIM-NEXT:    sd t1, 16(sp)
2528; LP64-LP64F-LP64D-FPELIM-NEXT:    sd t0, 24(sp)
2529; LP64-LP64F-LP64D-FPELIM-NEXT:    call va5_aligned_stack_callee
2530; LP64-LP64F-LP64D-FPELIM-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2531; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 48
2532; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
2533;
2534; LP64-LP64F-LP64D-WITHFP-LABEL: va5_aligned_stack_caller:
2535; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
2536; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -48
2537; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 40(sp) # 8-byte Folded Spill
2538; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 32(sp) # 8-byte Folded Spill
2539; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 48
2540; LP64-LP64F-LP64D-WITHFP-NEXT:    li t0, 17
2541; LP64-LP64F-LP64D-WITHFP-NEXT:    li t1, 16
2542; LP64-LP64F-LP64D-WITHFP-NEXT:    li t2, 15
2543; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a2, %hi(.LCPI11_0)
2544; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a3, %hi(.LCPI11_1)
2545; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a6, %hi(.LCPI11_2)
2546; LP64-LP64F-LP64D-WITHFP-NEXT:    lui t3, 2384
2547; LP64-LP64F-LP64D-WITHFP-NEXT:    li a0, 1
2548; LP64-LP64F-LP64D-WITHFP-NEXT:    li a1, 11
2549; LP64-LP64F-LP64D-WITHFP-NEXT:    li a4, 12
2550; LP64-LP64F-LP64D-WITHFP-NEXT:    li a5, 13
2551; LP64-LP64F-LP64D-WITHFP-NEXT:    li a7, 14
2552; LP64-LP64F-LP64D-WITHFP-NEXT:    ld t4, %lo(.LCPI11_0)(a2)
2553; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a2, %lo(.LCPI11_1)(a3)
2554; LP64-LP64F-LP64D-WITHFP-NEXT:    ld a3, %lo(.LCPI11_2)(a6)
2555; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a6, t3, 761
2556; LP64-LP64F-LP64D-WITHFP-NEXT:    slli a6, a6, 11
2557; LP64-LP64F-LP64D-WITHFP-NEXT:    sd t4, 0(sp)
2558; LP64-LP64F-LP64D-WITHFP-NEXT:    sd t2, 8(sp)
2559; LP64-LP64F-LP64D-WITHFP-NEXT:    sd t1, 16(sp)
2560; LP64-LP64F-LP64D-WITHFP-NEXT:    sd t0, 24(sp)
2561; LP64-LP64F-LP64D-WITHFP-NEXT:    call va5_aligned_stack_callee
2562; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 40(sp) # 8-byte Folded Reload
2563; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 32(sp) # 8-byte Folded Reload
2564; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 48
2565; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
2566;
2567; LP64E-FPELIM-LABEL: va5_aligned_stack_caller:
2568; LP64E-FPELIM:       # %bb.0:
2569; LP64E-FPELIM-NEXT:    addi sp, sp, -56
2570; LP64E-FPELIM-NEXT:    sd ra, 48(sp) # 8-byte Folded Spill
2571; LP64E-FPELIM-NEXT:    li a2, 17
2572; LP64E-FPELIM-NEXT:    li a3, 16
2573; LP64E-FPELIM-NEXT:    li a6, 15
2574; LP64E-FPELIM-NEXT:    lui a7, %hi(.LCPI11_0)
2575; LP64E-FPELIM-NEXT:    li t0, 14
2576; LP64E-FPELIM-NEXT:    lui t1, 2384
2577; LP64E-FPELIM-NEXT:    lui t2, %hi(.LCPI11_1)
2578; LP64E-FPELIM-NEXT:    lui t3, %hi(.LCPI11_2)
2579; LP64E-FPELIM-NEXT:    li a0, 1
2580; LP64E-FPELIM-NEXT:    li a1, 11
2581; LP64E-FPELIM-NEXT:    li a4, 12
2582; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
2583; LP64E-FPELIM-NEXT:    sd a2, 40(sp)
2584; LP64E-FPELIM-NEXT:    li a5, 13
2585; LP64E-FPELIM-NEXT:    ld a7, %lo(.LCPI11_0)(a7)
2586; LP64E-FPELIM-NEXT:    addiw t1, t1, 761
2587; LP64E-FPELIM-NEXT:    ld a2, %lo(.LCPI11_1)(t2)
2588; LP64E-FPELIM-NEXT:    ld a3, %lo(.LCPI11_2)(t3)
2589; LP64E-FPELIM-NEXT:    slli t1, t1, 11
2590; LP64E-FPELIM-NEXT:    sd t1, 0(sp)
2591; LP64E-FPELIM-NEXT:    sd t0, 8(sp)
2592; LP64E-FPELIM-NEXT:    sd a7, 16(sp)
2593; LP64E-FPELIM-NEXT:    sd a6, 24(sp)
2594; LP64E-FPELIM-NEXT:    call va5_aligned_stack_callee
2595; LP64E-FPELIM-NEXT:    ld ra, 48(sp) # 8-byte Folded Reload
2596; LP64E-FPELIM-NEXT:    addi sp, sp, 56
2597; LP64E-FPELIM-NEXT:    ret
2598;
2599; LP64E-WITHFP-LABEL: va5_aligned_stack_caller:
2600; LP64E-WITHFP:       # %bb.0:
2601; LP64E-WITHFP-NEXT:    addi sp, sp, -64
2602; LP64E-WITHFP-NEXT:    sd ra, 56(sp) # 8-byte Folded Spill
2603; LP64E-WITHFP-NEXT:    sd s0, 48(sp) # 8-byte Folded Spill
2604; LP64E-WITHFP-NEXT:    addi s0, sp, 64
2605; LP64E-WITHFP-NEXT:    li a2, 17
2606; LP64E-WITHFP-NEXT:    li a3, 16
2607; LP64E-WITHFP-NEXT:    li a6, 15
2608; LP64E-WITHFP-NEXT:    lui a7, %hi(.LCPI11_0)
2609; LP64E-WITHFP-NEXT:    li t0, 14
2610; LP64E-WITHFP-NEXT:    lui t1, 2384
2611; LP64E-WITHFP-NEXT:    lui t2, %hi(.LCPI11_1)
2612; LP64E-WITHFP-NEXT:    lui t3, %hi(.LCPI11_2)
2613; LP64E-WITHFP-NEXT:    li a0, 1
2614; LP64E-WITHFP-NEXT:    li a1, 11
2615; LP64E-WITHFP-NEXT:    li a4, 12
2616; LP64E-WITHFP-NEXT:    sd a3, 32(sp)
2617; LP64E-WITHFP-NEXT:    sd a2, 40(sp)
2618; LP64E-WITHFP-NEXT:    li a5, 13
2619; LP64E-WITHFP-NEXT:    ld a7, %lo(.LCPI11_0)(a7)
2620; LP64E-WITHFP-NEXT:    addiw t1, t1, 761
2621; LP64E-WITHFP-NEXT:    ld a2, %lo(.LCPI11_1)(t2)
2622; LP64E-WITHFP-NEXT:    ld a3, %lo(.LCPI11_2)(t3)
2623; LP64E-WITHFP-NEXT:    slli t1, t1, 11
2624; LP64E-WITHFP-NEXT:    sd t1, 0(sp)
2625; LP64E-WITHFP-NEXT:    sd t0, 8(sp)
2626; LP64E-WITHFP-NEXT:    sd a7, 16(sp)
2627; LP64E-WITHFP-NEXT:    sd a6, 24(sp)
2628; LP64E-WITHFP-NEXT:    call va5_aligned_stack_callee
2629; LP64E-WITHFP-NEXT:    ld ra, 56(sp) # 8-byte Folded Reload
2630; LP64E-WITHFP-NEXT:    ld s0, 48(sp) # 8-byte Folded Reload
2631; LP64E-WITHFP-NEXT:    addi sp, sp, 64
2632; LP64E-WITHFP-NEXT:    ret
2633  %1 = call i32 (i32, ...) @va5_aligned_stack_callee(i32 1, i32 11,
2634    fp128 0xLEB851EB851EB851F400091EB851EB851, i32 12, i32 13, i64 20000000000,
2635    i32 14, double 2.720000e+00, i32 15, [2 x i32] [i32 16, i32 17])
2636  ret void
2637}
2638
2639; A function with no fixed arguments is not valid C, but can be
2640; specified in LLVM IR. We must ensure the vararg save area is
2641; still set up correctly.
2642
2643define i32 @va6_no_fixed_args(...) nounwind {
2644; ILP32-ILP32F-FPELIM-LABEL: va6_no_fixed_args:
2645; ILP32-ILP32F-FPELIM:       # %bb.0:
2646; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, -48
2647; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 32(sp)
2648; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 36(sp)
2649; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 40(sp)
2650; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 44(sp)
2651; ILP32-ILP32F-FPELIM-NEXT:    sw a0, 16(sp)
2652; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 20(sp)
2653; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 24(sp)
2654; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 28(sp)
2655; ILP32-ILP32F-FPELIM-NEXT:    addi a1, sp, 20
2656; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
2657; ILP32-ILP32F-FPELIM-NEXT:    addi sp, sp, 48
2658; ILP32-ILP32F-FPELIM-NEXT:    ret
2659;
2660; ILP32-ILP32F-WITHFP-LABEL: va6_no_fixed_args:
2661; ILP32-ILP32F-WITHFP:       # %bb.0:
2662; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -48
2663; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
2664; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
2665; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 16
2666; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
2667; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
2668; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
2669; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
2670; ILP32-ILP32F-WITHFP-NEXT:    sw a0, 0(s0)
2671; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
2672; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
2673; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
2674; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 4
2675; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -12(s0)
2676; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
2677; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
2678; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 48
2679; ILP32-ILP32F-WITHFP-NEXT:    ret
2680;
2681; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va6_no_fixed_args:
2682; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
2683; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, -48
2684; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 32(sp)
2685; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 36(sp)
2686; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 40(sp)
2687; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 44(sp)
2688; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a0, 16(sp)
2689; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 20(sp)
2690; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 24(sp)
2691; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 28(sp)
2692; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, sp, 20
2693; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
2694; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi sp, sp, 48
2695; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
2696;
2697; ILP32E-FPELIM-LABEL: va6_no_fixed_args:
2698; ILP32E-FPELIM:       # %bb.0:
2699; ILP32E-FPELIM-NEXT:    addi sp, sp, -28
2700; ILP32E-FPELIM-NEXT:    sw a4, 20(sp)
2701; ILP32E-FPELIM-NEXT:    sw a5, 24(sp)
2702; ILP32E-FPELIM-NEXT:    sw a0, 4(sp)
2703; ILP32E-FPELIM-NEXT:    sw a1, 8(sp)
2704; ILP32E-FPELIM-NEXT:    sw a2, 12(sp)
2705; ILP32E-FPELIM-NEXT:    sw a3, 16(sp)
2706; ILP32E-FPELIM-NEXT:    addi a1, sp, 8
2707; ILP32E-FPELIM-NEXT:    sw a1, 0(sp)
2708; ILP32E-FPELIM-NEXT:    addi sp, sp, 28
2709; ILP32E-FPELIM-NEXT:    ret
2710;
2711; ILP32E-WITHFP-LABEL: va6_no_fixed_args:
2712; ILP32E-WITHFP:       # %bb.0:
2713; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
2714; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
2715; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
2716; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
2717; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
2718; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
2719; ILP32E-WITHFP-NEXT:    sw a0, 0(s0)
2720; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
2721; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
2722; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
2723; ILP32E-WITHFP-NEXT:    addi a1, s0, 4
2724; ILP32E-WITHFP-NEXT:    sw a1, -12(s0)
2725; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
2726; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
2727; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
2728; ILP32E-WITHFP-NEXT:    ret
2729;
2730; LP64-LP64F-LP64D-FPELIM-LABEL: va6_no_fixed_args:
2731; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
2732; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, -80
2733; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 48(sp)
2734; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 56(sp)
2735; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 64(sp)
2736; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 72(sp)
2737; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 16(sp)
2738; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 24(sp)
2739; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 32(sp)
2740; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 40(sp)
2741; LP64-LP64F-LP64D-FPELIM-NEXT:    addi a1, sp, 24
2742; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 8(sp)
2743; LP64-LP64F-LP64D-FPELIM-NEXT:    addi sp, sp, 80
2744; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
2745;
2746; LP64-LP64F-LP64D-WITHFP-LABEL: va6_no_fixed_args:
2747; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
2748; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -96
2749; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
2750; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
2751; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 32
2752; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
2753; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
2754; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
2755; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
2756; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, 0(s0)
2757; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
2758; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
2759; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
2760; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a1, s0, 8
2761; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, -24(s0)
2762; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
2763; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
2764; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 96
2765; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
2766;
2767; LP64E-FPELIM-LABEL: va6_no_fixed_args:
2768; LP64E-FPELIM:       # %bb.0:
2769; LP64E-FPELIM-NEXT:    addi sp, sp, -56
2770; LP64E-FPELIM-NEXT:    sd a4, 40(sp)
2771; LP64E-FPELIM-NEXT:    sd a5, 48(sp)
2772; LP64E-FPELIM-NEXT:    sd a0, 8(sp)
2773; LP64E-FPELIM-NEXT:    sd a1, 16(sp)
2774; LP64E-FPELIM-NEXT:    sd a2, 24(sp)
2775; LP64E-FPELIM-NEXT:    sd a3, 32(sp)
2776; LP64E-FPELIM-NEXT:    addi a1, sp, 16
2777; LP64E-FPELIM-NEXT:    sd a1, 0(sp)
2778; LP64E-FPELIM-NEXT:    addi sp, sp, 56
2779; LP64E-FPELIM-NEXT:    ret
2780;
2781; LP64E-WITHFP-LABEL: va6_no_fixed_args:
2782; LP64E-WITHFP:       # %bb.0:
2783; LP64E-WITHFP-NEXT:    addi sp, sp, -72
2784; LP64E-WITHFP-NEXT:    sd ra, 16(sp) # 8-byte Folded Spill
2785; LP64E-WITHFP-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
2786; LP64E-WITHFP-NEXT:    addi s0, sp, 24
2787; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
2788; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
2789; LP64E-WITHFP-NEXT:    sd a0, 0(s0)
2790; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
2791; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
2792; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
2793; LP64E-WITHFP-NEXT:    addi a1, s0, 8
2794; LP64E-WITHFP-NEXT:    sd a1, -24(s0)
2795; LP64E-WITHFP-NEXT:    ld ra, 16(sp) # 8-byte Folded Reload
2796; LP64E-WITHFP-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
2797; LP64E-WITHFP-NEXT:    addi sp, sp, 72
2798; LP64E-WITHFP-NEXT:    ret
2799  %va = alloca ptr
2800  call void @llvm.va_start(ptr %va)
2801  %1 = va_arg ptr %va, i32
2802  call void @llvm.va_end(ptr %va)
2803  ret i32 %1
2804}
2805
2806; TODO: improve constant materialization of stack addresses
2807
2808define i32 @va_large_stack(ptr %fmt, ...) {
2809; ILP32-ILP32F-FPELIM-LABEL: va_large_stack:
2810; ILP32-ILP32F-FPELIM:       # %bb.0:
2811; ILP32-ILP32F-FPELIM-NEXT:    lui a0, 24414
2812; ILP32-ILP32F-FPELIM-NEXT:    addi a0, a0, 304
2813; ILP32-ILP32F-FPELIM-NEXT:    sub sp, sp, a0
2814; ILP32-ILP32F-FPELIM-NEXT:    .cfi_def_cfa_offset 100000048
2815; ILP32-ILP32F-FPELIM-NEXT:    mv a0, a1
2816; ILP32-ILP32F-FPELIM-NEXT:    lui t0, 24414
2817; ILP32-ILP32F-FPELIM-NEXT:    add t0, sp, t0
2818; ILP32-ILP32F-FPELIM-NEXT:    sw a5, 292(t0)
2819; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 24414
2820; ILP32-ILP32F-FPELIM-NEXT:    add a5, sp, a5
2821; ILP32-ILP32F-FPELIM-NEXT:    sw a6, 296(a5)
2822; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 24414
2823; ILP32-ILP32F-FPELIM-NEXT:    add a5, sp, a5
2824; ILP32-ILP32F-FPELIM-NEXT:    sw a7, 300(a5)
2825; ILP32-ILP32F-FPELIM-NEXT:    lui a5, 24414
2826; ILP32-ILP32F-FPELIM-NEXT:    add a5, sp, a5
2827; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 276(a5)
2828; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
2829; ILP32-ILP32F-FPELIM-NEXT:    add a1, sp, a1
2830; ILP32-ILP32F-FPELIM-NEXT:    sw a2, 280(a1)
2831; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
2832; ILP32-ILP32F-FPELIM-NEXT:    add a1, sp, a1
2833; ILP32-ILP32F-FPELIM-NEXT:    sw a3, 284(a1)
2834; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
2835; ILP32-ILP32F-FPELIM-NEXT:    add a1, sp, a1
2836; ILP32-ILP32F-FPELIM-NEXT:    sw a4, 288(a1)
2837; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
2838; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a1, 280
2839; ILP32-ILP32F-FPELIM-NEXT:    add a1, sp, a1
2840; ILP32-ILP32F-FPELIM-NEXT:    sw a1, 12(sp)
2841; ILP32-ILP32F-FPELIM-NEXT:    lui a1, 24414
2842; ILP32-ILP32F-FPELIM-NEXT:    addi a1, a1, 304
2843; ILP32-ILP32F-FPELIM-NEXT:    add sp, sp, a1
2844; ILP32-ILP32F-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2845; ILP32-ILP32F-FPELIM-NEXT:    ret
2846;
2847; ILP32-ILP32F-WITHFP-LABEL: va_large_stack:
2848; ILP32-ILP32F-WITHFP:       # %bb.0:
2849; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, -2032
2850; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa_offset 2032
2851; ILP32-ILP32F-WITHFP-NEXT:    sw ra, 1996(sp) # 4-byte Folded Spill
2852; ILP32-ILP32F-WITHFP-NEXT:    sw s0, 1992(sp) # 4-byte Folded Spill
2853; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset ra, -36
2854; ILP32-ILP32F-WITHFP-NEXT:    .cfi_offset s0, -40
2855; ILP32-ILP32F-WITHFP-NEXT:    addi s0, sp, 2000
2856; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa s0, 32
2857; ILP32-ILP32F-WITHFP-NEXT:    lui a0, 24414
2858; ILP32-ILP32F-WITHFP-NEXT:    addi a0, a0, -1728
2859; ILP32-ILP32F-WITHFP-NEXT:    sub sp, sp, a0
2860; ILP32-ILP32F-WITHFP-NEXT:    mv a0, a1
2861; ILP32-ILP32F-WITHFP-NEXT:    sw a5, 20(s0)
2862; ILP32-ILP32F-WITHFP-NEXT:    sw a6, 24(s0)
2863; ILP32-ILP32F-WITHFP-NEXT:    sw a7, 28(s0)
2864; ILP32-ILP32F-WITHFP-NEXT:    sw a1, 4(s0)
2865; ILP32-ILP32F-WITHFP-NEXT:    sw a2, 8(s0)
2866; ILP32-ILP32F-WITHFP-NEXT:    sw a3, 12(s0)
2867; ILP32-ILP32F-WITHFP-NEXT:    sw a4, 16(s0)
2868; ILP32-ILP32F-WITHFP-NEXT:    addi a1, s0, 8
2869; ILP32-ILP32F-WITHFP-NEXT:    lui a2, 24414
2870; ILP32-ILP32F-WITHFP-NEXT:    sub a2, s0, a2
2871; ILP32-ILP32F-WITHFP-NEXT:    sw a1, -272(a2)
2872; ILP32-ILP32F-WITHFP-NEXT:    lui a1, 24414
2873; ILP32-ILP32F-WITHFP-NEXT:    addi a1, a1, -1728
2874; ILP32-ILP32F-WITHFP-NEXT:    add sp, sp, a1
2875; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa sp, 2032
2876; ILP32-ILP32F-WITHFP-NEXT:    lw ra, 1996(sp) # 4-byte Folded Reload
2877; ILP32-ILP32F-WITHFP-NEXT:    lw s0, 1992(sp) # 4-byte Folded Reload
2878; ILP32-ILP32F-WITHFP-NEXT:    .cfi_restore ra
2879; ILP32-ILP32F-WITHFP-NEXT:    .cfi_restore s0
2880; ILP32-ILP32F-WITHFP-NEXT:    addi sp, sp, 2032
2881; ILP32-ILP32F-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2882; ILP32-ILP32F-WITHFP-NEXT:    ret
2883;
2884; RV32D-ILP32-ILP32F-ILP32D-FPELIM-LABEL: va_large_stack:
2885; RV32D-ILP32-ILP32F-ILP32D-FPELIM:       # %bb.0:
2886; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a0, 24414
2887; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a0, a0, 304
2888; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sub sp, sp, a0
2889; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    .cfi_def_cfa_offset 100000048
2890; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    mv a0, a1
2891; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui t0, 24414
2892; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add t0, sp, t0
2893; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a5, 292(t0)
2894; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 24414
2895; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a5, sp, a5
2896; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a6, 296(a5)
2897; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 24414
2898; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a5, sp, a5
2899; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a7, 300(a5)
2900; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a5, 24414
2901; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a5, sp, a5
2902; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 276(a5)
2903; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
2904; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, sp, a1
2905; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a2, 280(a1)
2906; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
2907; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, sp, a1
2908; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a3, 284(a1)
2909; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
2910; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, sp, a1
2911; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a4, 288(a1)
2912; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
2913; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a1, 280
2914; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add a1, sp, a1
2915; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    sw a1, 12(sp)
2916; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    lui a1, 24414
2917; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    addi a1, a1, 304
2918; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    add sp, sp, a1
2919; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2920; RV32D-ILP32-ILP32F-ILP32D-FPELIM-NEXT:    ret
2921;
2922; ILP32E-FPELIM-LABEL: va_large_stack:
2923; ILP32E-FPELIM:       # %bb.0:
2924; ILP32E-FPELIM-NEXT:    lui a0, 24414
2925; ILP32E-FPELIM-NEXT:    addi a0, a0, 288
2926; ILP32E-FPELIM-NEXT:    sub sp, sp, a0
2927; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 100000032
2928; ILP32E-FPELIM-NEXT:    mv a0, a1
2929; ILP32E-FPELIM-NEXT:    lui a6, 24414
2930; ILP32E-FPELIM-NEXT:    add a6, sp, a6
2931; ILP32E-FPELIM-NEXT:    sw a5, 284(a6)
2932; ILP32E-FPELIM-NEXT:    lui a5, 24414
2933; ILP32E-FPELIM-NEXT:    add a5, sp, a5
2934; ILP32E-FPELIM-NEXT:    sw a1, 268(a5)
2935; ILP32E-FPELIM-NEXT:    lui a1, 24414
2936; ILP32E-FPELIM-NEXT:    add a1, sp, a1
2937; ILP32E-FPELIM-NEXT:    sw a2, 272(a1)
2938; ILP32E-FPELIM-NEXT:    lui a1, 24414
2939; ILP32E-FPELIM-NEXT:    add a1, sp, a1
2940; ILP32E-FPELIM-NEXT:    sw a3, 276(a1)
2941; ILP32E-FPELIM-NEXT:    lui a1, 24414
2942; ILP32E-FPELIM-NEXT:    add a1, sp, a1
2943; ILP32E-FPELIM-NEXT:    sw a4, 280(a1)
2944; ILP32E-FPELIM-NEXT:    lui a1, 24414
2945; ILP32E-FPELIM-NEXT:    addi a1, a1, 272
2946; ILP32E-FPELIM-NEXT:    add a1, sp, a1
2947; ILP32E-FPELIM-NEXT:    sw a1, 4(sp)
2948; ILP32E-FPELIM-NEXT:    lui a1, 24414
2949; ILP32E-FPELIM-NEXT:    addi a1, a1, 288
2950; ILP32E-FPELIM-NEXT:    add sp, sp, a1
2951; ILP32E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
2952; ILP32E-FPELIM-NEXT:    ret
2953;
2954; ILP32E-WITHFP-LABEL: va_large_stack:
2955; ILP32E-WITHFP:       # %bb.0:
2956; ILP32E-WITHFP-NEXT:    addi sp, sp, -2044
2957; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 2044
2958; ILP32E-WITHFP-NEXT:    sw ra, 2016(sp) # 4-byte Folded Spill
2959; ILP32E-WITHFP-NEXT:    sw s0, 2012(sp) # 4-byte Folded Spill
2960; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
2961; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
2962; ILP32E-WITHFP-NEXT:    addi s0, sp, 2020
2963; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
2964; ILP32E-WITHFP-NEXT:    lui a0, 24414
2965; ILP32E-WITHFP-NEXT:    addi a0, a0, -1748
2966; ILP32E-WITHFP-NEXT:    sub sp, sp, a0
2967; ILP32E-WITHFP-NEXT:    mv a0, a1
2968; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
2969; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
2970; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
2971; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
2972; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
2973; ILP32E-WITHFP-NEXT:    addi a1, s0, 8
2974; ILP32E-WITHFP-NEXT:    lui a2, 24414
2975; ILP32E-WITHFP-NEXT:    sub a2, s0, a2
2976; ILP32E-WITHFP-NEXT:    sw a1, -272(a2)
2977; ILP32E-WITHFP-NEXT:    lui a1, 24414
2978; ILP32E-WITHFP-NEXT:    addi a1, a1, -1748
2979; ILP32E-WITHFP-NEXT:    add sp, sp, a1
2980; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 2044
2981; ILP32E-WITHFP-NEXT:    lw ra, 2016(sp) # 4-byte Folded Reload
2982; ILP32E-WITHFP-NEXT:    lw s0, 2012(sp) # 4-byte Folded Reload
2983; ILP32E-WITHFP-NEXT:    .cfi_restore ra
2984; ILP32E-WITHFP-NEXT:    .cfi_restore s0
2985; ILP32E-WITHFP-NEXT:    addi sp, sp, 2044
2986; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
2987; ILP32E-WITHFP-NEXT:    ret
2988;
2989; LP64-LP64F-LP64D-FPELIM-LABEL: va_large_stack:
2990; LP64-LP64F-LP64D-FPELIM:       # %bb.0:
2991; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
2992; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 336
2993; LP64-LP64F-LP64D-FPELIM-NEXT:    sub sp, sp, a0
2994; LP64-LP64F-LP64D-FPELIM-NEXT:    .cfi_def_cfa_offset 100000080
2995; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
2996; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
2997; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a1, 280(a0)
2998; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
2999; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a0, a0, 284
3000; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
3001; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a0, 8(sp)
3002; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a0, 24414
3003; LP64-LP64F-LP64D-FPELIM-NEXT:    add a0, sp, a0
3004; LP64-LP64F-LP64D-FPELIM-NEXT:    lw a0, 280(a0)
3005; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3006; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3007; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a5, 312(a1)
3008; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3009; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3010; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a6, 320(a1)
3011; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3012; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3013; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a7, 328(a1)
3014; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3015; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3016; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a2, 288(a1)
3017; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3018; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3019; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a3, 296(a1)
3020; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3021; LP64-LP64F-LP64D-FPELIM-NEXT:    add a1, sp, a1
3022; LP64-LP64F-LP64D-FPELIM-NEXT:    sd a4, 304(a1)
3023; LP64-LP64F-LP64D-FPELIM-NEXT:    lui a1, 24414
3024; LP64-LP64F-LP64D-FPELIM-NEXT:    addiw a1, a1, 336
3025; LP64-LP64F-LP64D-FPELIM-NEXT:    add sp, sp, a1
3026; LP64-LP64F-LP64D-FPELIM-NEXT:    .cfi_def_cfa_offset 0
3027; LP64-LP64F-LP64D-FPELIM-NEXT:    ret
3028;
3029; LP64-LP64F-LP64D-WITHFP-LABEL: va_large_stack:
3030; LP64-LP64F-LP64D-WITHFP:       # %bb.0:
3031; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, -2032
3032; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa_offset 2032
3033; LP64-LP64F-LP64D-WITHFP-NEXT:    sd ra, 1960(sp) # 8-byte Folded Spill
3034; LP64-LP64F-LP64D-WITHFP-NEXT:    sd s0, 1952(sp) # 8-byte Folded Spill
3035; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset ra, -72
3036; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_offset s0, -80
3037; LP64-LP64F-LP64D-WITHFP-NEXT:    addi s0, sp, 1968
3038; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa s0, 64
3039; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a0, 24414
3040; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a0, a0, -1680
3041; LP64-LP64F-LP64D-WITHFP-NEXT:    sub sp, sp, a0
3042; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a1, 8(s0)
3043; LP64-LP64F-LP64D-WITHFP-NEXT:    addi a0, s0, 12
3044; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a1, 24414
3045; LP64-LP64F-LP64D-WITHFP-NEXT:    sub a1, s0, a1
3046; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a0, -288(a1)
3047; LP64-LP64F-LP64D-WITHFP-NEXT:    lw a0, 8(s0)
3048; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a5, 40(s0)
3049; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a6, 48(s0)
3050; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a7, 56(s0)
3051; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a2, 16(s0)
3052; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a3, 24(s0)
3053; LP64-LP64F-LP64D-WITHFP-NEXT:    sd a4, 32(s0)
3054; LP64-LP64F-LP64D-WITHFP-NEXT:    lui a1, 24414
3055; LP64-LP64F-LP64D-WITHFP-NEXT:    addiw a1, a1, -1680
3056; LP64-LP64F-LP64D-WITHFP-NEXT:    add sp, sp, a1
3057; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa sp, 2032
3058; LP64-LP64F-LP64D-WITHFP-NEXT:    ld ra, 1960(sp) # 8-byte Folded Reload
3059; LP64-LP64F-LP64D-WITHFP-NEXT:    ld s0, 1952(sp) # 8-byte Folded Reload
3060; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_restore ra
3061; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_restore s0
3062; LP64-LP64F-LP64D-WITHFP-NEXT:    addi sp, sp, 2032
3063; LP64-LP64F-LP64D-WITHFP-NEXT:    .cfi_def_cfa_offset 0
3064; LP64-LP64F-LP64D-WITHFP-NEXT:    ret
3065;
3066; LP64E-FPELIM-LABEL: va_large_stack:
3067; LP64E-FPELIM:       # %bb.0:
3068; LP64E-FPELIM-NEXT:    lui a0, 24414
3069; LP64E-FPELIM-NEXT:    addiw a0, a0, 320
3070; LP64E-FPELIM-NEXT:    sub sp, sp, a0
3071; LP64E-FPELIM-NEXT:    .cfi_def_cfa_offset 100000064
3072; LP64E-FPELIM-NEXT:    lui a0, 24414
3073; LP64E-FPELIM-NEXT:    addiw a0, a0, 284
3074; LP64E-FPELIM-NEXT:    add a0, sp, a0
3075; LP64E-FPELIM-NEXT:    sd a0, 8(sp)
3076; LP64E-FPELIM-NEXT:    lui a0, 24414
3077; LP64E-FPELIM-NEXT:    add a0, sp, a0
3078; LP64E-FPELIM-NEXT:    sd a1, 280(a0)
3079; LP64E-FPELIM-NEXT:    lui a0, 24414
3080; LP64E-FPELIM-NEXT:    add a0, sp, a0
3081; LP64E-FPELIM-NEXT:    lw a0, 280(a0)
3082; LP64E-FPELIM-NEXT:    lui a1, 24414
3083; LP64E-FPELIM-NEXT:    add a1, sp, a1
3084; LP64E-FPELIM-NEXT:    sd a5, 312(a1)
3085; LP64E-FPELIM-NEXT:    lui a1, 24414
3086; LP64E-FPELIM-NEXT:    add a1, sp, a1
3087; LP64E-FPELIM-NEXT:    sd a2, 288(a1)
3088; LP64E-FPELIM-NEXT:    lui a1, 24414
3089; LP64E-FPELIM-NEXT:    add a1, sp, a1
3090; LP64E-FPELIM-NEXT:    sd a3, 296(a1)
3091; LP64E-FPELIM-NEXT:    lui a1, 24414
3092; LP64E-FPELIM-NEXT:    add a1, sp, a1
3093; LP64E-FPELIM-NEXT:    sd a4, 304(a1)
3094; LP64E-FPELIM-NEXT:    lui a1, 24414
3095; LP64E-FPELIM-NEXT:    addiw a1, a1, 320
3096; LP64E-FPELIM-NEXT:    add sp, sp, a1
3097; LP64E-FPELIM-NEXT:    .cfi_def_cfa_offset 0
3098; LP64E-FPELIM-NEXT:    ret
3099;
3100; LP64E-WITHFP-LABEL: va_large_stack:
3101; LP64E-WITHFP:       # %bb.0:
3102; LP64E-WITHFP-NEXT:    addi sp, sp, -2040
3103; LP64E-WITHFP-NEXT:    .cfi_def_cfa_offset 2040
3104; LP64E-WITHFP-NEXT:    sd ra, 1984(sp) # 8-byte Folded Spill
3105; LP64E-WITHFP-NEXT:    sd s0, 1976(sp) # 8-byte Folded Spill
3106; LP64E-WITHFP-NEXT:    .cfi_offset ra, -56
3107; LP64E-WITHFP-NEXT:    .cfi_offset s0, -64
3108; LP64E-WITHFP-NEXT:    addi s0, sp, 1992
3109; LP64E-WITHFP-NEXT:    .cfi_def_cfa s0, 48
3110; LP64E-WITHFP-NEXT:    lui a0, 24414
3111; LP64E-WITHFP-NEXT:    addiw a0, a0, -1704
3112; LP64E-WITHFP-NEXT:    sub sp, sp, a0
3113; LP64E-WITHFP-NEXT:    addi a0, s0, 12
3114; LP64E-WITHFP-NEXT:    lui a6, 24414
3115; LP64E-WITHFP-NEXT:    sub a6, s0, a6
3116; LP64E-WITHFP-NEXT:    sd a0, -288(a6)
3117; LP64E-WITHFP-NEXT:    sd a1, 8(s0)
3118; LP64E-WITHFP-NEXT:    lw a0, 8(s0)
3119; LP64E-WITHFP-NEXT:    sd a5, 40(s0)
3120; LP64E-WITHFP-NEXT:    sd a2, 16(s0)
3121; LP64E-WITHFP-NEXT:    sd a3, 24(s0)
3122; LP64E-WITHFP-NEXT:    sd a4, 32(s0)
3123; LP64E-WITHFP-NEXT:    lui a1, 24414
3124; LP64E-WITHFP-NEXT:    addiw a1, a1, -1704
3125; LP64E-WITHFP-NEXT:    add sp, sp, a1
3126; LP64E-WITHFP-NEXT:    .cfi_def_cfa sp, 2040
3127; LP64E-WITHFP-NEXT:    ld ra, 1984(sp) # 8-byte Folded Reload
3128; LP64E-WITHFP-NEXT:    ld s0, 1976(sp) # 8-byte Folded Reload
3129; LP64E-WITHFP-NEXT:    .cfi_restore ra
3130; LP64E-WITHFP-NEXT:    .cfi_restore s0
3131; LP64E-WITHFP-NEXT:    addi sp, sp, 2040
3132; LP64E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
3133; LP64E-WITHFP-NEXT:    ret
3134  %large = alloca [ 100000000 x i8 ]
3135  %va = alloca ptr
3136  call void @llvm.va_start(ptr %va)
3137  %argp.cur = load ptr, ptr %va, align 4
3138  %argp.next = getelementptr inbounds i8, ptr %argp.cur, i32 4
3139  store ptr %argp.next, ptr %va, align 4
3140  %1 = load i32, ptr %argp.cur, align 4
3141  call void @llvm.va_end(ptr %va)
3142  ret i32 %1
3143}
3144