xref: /llvm-project/llvm/test/Transforms/ExpandVariadics/pass-integers.ll (revision 94473f4db6a6f5f12d7c4081455b5b596094eac5)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=optimize < %s | FileCheck %s -check-prefixes=OPT
3; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s -check-prefixes=ABI
4; REQUIRES: webassembly-registered-target
5
6; Wasm passes struct {char} as an i8 so can check the varargs passing works on integers smaller than the slot size
7
8declare void @sink(...)
9
10
11define void @pass_nothing()  {
12; OPT-LABEL: @pass_nothing(
13; OPT-NEXT:  entry:
14; OPT-NEXT:    tail call void (...) @sink()
15; OPT-NEXT:    ret void
16;
17; ABI-LABEL: @pass_nothing(
18; ABI-NEXT:  entry:
19; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_NOTHING_VARARG:%.*]], align 16
20; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]])
21; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
22; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]])
23; ABI-NEXT:    ret void
24;
25entry:
26  tail call void (...) @sink()
27  ret void
28}
29
30define void @pass_s1(i8 %x) {
31; OPT-LABEL: @pass_s1(
32; OPT-NEXT:  entry:
33; OPT-NEXT:    tail call void (...) @sink(i8 [[X:%.*]])
34; OPT-NEXT:    ret void
35;
36; ABI-LABEL: @pass_s1(
37; ABI-NEXT:  entry:
38; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_S1_VARARG:%.*]], align 16
39; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 1, ptr [[VARARG_BUFFER]])
40; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
41; ABI-NEXT:    store i8 [[X:%.*]], ptr [[TMP0]], align 1
42; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
43; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 1, ptr [[VARARG_BUFFER]])
44; ABI-NEXT:    ret void
45;
46entry:
47  tail call void (...) @sink(i8 %x)
48  ret void
49}
50
51define void @pass_s2(i16 %x) {
52; OPT-LABEL: @pass_s2(
53; OPT-NEXT:  entry:
54; OPT-NEXT:    tail call void (...) @sink(i16 [[X:%.*]])
55; OPT-NEXT:    ret void
56;
57; ABI-LABEL: @pass_s2(
58; ABI-NEXT:  entry:
59; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_S2_VARARG:%.*]], align 16
60; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 2, ptr [[VARARG_BUFFER]])
61; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
62; ABI-NEXT:    store i16 [[X:%.*]], ptr [[TMP0]], align 2
63; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
64; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 2, ptr [[VARARG_BUFFER]])
65; ABI-NEXT:    ret void
66;
67entry:
68  tail call void (...) @sink(i16 %x)
69  ret void
70}
71
72define void @pass_s3(i32 %x) {
73; OPT-LABEL: @pass_s3(
74; OPT-NEXT:  entry:
75; OPT-NEXT:    tail call void (...) @sink(i32 [[X:%.*]])
76; OPT-NEXT:    ret void
77;
78; ABI-LABEL: @pass_s3(
79; ABI-NEXT:  entry:
80; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_S3_VARARG:%.*]], align 16
81; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[VARARG_BUFFER]])
82; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
83; ABI-NEXT:    store i32 [[X:%.*]], ptr [[TMP0]], align 4
84; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
85; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[VARARG_BUFFER]])
86; ABI-NEXT:    ret void
87;
88entry:
89  tail call void (...) @sink(i32 %x)
90  ret void
91}
92
93define void @pass_s4(i64 %x) {
94; OPT-LABEL: @pass_s4(
95; OPT-NEXT:  entry:
96; OPT-NEXT:    tail call void (...) @sink(i64 [[X:%.*]])
97; OPT-NEXT:    ret void
98;
99; ABI-LABEL: @pass_s4(
100; ABI-NEXT:  entry:
101; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_S4_VARARG:%.*]], align 16
102; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]])
103; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
104; ABI-NEXT:    store i64 [[X:%.*]], ptr [[TMP0]], align 8
105; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
106; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]])
107; ABI-NEXT:    ret void
108;
109entry:
110  tail call void (...) @sink(i64 %x)
111  ret void
112}
113
114define void @pass_s5(<4 x i32> %x) {
115; OPT-LABEL: @pass_s5(
116; OPT-NEXT:  entry:
117; OPT-NEXT:    tail call void (...) @sink(<4 x i32> [[X:%.*]])
118; OPT-NEXT:    ret void
119;
120; ABI-LABEL: @pass_s5(
121; ABI-NEXT:  entry:
122; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_S5_VARARG:%.*]], align 16
123; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]])
124; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
125; ABI-NEXT:    store <4 x i32> [[X:%.*]], ptr [[TMP0]], align 16
126; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
127; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]])
128; ABI-NEXT:    ret void
129;
130entry:
131  tail call void (...) @sink(<4 x i32> %x)
132  ret void
133}
134
135define void @pass_int_s1(i32 %i, i8 %x) {
136; OPT-LABEL: @pass_int_s1(
137; OPT-NEXT:  entry:
138; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], i8 [[X:%.*]])
139; OPT-NEXT:    ret void
140;
141; ABI-LABEL: @pass_int_s1(
142; ABI-NEXT:  entry:
143; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S1_VARARG:%.*]], align 16
144; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 5, ptr [[VARARG_BUFFER]])
145; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
146; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
147; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S1_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1
148; ABI-NEXT:    store i8 [[X:%.*]], ptr [[TMP1]], align 1
149; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
150; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 5, ptr [[VARARG_BUFFER]])
151; ABI-NEXT:    ret void
152;
153entry:
154  tail call void (...) @sink(i32 %i, i8 %x)
155  ret void
156}
157
158define void @pass_int_s2(i32 %i, i16 %x) {
159; OPT-LABEL: @pass_int_s2(
160; OPT-NEXT:  entry:
161; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], i16 [[X:%.*]])
162; OPT-NEXT:    ret void
163;
164; ABI-LABEL: @pass_int_s2(
165; ABI-NEXT:  entry:
166; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S2_VARARG:%.*]], align 16
167; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 6, ptr [[VARARG_BUFFER]])
168; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
169; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
170; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S2_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1
171; ABI-NEXT:    store i16 [[X:%.*]], ptr [[TMP1]], align 2
172; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
173; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 6, ptr [[VARARG_BUFFER]])
174; ABI-NEXT:    ret void
175;
176entry:
177  tail call void (...) @sink(i32 %i, i16 %x)
178  ret void
179}
180
181define void @pass_int_s3(i32 %i, i32 %x) {
182; OPT-LABEL: @pass_int_s3(
183; OPT-NEXT:  entry:
184; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], i32 [[X:%.*]])
185; OPT-NEXT:    ret void
186;
187; ABI-LABEL: @pass_int_s3(
188; ABI-NEXT:  entry:
189; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S3_VARARG:%.*]], align 16
190; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 8, ptr [[VARARG_BUFFER]])
191; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
192; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
193; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S3_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1
194; ABI-NEXT:    store i32 [[X:%.*]], ptr [[TMP1]], align 4
195; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
196; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 8, ptr [[VARARG_BUFFER]])
197; ABI-NEXT:    ret void
198;
199entry:
200  tail call void (...) @sink(i32 %i, i32 %x)
201  ret void
202}
203
204define void @pass_int_s4(i32 %i, i64 %x) {
205; OPT-LABEL: @pass_int_s4(
206; OPT-NEXT:  entry:
207; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], i64 [[X:%.*]])
208; OPT-NEXT:    ret void
209;
210; ABI-LABEL: @pass_int_s4(
211; ABI-NEXT:  entry:
212; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S4_VARARG:%.*]], align 16
213; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]])
214; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
215; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
216; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S4_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2
217; ABI-NEXT:    store i64 [[X:%.*]], ptr [[TMP1]], align 8
218; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
219; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]])
220; ABI-NEXT:    ret void
221;
222entry:
223  tail call void (...) @sink(i32 %i, i64 %x)
224  ret void
225}
226
227define void @pass_int_s5(i32 %i, <4 x i32> %x) {
228; OPT-LABEL: @pass_int_s5(
229; OPT-NEXT:  entry:
230; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], <4 x i32> [[X:%.*]])
231; OPT-NEXT:    ret void
232;
233; ABI-LABEL: @pass_int_s5(
234; ABI-NEXT:  entry:
235; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_INT_S5_VARARG:%.*]], align 16
236; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER]])
237; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
238; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
239; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_INT_S5_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2
240; ABI-NEXT:    store <4 x i32> [[X:%.*]], ptr [[TMP1]], align 16
241; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
242; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER]])
243; ABI-NEXT:    ret void
244;
245entry:
246  tail call void (...) @sink(i32 %i, <4 x i32> %x)
247  ret void
248}
249
250define void @pass_asc(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) {
251; OPT-LABEL: @pass_asc(
252; OPT-NEXT:  entry:
253; OPT-NEXT:    tail call void (...) @sink(i8 [[X1:%.*]], i16 [[X2:%.*]], i32 [[X3:%.*]], i64 [[X4:%.*]], <4 x i32> [[X5:%.*]])
254; OPT-NEXT:    ret void
255;
256; ABI-LABEL: @pass_asc(
257; ABI-NEXT:  entry:
258; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_ASC_VARARG:%.*]], align 16
259; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 48, ptr [[VARARG_BUFFER]])
260; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
261; ABI-NEXT:    store i8 [[X1:%.*]], ptr [[TMP0]], align 1
262; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2
263; ABI-NEXT:    store i16 [[X2:%.*]], ptr [[TMP1]], align 2
264; ABI-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 4
265; ABI-NEXT:    store i32 [[X3:%.*]], ptr [[TMP2]], align 4
266; ABI-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 6
267; ABI-NEXT:    store i64 [[X4:%.*]], ptr [[TMP3]], align 8
268; ABI-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_ASC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 8
269; ABI-NEXT:    store <4 x i32> [[X5:%.*]], ptr [[TMP4]], align 16
270; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
271; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 48, ptr [[VARARG_BUFFER]])
272; ABI-NEXT:    ret void
273;
274entry:
275  tail call void (...) @sink(i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5)
276  ret void
277}
278
279define void @pass_dsc(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4) {
280; OPT-LABEL: @pass_dsc(
281; OPT-NEXT:  entry:
282; OPT-NEXT:    tail call void (...) @sink(<4 x i32> [[X0:%.*]], i64 [[X1:%.*]], i32 [[X2:%.*]], i16 [[X3:%.*]], i8 [[X4:%.*]])
283; OPT-NEXT:    ret void
284;
285; ABI-LABEL: @pass_dsc(
286; ABI-NEXT:  entry:
287; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_DSC_VARARG:%.*]], align 16
288; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 33, ptr [[VARARG_BUFFER]])
289; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
290; ABI-NEXT:    store <4 x i32> [[X0:%.*]], ptr [[TMP0]], align 16
291; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1
292; ABI-NEXT:    store i64 [[X1:%.*]], ptr [[TMP1]], align 8
293; ABI-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 2
294; ABI-NEXT:    store i32 [[X2:%.*]], ptr [[TMP2]], align 4
295; ABI-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3
296; ABI-NEXT:    store i16 [[X3:%.*]], ptr [[TMP3]], align 2
297; ABI-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_DSC_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 5
298; ABI-NEXT:    store i8 [[X4:%.*]], ptr [[TMP4]], align 1
299; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
300; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 33, ptr [[VARARG_BUFFER]])
301; ABI-NEXT:    ret void
302;
303entry:
304  tail call void (...) @sink(<4 x i32> %x0, i64 %x1, i32 %x2, i16 %x3, i8 %x4)
305  ret void
306}
307
308define void @pass_multiple(i32 %i, i8 %x1, i16 %x2, i32 %x3, i64 %x4, <4 x i32> %x5) {
309; OPT-LABEL: @pass_multiple(
310; OPT-NEXT:  entry:
311; OPT-NEXT:    tail call void (...) @sink(i32 [[I:%.*]], i16 [[X2:%.*]], i64 [[X4:%.*]])
312; OPT-NEXT:    tail call void (...) @sink(i32 [[I]], i8 [[X1:%.*]], i32 [[X3:%.*]], <4 x i32> [[X5:%.*]])
313; OPT-NEXT:    ret void
314;
315; ABI-LABEL: @pass_multiple(
316; ABI-NEXT:  entry:
317; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_MULTIPLE_VARARG:%.*]], align 16
318; ABI-NEXT:    [[VARARG_BUFFER1:%.*]] = alloca [[PASS_MULTIPLE_VARARG_0:%.*]], align 16
319; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[VARARG_BUFFER]])
320; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0
321; ABI-NEXT:    store i32 [[I:%.*]], ptr [[TMP0]], align 4
322; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1
323; ABI-NEXT:    store i16 [[X2:%.*]], ptr [[TMP1]], align 2
324; ABI-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 3
325; ABI-NEXT:    store i64 [[X4:%.*]], ptr [[TMP2]], align 8
326; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])
327; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[VARARG_BUFFER]])
328; ABI-NEXT:    call void @llvm.lifetime.start.p0(i64 32, ptr [[VARARG_BUFFER1]])
329; ABI-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 0
330; ABI-NEXT:    store i32 [[I]], ptr [[TMP3]], align 4
331; ABI-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 1
332; ABI-NEXT:    store i8 [[X1:%.*]], ptr [[TMP4]], align 1
333; ABI-NEXT:    [[TMP5:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 3
334; ABI-NEXT:    store i32 [[X3:%.*]], ptr [[TMP5]], align 4
335; ABI-NEXT:    [[TMP6:%.*]] = getelementptr inbounds nuw [[PASS_MULTIPLE_VARARG_0]], ptr [[VARARG_BUFFER1]], i32 0, i32 5
336; ABI-NEXT:    store <4 x i32> [[X5:%.*]], ptr [[TMP6]], align 16
337; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER1]])
338; ABI-NEXT:    call void @llvm.lifetime.end.p0(i64 32, ptr [[VARARG_BUFFER1]])
339; ABI-NEXT:    ret void
340;
341entry:
342  tail call void (...) @sink(i32 %i, i16 %x2, i64 %x4)
343  tail call void (...) @sink(i32 %i, i8 %x1, i32 %x3, <4 x i32> %x5)
344  ret void
345}
346