xref: /llvm-project/llvm/test/CodeGen/Xtensa/vararg.ll (revision be4a18387c61130de1cd2147ceaebdfe278ea370)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc < %s --mtriple=xtensa | FileCheck %s
3
4define void @vararg(...) {
5; CHECK-LABEL: vararg:
6; CHECK:         .cfi_startproc
7; CHECK-NEXT:  # %bb.0: # %entry
8; CHECK-NEXT:    addi a8, a1, -32
9; CHECK-NEXT:    or a1, a8, a8
10; CHECK-NEXT:    .cfi_def_cfa_offset 32
11; CHECK-NEXT:    s32i a7, a1, 20
12; CHECK-NEXT:    s32i a6, a1, 16
13; CHECK-NEXT:    s32i a5, a1, 12
14; CHECK-NEXT:    s32i a4, a1, 8
15; CHECK-NEXT:    s32i a3, a1, 4
16; CHECK-NEXT:    s32i a2, a1, 0
17; CHECK-NEXT:    addi a8, a1, 32
18; CHECK-NEXT:    or a1, a8, a8
19; CHECK-NEXT:    ret
20entry:
21  ret void
22}
23
24declare void @llvm.va_start(ptr) nounwind
25declare void @llvm.va_end(ptr) nounwind
26declare void @f_i32(i32) nounwind
27declare void @f_i64(i64) nounwind
28
29define void @vararg_fixed_0(...) nounwind {
30; CHECK-LABEL: vararg_fixed_0:
31; CHECK:       # %bb.0: # %entry
32; CHECK-NEXT:    addi a8, a1, -48
33; CHECK-NEXT:    or a1, a8, a8
34; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
35; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
36; CHECK-NEXT:    s32i a7, a1, 32
37; CHECK-NEXT:    s32i a6, a1, 28
38; CHECK-NEXT:    s32i a5, a1, 24
39; CHECK-NEXT:    s32i a4, a1, 20
40; CHECK-NEXT:    s32i a3, a1, 16
41; CHECK-NEXT:    s32i a2, a1, 12
42; CHECK-NEXT:    addi a10, a1, 12
43; CHECK-NEXT:    s32i a10, a1, 4
44; CHECK-NEXT:    addi a8, a1, 48
45; CHECK-NEXT:    addi a8, a8, -32
46; CHECK-NEXT:    s32i a8, a1, 0
47; CHECK-NEXT:    movi a9, 4
48; CHECK-NEXT:    movi a12, 24
49; CHECK-NEXT:    blt a12, a9, .LBB1_2
50; CHECK-NEXT:  # %bb.1: # %entry
51; CHECK-NEXT:    or a8, a10, a10
52; CHECK-NEXT:  .LBB1_2: # %entry
53; CHECK-NEXT:    bge a12, a9, .LBB1_4
54; CHECK-NEXT:  # %bb.3:
55; CHECK-NEXT:    movi a9, 40
56; CHECK-NEXT:  .LBB1_4: # %entry
57; CHECK-NEXT:    s32i a9, a1, 8
58; CHECK-NEXT:    add a8, a9, a8
59; CHECK-NEXT:    addi a8, a8, -4
60; CHECK-NEXT:    l32i a2, a8, 0
61; CHECK-NEXT:    l32r a8, .LCPI1_0
62; CHECK-NEXT:    callx0 a8
63; CHECK-NEXT:    l32i a7, a1, 8
64; CHECK-NEXT:    addi a10, a7, 4
65; CHECK-NEXT:    l32i a9, a1, 4
66; CHECK-NEXT:    l32i a8, a1, 0
67; CHECK-NEXT:    or a11, a8, a8
68; CHECK-NEXT:    blt a12, a10, .LBB1_6
69; CHECK-NEXT:  # %bb.5: # %entry
70; CHECK-NEXT:    or a11, a9, a9
71; CHECK-NEXT:  .LBB1_6: # %entry
72; CHECK-NEXT:    bge a12, a10, .LBB1_8
73; CHECK-NEXT:  # %bb.7:
74; CHECK-NEXT:    addi a10, a7, 40
75; CHECK-NEXT:  .LBB1_8: # %entry
76; CHECK-NEXT:    s32i a10, a1, 8
77; CHECK-NEXT:    add a10, a10, a11
78; CHECK-NEXT:    addi a7, a10, -4
79; CHECK-NEXT:    l32i a11, a1, 8
80; CHECK-NEXT:    addi a10, a11, 4
81; CHECK-NEXT:    blt a12, a10, .LBB1_10
82; CHECK-NEXT:  # %bb.9: # %entry
83; CHECK-NEXT:    or a8, a9, a9
84; CHECK-NEXT:  .LBB1_10: # %entry
85; CHECK-NEXT:    l32i a2, a7, 0
86; CHECK-NEXT:    bge a12, a10, .LBB1_12
87; CHECK-NEXT:  # %bb.11:
88; CHECK-NEXT:    addi a10, a11, 40
89; CHECK-NEXT:  .LBB1_12: # %entry
90; CHECK-NEXT:    s32i a10, a1, 8
91; CHECK-NEXT:    add a8, a10, a8
92; CHECK-NEXT:    addi a8, a8, -4
93; CHECK-NEXT:    l32i a3, a8, 0
94; CHECK-NEXT:    l32r a8, .LCPI1_1
95; CHECK-NEXT:    callx0 a8
96; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
97; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
98; CHECK-NEXT:    addi a8, a1, 48
99; CHECK-NEXT:    or a1, a8, a8
100; CHECK-NEXT:    ret
101entry:
102  %list = alloca ptr, align 4
103  call void @llvm.va_start(ptr %list)
104
105  %0 = va_arg ptr %list, i32
106  call void @f_i32(i32 %0)
107  %1 = va_arg ptr %list, i64
108  call void @f_i64(i64 %1)
109
110  call void @llvm.va_end(ptr %list)
111  ret void
112}
113
114define void @vararg_fixed_1(i32 %a1, ...) nounwind {
115; CHECK-LABEL: vararg_fixed_1:
116; CHECK:       # %bb.0: # %entry
117; CHECK-NEXT:    addi a8, a1, -32
118; CHECK-NEXT:    or a1, a8, a8
119; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
120; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
121; CHECK-NEXT:    s32i a7, a1, 28
122; CHECK-NEXT:    s32i a6, a1, 24
123; CHECK-NEXT:    s32i a5, a1, 20
124; CHECK-NEXT:    s32i a4, a1, 16
125; CHECK-NEXT:    s32i a3, a1, 12
126; CHECK-NEXT:    addi a10, a1, 12
127; CHECK-NEXT:    s32i a10, a1, 4
128; CHECK-NEXT:    addi a8, a1, 32
129; CHECK-NEXT:    addi a8, a8, -32
130; CHECK-NEXT:    s32i a8, a1, 0
131; CHECK-NEXT:    movi a9, 8
132; CHECK-NEXT:    movi a12, 24
133; CHECK-NEXT:    blt a12, a9, .LBB2_2
134; CHECK-NEXT:  # %bb.1: # %entry
135; CHECK-NEXT:    or a8, a10, a10
136; CHECK-NEXT:  .LBB2_2: # %entry
137; CHECK-NEXT:    bge a12, a9, .LBB2_4
138; CHECK-NEXT:  # %bb.3:
139; CHECK-NEXT:    movi a9, 44
140; CHECK-NEXT:  .LBB2_4: # %entry
141; CHECK-NEXT:    s32i a9, a1, 8
142; CHECK-NEXT:    add a8, a9, a8
143; CHECK-NEXT:    addi a8, a8, -4
144; CHECK-NEXT:    l32i a8, a8, 0
145; CHECK-NEXT:    add a2, a8, a2
146; CHECK-NEXT:    l32r a8, .LCPI2_0
147; CHECK-NEXT:    callx0 a8
148; CHECK-NEXT:    l32i a7, a1, 8
149; CHECK-NEXT:    addi a10, a7, 4
150; CHECK-NEXT:    l32i a9, a1, 4
151; CHECK-NEXT:    l32i a8, a1, 0
152; CHECK-NEXT:    or a11, a8, a8
153; CHECK-NEXT:    blt a12, a10, .LBB2_6
154; CHECK-NEXT:  # %bb.5: # %entry
155; CHECK-NEXT:    or a11, a9, a9
156; CHECK-NEXT:  .LBB2_6: # %entry
157; CHECK-NEXT:    bge a12, a10, .LBB2_8
158; CHECK-NEXT:  # %bb.7:
159; CHECK-NEXT:    addi a10, a7, 40
160; CHECK-NEXT:  .LBB2_8: # %entry
161; CHECK-NEXT:    s32i a10, a1, 8
162; CHECK-NEXT:    add a10, a10, a11
163; CHECK-NEXT:    addi a7, a10, -4
164; CHECK-NEXT:    l32i a11, a1, 8
165; CHECK-NEXT:    addi a10, a11, 4
166; CHECK-NEXT:    blt a12, a10, .LBB2_10
167; CHECK-NEXT:  # %bb.9: # %entry
168; CHECK-NEXT:    or a8, a9, a9
169; CHECK-NEXT:  .LBB2_10: # %entry
170; CHECK-NEXT:    l32i a2, a7, 0
171; CHECK-NEXT:    bge a12, a10, .LBB2_12
172; CHECK-NEXT:  # %bb.11:
173; CHECK-NEXT:    addi a10, a11, 40
174; CHECK-NEXT:  .LBB2_12: # %entry
175; CHECK-NEXT:    s32i a10, a1, 8
176; CHECK-NEXT:    add a8, a10, a8
177; CHECK-NEXT:    addi a8, a8, -4
178; CHECK-NEXT:    l32i a3, a8, 0
179; CHECK-NEXT:    l32r a8, .LCPI2_1
180; CHECK-NEXT:    callx0 a8
181; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
182; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
183; CHECK-NEXT:    addi a8, a1, 32
184; CHECK-NEXT:    or a1, a8, a8
185; CHECK-NEXT:    ret
186entry:
187  %list = alloca ptr, align 4
188  call void @llvm.va_start(ptr %list)
189
190  %va32 = va_arg ptr %list, i32
191  %sum = add nsw i32 %va32, %a1
192  call void @f_i32(i32 %sum)
193
194  %va64 = va_arg ptr %list, i64
195  call void @f_i64(i64 %va64)
196
197  call void @llvm.va_end(ptr %list)
198  ret void
199}
200
201define void @vararg_fixed_4(i32 %a1, i32 %a2, i32 %a3, i32 %a4, ...) nounwind {
202; CHECK-LABEL: vararg_fixed_4:
203; CHECK:       # %bb.0: # %entry
204; CHECK-NEXT:    addi a8, a1, -32
205; CHECK-NEXT:    or a1, a8, a8
206; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
207; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
208; CHECK-NEXT:    s32i a7, a1, 16
209; CHECK-NEXT:    s32i a6, a1, 12
210; CHECK-NEXT:    addi a10, a1, 12
211; CHECK-NEXT:    s32i a10, a1, 4
212; CHECK-NEXT:    addi a8, a1, 32
213; CHECK-NEXT:    addi a8, a8, -32
214; CHECK-NEXT:    s32i a8, a1, 0
215; CHECK-NEXT:    movi a9, 20
216; CHECK-NEXT:    movi a12, 24
217; CHECK-NEXT:    blt a12, a9, .LBB3_2
218; CHECK-NEXT:  # %bb.1: # %entry
219; CHECK-NEXT:    or a8, a10, a10
220; CHECK-NEXT:  .LBB3_2: # %entry
221; CHECK-NEXT:    bge a12, a9, .LBB3_4
222; CHECK-NEXT:  # %bb.3:
223; CHECK-NEXT:    movi a9, 56
224; CHECK-NEXT:  .LBB3_4: # %entry
225; CHECK-NEXT:    s32i a9, a1, 8
226; CHECK-NEXT:    add a8, a9, a8
227; CHECK-NEXT:    addi a8, a8, -4
228; CHECK-NEXT:    l32i a8, a8, 0
229; CHECK-NEXT:    add a2, a8, a2
230; CHECK-NEXT:    l32r a8, .LCPI3_0
231; CHECK-NEXT:    callx0 a8
232; CHECK-NEXT:    l32i a7, a1, 8
233; CHECK-NEXT:    addi a10, a7, 4
234; CHECK-NEXT:    l32i a9, a1, 4
235; CHECK-NEXT:    l32i a8, a1, 0
236; CHECK-NEXT:    or a11, a8, a8
237; CHECK-NEXT:    blt a12, a10, .LBB3_6
238; CHECK-NEXT:  # %bb.5: # %entry
239; CHECK-NEXT:    or a11, a9, a9
240; CHECK-NEXT:  .LBB3_6: # %entry
241; CHECK-NEXT:    bge a12, a10, .LBB3_8
242; CHECK-NEXT:  # %bb.7:
243; CHECK-NEXT:    addi a10, a7, 40
244; CHECK-NEXT:  .LBB3_8: # %entry
245; CHECK-NEXT:    s32i a10, a1, 8
246; CHECK-NEXT:    add a10, a10, a11
247; CHECK-NEXT:    addi a7, a10, -4
248; CHECK-NEXT:    l32i a11, a1, 8
249; CHECK-NEXT:    addi a10, a11, 4
250; CHECK-NEXT:    blt a12, a10, .LBB3_10
251; CHECK-NEXT:  # %bb.9: # %entry
252; CHECK-NEXT:    or a8, a9, a9
253; CHECK-NEXT:  .LBB3_10: # %entry
254; CHECK-NEXT:    l32i a2, a7, 0
255; CHECK-NEXT:    bge a12, a10, .LBB3_12
256; CHECK-NEXT:  # %bb.11:
257; CHECK-NEXT:    addi a10, a11, 40
258; CHECK-NEXT:  .LBB3_12: # %entry
259; CHECK-NEXT:    s32i a10, a1, 8
260; CHECK-NEXT:    add a8, a10, a8
261; CHECK-NEXT:    addi a8, a8, -4
262; CHECK-NEXT:    l32i a3, a8, 0
263; CHECK-NEXT:    l32r a8, .LCPI3_1
264; CHECK-NEXT:    callx0 a8
265; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
266; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
267; CHECK-NEXT:    addi a8, a1, 32
268; CHECK-NEXT:    or a1, a8, a8
269; CHECK-NEXT:    ret
270entry:
271  %list = alloca ptr, align 4
272  call void @llvm.va_start(ptr %list)
273
274  %va32 = va_arg ptr %list, i32
275  %sum = add nsw i32 %va32, %a1
276  call void @f_i32(i32 %sum)
277
278  %va64 = va_arg ptr %list, i64
279  call void @f_i64(i64 %va64)
280
281  call void @llvm.va_end(ptr %list)
282  ret void
283}
284
285define void @vararg_fixed_5(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, ...) nounwind {
286; CHECK-LABEL: vararg_fixed_5:
287; CHECK:       # %bb.0: # %entry
288; CHECK-NEXT:    addi a8, a1, -16
289; CHECK-NEXT:    or a1, a8, a8
290; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
291; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
292; CHECK-NEXT:    s32i a7, a1, 12
293; CHECK-NEXT:    addi a9, a1, 12
294; CHECK-NEXT:    s32i a9, a1, 4
295; CHECK-NEXT:    addi a8, a1, 16
296; CHECK-NEXT:    addi a8, a8, -32
297; CHECK-NEXT:    s32i a8, a1, 0
298; CHECK-NEXT:    movi a12, 24
299; CHECK-NEXT:    blt a12, a12, .LBB4_2
300; CHECK-NEXT:  # %bb.1: # %entry
301; CHECK-NEXT:    or a8, a9, a9
302; CHECK-NEXT:  .LBB4_2: # %entry
303; CHECK-NEXT:    blt a12, a12, .LBB4_4
304; CHECK-NEXT:  # %bb.3: # %entry
305; CHECK-NEXT:    or a9, a12, a12
306; CHECK-NEXT:    j .LBB4_5
307; CHECK-NEXT:  .LBB4_4:
308; CHECK-NEXT:    movi a9, 60
309; CHECK-NEXT:  .LBB4_5: # %entry
310; CHECK-NEXT:    s32i a9, a1, 8
311; CHECK-NEXT:    add a8, a9, a8
312; CHECK-NEXT:    addi a8, a8, -4
313; CHECK-NEXT:    l32i a8, a8, 0
314; CHECK-NEXT:    add a2, a8, a2
315; CHECK-NEXT:    l32r a8, .LCPI4_0
316; CHECK-NEXT:    callx0 a8
317; CHECK-NEXT:    l32i a7, a1, 8
318; CHECK-NEXT:    addi a10, a7, 4
319; CHECK-NEXT:    l32i a9, a1, 4
320; CHECK-NEXT:    l32i a8, a1, 0
321; CHECK-NEXT:    or a11, a8, a8
322; CHECK-NEXT:    blt a12, a10, .LBB4_7
323; CHECK-NEXT:  # %bb.6: # %entry
324; CHECK-NEXT:    or a11, a9, a9
325; CHECK-NEXT:  .LBB4_7: # %entry
326; CHECK-NEXT:    bge a12, a10, .LBB4_9
327; CHECK-NEXT:  # %bb.8:
328; CHECK-NEXT:    addi a10, a7, 40
329; CHECK-NEXT:  .LBB4_9: # %entry
330; CHECK-NEXT:    s32i a10, a1, 8
331; CHECK-NEXT:    add a10, a10, a11
332; CHECK-NEXT:    addi a7, a10, -4
333; CHECK-NEXT:    l32i a11, a1, 8
334; CHECK-NEXT:    addi a10, a11, 4
335; CHECK-NEXT:    blt a12, a10, .LBB4_11
336; CHECK-NEXT:  # %bb.10: # %entry
337; CHECK-NEXT:    or a8, a9, a9
338; CHECK-NEXT:  .LBB4_11: # %entry
339; CHECK-NEXT:    l32i a2, a7, 0
340; CHECK-NEXT:    bge a12, a10, .LBB4_13
341; CHECK-NEXT:  # %bb.12:
342; CHECK-NEXT:    addi a10, a11, 40
343; CHECK-NEXT:  .LBB4_13: # %entry
344; CHECK-NEXT:    s32i a10, a1, 8
345; CHECK-NEXT:    add a8, a10, a8
346; CHECK-NEXT:    addi a8, a8, -4
347; CHECK-NEXT:    l32i a3, a8, 0
348; CHECK-NEXT:    l32r a8, .LCPI4_1
349; CHECK-NEXT:    callx0 a8
350; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
351; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
352; CHECK-NEXT:    addi a8, a1, 16
353; CHECK-NEXT:    or a1, a8, a8
354; CHECK-NEXT:    ret
355entry:
356  %list = alloca ptr, align 4
357  call void @llvm.va_start(ptr %list)
358
359  %va32 = va_arg ptr %list, i32
360  %sum = add nsw i32 %va32, %a1
361  call void @f_i32(i32 %sum)
362
363  %va64 = va_arg ptr %list, i64
364  call void @f_i64(i64 %va64)
365
366  call void @llvm.va_end(ptr %list)
367  ret void
368}
369
370define void @vararg_fixed_6(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, ...) nounwind {
371; CHECK-LABEL: vararg_fixed_6:
372; CHECK:       # %bb.0: # %entry
373; CHECK-NEXT:    addi a8, a1, -16
374; CHECK-NEXT:    or a1, a8, a8
375; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
376; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
377; CHECK-NEXT:    addi a10, a1, 0
378; CHECK-NEXT:    s32i a10, a1, 4
379; CHECK-NEXT:    addi a8, a1, 16
380; CHECK-NEXT:    addi a8, a8, -32
381; CHECK-NEXT:    s32i a8, a1, 0
382; CHECK-NEXT:    movi a9, 36
383; CHECK-NEXT:    movi a12, 24
384; CHECK-NEXT:    blt a12, a9, .LBB5_2
385; CHECK-NEXT:  # %bb.1: # %entry
386; CHECK-NEXT:    or a8, a10, a10
387; CHECK-NEXT:  .LBB5_2: # %entry
388; CHECK-NEXT:    bge a12, a9, .LBB5_4
389; CHECK-NEXT:  # %bb.3:
390; CHECK-NEXT:    movi a9, 72
391; CHECK-NEXT:  .LBB5_4: # %entry
392; CHECK-NEXT:    s32i a9, a1, 8
393; CHECK-NEXT:    add a8, a9, a8
394; CHECK-NEXT:    addi a8, a8, -4
395; CHECK-NEXT:    l32i a8, a8, 0
396; CHECK-NEXT:    add a2, a8, a2
397; CHECK-NEXT:    l32r a8, .LCPI5_0
398; CHECK-NEXT:    callx0 a8
399; CHECK-NEXT:    l32i a7, a1, 8
400; CHECK-NEXT:    addi a10, a7, 4
401; CHECK-NEXT:    l32i a9, a1, 4
402; CHECK-NEXT:    l32i a8, a1, 0
403; CHECK-NEXT:    or a11, a8, a8
404; CHECK-NEXT:    blt a12, a10, .LBB5_6
405; CHECK-NEXT:  # %bb.5: # %entry
406; CHECK-NEXT:    or a11, a9, a9
407; CHECK-NEXT:  .LBB5_6: # %entry
408; CHECK-NEXT:    bge a12, a10, .LBB5_8
409; CHECK-NEXT:  # %bb.7:
410; CHECK-NEXT:    addi a10, a7, 40
411; CHECK-NEXT:  .LBB5_8: # %entry
412; CHECK-NEXT:    s32i a10, a1, 8
413; CHECK-NEXT:    add a10, a10, a11
414; CHECK-NEXT:    addi a7, a10, -4
415; CHECK-NEXT:    l32i a11, a1, 8
416; CHECK-NEXT:    addi a10, a11, 4
417; CHECK-NEXT:    blt a12, a10, .LBB5_10
418; CHECK-NEXT:  # %bb.9: # %entry
419; CHECK-NEXT:    or a8, a9, a9
420; CHECK-NEXT:  .LBB5_10: # %entry
421; CHECK-NEXT:    l32i a2, a7, 0
422; CHECK-NEXT:    bge a12, a10, .LBB5_12
423; CHECK-NEXT:  # %bb.11:
424; CHECK-NEXT:    addi a10, a11, 40
425; CHECK-NEXT:  .LBB5_12: # %entry
426; CHECK-NEXT:    s32i a10, a1, 8
427; CHECK-NEXT:    add a8, a10, a8
428; CHECK-NEXT:    addi a8, a8, -4
429; CHECK-NEXT:    l32i a3, a8, 0
430; CHECK-NEXT:    l32r a8, .LCPI5_1
431; CHECK-NEXT:    callx0 a8
432; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
433; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
434; CHECK-NEXT:    addi a8, a1, 16
435; CHECK-NEXT:    or a1, a8, a8
436; CHECK-NEXT:    ret
437entry:
438  %list = alloca ptr, align 4
439  call void @llvm.va_start(ptr %list)
440
441  %va32 = va_arg ptr %list, i32
442  %sum = add nsw i32 %va32, %a1
443  call void @f_i32(i32 %sum)
444
445  %va64 = va_arg ptr %list, i64
446  call void @f_i64(i64 %va64)
447
448  call void @llvm.va_end(ptr %list)
449  ret void
450}
451
452define void @vararg_fixed_7(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, ...) nounwind {
453; CHECK-LABEL: vararg_fixed_7:
454; CHECK:       # %bb.0: # %entry
455; CHECK-NEXT:    addi a8, a1, -16
456; CHECK-NEXT:    or a1, a8, a8
457; CHECK-NEXT:    s32i a0, a1, 8 # 4-byte Folded Spill
458; CHECK-NEXT:    s32i a12, a1, 4 # 4-byte Folded Spill
459; CHECK-NEXT:    addi a10, a1, 0
460; CHECK-NEXT:    s32i a10, a1, 4
461; CHECK-NEXT:    addi a8, a1, 20
462; CHECK-NEXT:    addi a8, a8, -32
463; CHECK-NEXT:    s32i a8, a1, 0
464; CHECK-NEXT:    movi a9, 36
465; CHECK-NEXT:    movi a12, 24
466; CHECK-NEXT:    blt a12, a9, .LBB6_2
467; CHECK-NEXT:  # %bb.1: # %entry
468; CHECK-NEXT:    or a8, a10, a10
469; CHECK-NEXT:  .LBB6_2: # %entry
470; CHECK-NEXT:    bge a12, a9, .LBB6_4
471; CHECK-NEXT:  # %bb.3:
472; CHECK-NEXT:    movi a9, 72
473; CHECK-NEXT:  .LBB6_4: # %entry
474; CHECK-NEXT:    s32i a9, a1, 8
475; CHECK-NEXT:    add a8, a9, a8
476; CHECK-NEXT:    addi a8, a8, -4
477; CHECK-NEXT:    l32i a8, a8, 0
478; CHECK-NEXT:    add a2, a8, a2
479; CHECK-NEXT:    l32r a8, .LCPI6_0
480; CHECK-NEXT:    callx0 a8
481; CHECK-NEXT:    l32i a7, a1, 8
482; CHECK-NEXT:    addi a10, a7, 4
483; CHECK-NEXT:    l32i a9, a1, 4
484; CHECK-NEXT:    l32i a8, a1, 0
485; CHECK-NEXT:    or a11, a8, a8
486; CHECK-NEXT:    blt a12, a10, .LBB6_6
487; CHECK-NEXT:  # %bb.5: # %entry
488; CHECK-NEXT:    or a11, a9, a9
489; CHECK-NEXT:  .LBB6_6: # %entry
490; CHECK-NEXT:    bge a12, a10, .LBB6_8
491; CHECK-NEXT:  # %bb.7:
492; CHECK-NEXT:    addi a10, a7, 40
493; CHECK-NEXT:  .LBB6_8: # %entry
494; CHECK-NEXT:    s32i a10, a1, 8
495; CHECK-NEXT:    add a10, a10, a11
496; CHECK-NEXT:    addi a7, a10, -4
497; CHECK-NEXT:    l32i a11, a1, 8
498; CHECK-NEXT:    addi a10, a11, 4
499; CHECK-NEXT:    blt a12, a10, .LBB6_10
500; CHECK-NEXT:  # %bb.9: # %entry
501; CHECK-NEXT:    or a8, a9, a9
502; CHECK-NEXT:  .LBB6_10: # %entry
503; CHECK-NEXT:    l32i a2, a7, 0
504; CHECK-NEXT:    bge a12, a10, .LBB6_12
505; CHECK-NEXT:  # %bb.11:
506; CHECK-NEXT:    addi a10, a11, 40
507; CHECK-NEXT:  .LBB6_12: # %entry
508; CHECK-NEXT:    s32i a10, a1, 8
509; CHECK-NEXT:    add a8, a10, a8
510; CHECK-NEXT:    addi a8, a8, -4
511; CHECK-NEXT:    l32i a3, a8, 0
512; CHECK-NEXT:    l32r a8, .LCPI6_1
513; CHECK-NEXT:    callx0 a8
514; CHECK-NEXT:    l32i a12, a1, 4 # 4-byte Folded Reload
515; CHECK-NEXT:    l32i a0, a1, 8 # 4-byte Folded Reload
516; CHECK-NEXT:    addi a8, a1, 16
517; CHECK-NEXT:    or a1, a8, a8
518; CHECK-NEXT:    ret
519entry:
520  %list = alloca ptr, align 4
521  call void @llvm.va_start(ptr %list)
522
523  %va32 = va_arg ptr %list, i32
524  %sum = add nsw i32 %va32, %a1
525  call void @f_i32(i32 %sum)
526
527  %va64 = va_arg ptr %list, i64
528  call void @f_i64(i64 %va64)
529
530  call void @llvm.va_end(ptr %list)
531  ret void
532}
533