1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi aapcs -emit-llvm -o - %s | FileCheck %s
2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi apcs-gnu -emit-llvm -o - %s | FileCheck -check-prefix=APCS-GNU %s
3*f4a2713aSLionel Sambuc
4*f4a2713aSLionel Sambuc #include <stdarg.h>
5*f4a2713aSLionel Sambuc
6*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(2) )) int __int2;
7*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(3) )) char __char3;
8*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(5) )) char __char5;
9*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(9) )) char __char9;
10*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(19) )) char __char19;
11*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(3) )) short __short3;
12*f4a2713aSLionel Sambuc typedef __attribute__(( ext_vector_type(5) )) short __short5;
13*f4a2713aSLionel Sambuc
14*f4a2713aSLionel Sambuc // Passing legal vector types as varargs.
varargs_vec_2i(int fixed,...)15*f4a2713aSLionel Sambuc double varargs_vec_2i(int fixed, ...) {
16*f4a2713aSLionel Sambuc // CHECK: varargs_vec_2i
17*f4a2713aSLionel Sambuc // CHECK: alloca <2 x i32>, align 8
18*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 [[VAR:%.*]], -8
19*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
20*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
21*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[AP_ALIGN]] to <2 x i32>*
22*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_2i
23*f4a2713aSLionel Sambuc // APCS-GNU: alloca <2 x i32>, align 8
24*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <2 x i32>
25*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
26*f4a2713aSLionel Sambuc // APCS-GNU: bitcast <2 x i32>* [[VAR_ALIGN]] to i8*
27*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
28*f4a2713aSLionel Sambuc // APCS-GNU: load <2 x i32>* [[VAR_ALIGN]]
29*f4a2713aSLionel Sambuc va_list ap;
30*f4a2713aSLionel Sambuc double sum = fixed;
31*f4a2713aSLionel Sambuc va_start(ap, fixed);
32*f4a2713aSLionel Sambuc __int2 c3 = va_arg(ap, __int2);
33*f4a2713aSLionel Sambuc sum = sum + c3.x + c3.y;
34*f4a2713aSLionel Sambuc va_end(ap);
35*f4a2713aSLionel Sambuc return sum;
36*f4a2713aSLionel Sambuc }
37*f4a2713aSLionel Sambuc
test_2i(__int2 * in)38*f4a2713aSLionel Sambuc double test_2i(__int2 *in) {
39*f4a2713aSLionel Sambuc // CHECK: test_2i
40*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_2i(i32 3, <2 x i32> {{%.*}})
41*f4a2713aSLionel Sambuc // APCS-GNU: test_2i
42*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_2i(i32 3, <2 x i32> {{%.*}})
43*f4a2713aSLionel Sambuc return varargs_vec_2i(3, *in);
44*f4a2713aSLionel Sambuc }
45*f4a2713aSLionel Sambuc
varargs_vec_3c(int fixed,...)46*f4a2713aSLionel Sambuc double varargs_vec_3c(int fixed, ...) {
47*f4a2713aSLionel Sambuc // CHECK: varargs_vec_3c
48*f4a2713aSLionel Sambuc // CHECK: alloca <3 x i8>, align 4
49*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
50*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[AP]] to <3 x i8>*
51*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_3c
52*f4a2713aSLionel Sambuc // APCS-GNU: alloca <3 x i8>, align 4
53*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
54*f4a2713aSLionel Sambuc // APCS-GNU: bitcast i8* [[AP]] to <3 x i8>*
55*f4a2713aSLionel Sambuc va_list ap;
56*f4a2713aSLionel Sambuc double sum = fixed;
57*f4a2713aSLionel Sambuc va_start(ap, fixed);
58*f4a2713aSLionel Sambuc __char3 c3 = va_arg(ap, __char3);
59*f4a2713aSLionel Sambuc sum = sum + c3.x + c3.y;
60*f4a2713aSLionel Sambuc va_end(ap);
61*f4a2713aSLionel Sambuc return sum;
62*f4a2713aSLionel Sambuc }
63*f4a2713aSLionel Sambuc
test_3c(__char3 * in)64*f4a2713aSLionel Sambuc double test_3c(__char3 *in) {
65*f4a2713aSLionel Sambuc // CHECK: test_3c
66*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_3c(i32 3, i32 {{%.*}})
67*f4a2713aSLionel Sambuc // APCS-GNU: test_3c
68*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_3c(i32 3, i32 {{%.*}})
69*f4a2713aSLionel Sambuc return varargs_vec_3c(3, *in);
70*f4a2713aSLionel Sambuc }
71*f4a2713aSLionel Sambuc
varargs_vec_5c(int fixed,...)72*f4a2713aSLionel Sambuc double varargs_vec_5c(int fixed, ...) {
73*f4a2713aSLionel Sambuc // CHECK: varargs_vec_5c
74*f4a2713aSLionel Sambuc // CHECK: alloca <5 x i8>, align 8
75*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
76*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
77*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
78*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[AP_ALIGN]] to <5 x i8>*
79*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_5c
80*f4a2713aSLionel Sambuc // APCS-GNU: alloca <5 x i8>, align 8
81*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <5 x i8>
82*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
83*f4a2713aSLionel Sambuc // APCS-GNU: bitcast <5 x i8>* [[VAR_ALIGN]] to i8*
84*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
85*f4a2713aSLionel Sambuc // APCS-GNU: load <5 x i8>* [[VAR_ALIGN]]
86*f4a2713aSLionel Sambuc va_list ap;
87*f4a2713aSLionel Sambuc double sum = fixed;
88*f4a2713aSLionel Sambuc va_start(ap, fixed);
89*f4a2713aSLionel Sambuc __char5 c5 = va_arg(ap, __char5);
90*f4a2713aSLionel Sambuc sum = sum + c5.x + c5.y;
91*f4a2713aSLionel Sambuc va_end(ap);
92*f4a2713aSLionel Sambuc return sum;
93*f4a2713aSLionel Sambuc }
94*f4a2713aSLionel Sambuc
test_5c(__char5 * in)95*f4a2713aSLionel Sambuc double test_5c(__char5 *in) {
96*f4a2713aSLionel Sambuc // CHECK: test_5c
97*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_5c(i32 5, <2 x i32> {{%.*}})
98*f4a2713aSLionel Sambuc // APCS-GNU: test_5c
99*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_5c(i32 5, <2 x i32> {{%.*}})
100*f4a2713aSLionel Sambuc return varargs_vec_5c(5, *in);
101*f4a2713aSLionel Sambuc }
102*f4a2713aSLionel Sambuc
varargs_vec_9c(int fixed,...)103*f4a2713aSLionel Sambuc double varargs_vec_9c(int fixed, ...) {
104*f4a2713aSLionel Sambuc // CHECK: varargs_vec_9c
105*f4a2713aSLionel Sambuc // CHECK: alloca <9 x i8>, align 16
106*f4a2713aSLionel Sambuc // CHECK: [[VAR_ALIGN:%.*]] = alloca <9 x i8>
107*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
108*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
109*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
110*f4a2713aSLionel Sambuc // CHECK: bitcast <9 x i8>* [[VAR_ALIGN]] to i8*
111*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy
112*f4a2713aSLionel Sambuc // CHECK: load <9 x i8>* [[VAR_ALIGN]]
113*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_9c
114*f4a2713aSLionel Sambuc // APCS-GNU: alloca <9 x i8>, align 16
115*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <9 x i8>
116*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
117*f4a2713aSLionel Sambuc // APCS-GNU: bitcast <9 x i8>* [[VAR_ALIGN]] to i8*
118*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
119*f4a2713aSLionel Sambuc // APCS-GNU: load <9 x i8>* [[VAR_ALIGN]]
120*f4a2713aSLionel Sambuc va_list ap;
121*f4a2713aSLionel Sambuc double sum = fixed;
122*f4a2713aSLionel Sambuc va_start(ap, fixed);
123*f4a2713aSLionel Sambuc __char9 c9 = va_arg(ap, __char9);
124*f4a2713aSLionel Sambuc sum = sum + c9.x + c9.y;
125*f4a2713aSLionel Sambuc va_end(ap);
126*f4a2713aSLionel Sambuc return sum;
127*f4a2713aSLionel Sambuc }
128*f4a2713aSLionel Sambuc
test_9c(__char9 * in)129*f4a2713aSLionel Sambuc double test_9c(__char9 *in) {
130*f4a2713aSLionel Sambuc // CHECK: test_9c
131*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_9c(i32 9, <4 x i32> {{%.*}})
132*f4a2713aSLionel Sambuc // APCS-GNU: test_9c
133*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_9c(i32 9, <4 x i32> {{%.*}})
134*f4a2713aSLionel Sambuc return varargs_vec_9c(9, *in);
135*f4a2713aSLionel Sambuc }
136*f4a2713aSLionel Sambuc
varargs_vec_19c(int fixed,...)137*f4a2713aSLionel Sambuc double varargs_vec_19c(int fixed, ...) {
138*f4a2713aSLionel Sambuc // CHECK: varargs_vec_19c
139*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
140*f4a2713aSLionel Sambuc // CHECK: [[VAR:%.*]] = bitcast i8* [[AP]] to i8**
141*f4a2713aSLionel Sambuc // CHECK: [[VAR2:%.*]] = load i8** [[VAR]]
142*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[VAR2]] to <19 x i8>*
143*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_19c
144*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* [[AP:%.*]], i32 4
145*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR:%.*]] = bitcast i8* [[AP]] to i8**
146*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR2:%.*]] = load i8** [[VAR]]
147*f4a2713aSLionel Sambuc // APCS-GNU: bitcast i8* [[VAR2]] to <19 x i8>*
148*f4a2713aSLionel Sambuc va_list ap;
149*f4a2713aSLionel Sambuc double sum = fixed;
150*f4a2713aSLionel Sambuc va_start(ap, fixed);
151*f4a2713aSLionel Sambuc __char19 c19 = va_arg(ap, __char19);
152*f4a2713aSLionel Sambuc sum = sum + c19.x + c19.y;
153*f4a2713aSLionel Sambuc va_end(ap);
154*f4a2713aSLionel Sambuc return sum;
155*f4a2713aSLionel Sambuc }
156*f4a2713aSLionel Sambuc
test_19c(__char19 * in)157*f4a2713aSLionel Sambuc double test_19c(__char19 *in) {
158*f4a2713aSLionel Sambuc // CHECK: test_19c
159*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}})
160*f4a2713aSLionel Sambuc // APCS-GNU: test_19c
161*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}})
162*f4a2713aSLionel Sambuc return varargs_vec_19c(19, *in);
163*f4a2713aSLionel Sambuc }
164*f4a2713aSLionel Sambuc
varargs_vec_3s(int fixed,...)165*f4a2713aSLionel Sambuc double varargs_vec_3s(int fixed, ...) {
166*f4a2713aSLionel Sambuc // CHECK: varargs_vec_3s
167*f4a2713aSLionel Sambuc // CHECK: alloca <3 x i16>, align 8
168*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
169*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
170*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 8
171*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i16>*
172*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_3s
173*f4a2713aSLionel Sambuc // APCS-GNU: alloca <3 x i16>, align 8
174*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <3 x i16>
175*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 8
176*f4a2713aSLionel Sambuc // APCS-GNU: bitcast <3 x i16>* [[VAR_ALIGN]] to i8*
177*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
178*f4a2713aSLionel Sambuc // APCS-GNU: load <3 x i16>* [[VAR_ALIGN]]
179*f4a2713aSLionel Sambuc va_list ap;
180*f4a2713aSLionel Sambuc double sum = fixed;
181*f4a2713aSLionel Sambuc va_start(ap, fixed);
182*f4a2713aSLionel Sambuc __short3 c3 = va_arg(ap, __short3);
183*f4a2713aSLionel Sambuc sum = sum + c3.x + c3.y;
184*f4a2713aSLionel Sambuc va_end(ap);
185*f4a2713aSLionel Sambuc return sum;
186*f4a2713aSLionel Sambuc }
187*f4a2713aSLionel Sambuc
test_3s(__short3 * in)188*f4a2713aSLionel Sambuc double test_3s(__short3 *in) {
189*f4a2713aSLionel Sambuc // CHECK: test_3s
190*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_3s(i32 3, <2 x i32> {{%.*}})
191*f4a2713aSLionel Sambuc // APCS-GNU: test_3s
192*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_3s(i32 3, <2 x i32> {{%.*}})
193*f4a2713aSLionel Sambuc return varargs_vec_3s(3, *in);
194*f4a2713aSLionel Sambuc }
195*f4a2713aSLionel Sambuc
varargs_vec_5s(int fixed,...)196*f4a2713aSLionel Sambuc double varargs_vec_5s(int fixed, ...) {
197*f4a2713aSLionel Sambuc // CHECK: varargs_vec_5s
198*f4a2713aSLionel Sambuc // CHECK: alloca <5 x i16>, align 16
199*f4a2713aSLionel Sambuc // CHECK: [[VAR_ALIGN:%.*]] = alloca <5 x i16>
200*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
201*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
202*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
203*f4a2713aSLionel Sambuc // CHECK: bitcast <5 x i16>* [[VAR_ALIGN]] to i8*
204*f4a2713aSLionel Sambuc // CHECK: call void @llvm.memcpy
205*f4a2713aSLionel Sambuc // CHECK: load <5 x i16>* [[VAR_ALIGN]]
206*f4a2713aSLionel Sambuc // APCS-GNU: varargs_vec_5s
207*f4a2713aSLionel Sambuc // APCS-GNU: alloca <5 x i16>, align 16
208*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca <5 x i16>
209*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
210*f4a2713aSLionel Sambuc // APCS-GNU: bitcast <5 x i16>* [[VAR_ALIGN]] to i8*
211*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
212*f4a2713aSLionel Sambuc // APCS-GNU: load <5 x i16>* [[VAR_ALIGN]]
213*f4a2713aSLionel Sambuc va_list ap;
214*f4a2713aSLionel Sambuc double sum = fixed;
215*f4a2713aSLionel Sambuc va_start(ap, fixed);
216*f4a2713aSLionel Sambuc __short5 c5 = va_arg(ap, __short5);
217*f4a2713aSLionel Sambuc sum = sum + c5.x + c5.y;
218*f4a2713aSLionel Sambuc va_end(ap);
219*f4a2713aSLionel Sambuc return sum;
220*f4a2713aSLionel Sambuc }
221*f4a2713aSLionel Sambuc
test_5s(__short5 * in)222*f4a2713aSLionel Sambuc double test_5s(__short5 *in) {
223*f4a2713aSLionel Sambuc // CHECK: test_5s
224*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_5s(i32 5, <4 x i32> {{%.*}})
225*f4a2713aSLionel Sambuc // APCS-GNU: test_5s
226*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_vec_5s(i32 5, <4 x i32> {{%.*}})
227*f4a2713aSLionel Sambuc return varargs_vec_5s(5, *in);
228*f4a2713aSLionel Sambuc }
229*f4a2713aSLionel Sambuc
230*f4a2713aSLionel Sambuc // Pass struct as varargs.
231*f4a2713aSLionel Sambuc typedef struct
232*f4a2713aSLionel Sambuc {
233*f4a2713aSLionel Sambuc __int2 i2;
234*f4a2713aSLionel Sambuc float f;
235*f4a2713aSLionel Sambuc } StructWithVec;
236*f4a2713aSLionel Sambuc
varargs_struct(int fixed,...)237*f4a2713aSLionel Sambuc double varargs_struct(int fixed, ...) {
238*f4a2713aSLionel Sambuc // CHECK: varargs_struct
239*f4a2713aSLionel Sambuc // CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8
240*f4a2713aSLionel Sambuc // CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8*
241*f4a2713aSLionel Sambuc // CHECK: [[AP_NEXT:%.*]] = getelementptr i8* [[AP_ALIGN]], i32 16
242*f4a2713aSLionel Sambuc // CHECK: bitcast i8* [[AP_ALIGN]] to %struct.StructWithVec*
243*f4a2713aSLionel Sambuc // APCS-GNU: varargs_struct
244*f4a2713aSLionel Sambuc // APCS-GNU: [[VAR_ALIGN:%.*]] = alloca %struct.StructWithVec
245*f4a2713aSLionel Sambuc // APCS-GNU: [[AP_NEXT:%.*]] = getelementptr i8* {{%.*}}, i32 16
246*f4a2713aSLionel Sambuc // APCS-GNU: bitcast %struct.StructWithVec* [[VAR_ALIGN]] to i8*
247*f4a2713aSLionel Sambuc // APCS-GNU: call void @llvm.memcpy
248*f4a2713aSLionel Sambuc va_list ap;
249*f4a2713aSLionel Sambuc double sum = fixed;
250*f4a2713aSLionel Sambuc va_start(ap, fixed);
251*f4a2713aSLionel Sambuc StructWithVec c3 = va_arg(ap, StructWithVec);
252*f4a2713aSLionel Sambuc sum = sum + c3.i2.x + c3.i2.y + c3.f;
253*f4a2713aSLionel Sambuc va_end(ap);
254*f4a2713aSLionel Sambuc return sum;
255*f4a2713aSLionel Sambuc }
256*f4a2713aSLionel Sambuc
test_struct(StructWithVec * d)257*f4a2713aSLionel Sambuc double test_struct(StructWithVec* d) {
258*f4a2713aSLionel Sambuc // CHECK: test_struct
259*f4a2713aSLionel Sambuc // CHECK: call arm_aapcscc double (i32, ...)* @varargs_struct(i32 3, [2 x i64] {{%.*}})
260*f4a2713aSLionel Sambuc // APCS-GNU: test_struct
261*f4a2713aSLionel Sambuc // APCS-GNU: call double (i32, ...)* @varargs_struct(i32 3, [2 x i64] {{%.*}})
262*f4a2713aSLionel Sambuc return varargs_struct(3, *d);
263*f4a2713aSLionel Sambuc }
264