blob: 210a44e104c1b5579a79cf95d4d88eb42489ac24 [file] [log] [blame]
Chris Lattner22fd4ba2010-08-25 23:39:14 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s| FileCheck %s
Chris Lattnera8b7a7d2010-08-26 06:28:35 +00002#include <stdarg.h>
Daniel Dunbar644f4c32009-02-14 02:09:24 +00003
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +00004// CHECK: %0 = type { i64, double }
5
6// CHECK: define signext i8 @f0()
Daniel Dunbar644f4c32009-02-14 02:09:24 +00007char f0(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +00008 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +00009}
10
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000011// CHECK: define signext i16 @f1()
Daniel Dunbar644f4c32009-02-14 02:09:24 +000012short f1(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +000013 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +000014}
15
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000016// CHECK: define i32 @f2()
Daniel Dunbar644f4c32009-02-14 02:09:24 +000017int f2(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +000018 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +000019}
20
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000021// CHECK: define float @f3()
Daniel Dunbar644f4c32009-02-14 02:09:24 +000022float f3(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +000023 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +000024}
25
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000026// CHECK: define double @f4()
Daniel Dunbar644f4c32009-02-14 02:09:24 +000027double f4(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +000028 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +000029}
30
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000031// CHECK: define x86_fp80 @f5()
Daniel Dunbar644f4c32009-02-14 02:09:24 +000032long double f5(void) {
Mike Stumpc36541e2009-07-21 20:52:43 +000033 return 0;
Daniel Dunbar644f4c32009-02-14 02:09:24 +000034}
35
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000036// CHECK: define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8* %a4)
Daniel Dunbar644f4c32009-02-14 02:09:24 +000037void f6(char a0, short a1, int a2, long long a3, void *a4) {
38}
Anders Carlsson730f9092009-02-26 17:38:19 +000039
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000040// CHECK: define void @f7(i32 %a0)
41typedef enum { A, B, C } e7;
42void f7(e7 a0) {
Mike Stump4b871422009-02-26 19:00:14 +000043}
Daniel Dunbar100f4022009-03-06 17:50:25 +000044
45// Test merging/passing of upper eightbyte with X87 class.
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000046//
47// CHECK: define %0 @f8_1()
Chris Lattner225e2862010-06-29 00:14:52 +000048// CHECK: define void @f8_2(i64 %a0.coerce0, double %a0.coerce1)
Daniel Dunbar100f4022009-03-06 17:50:25 +000049union u8 {
50 long double a;
51 int b;
52};
Mike Stumpc36541e2009-07-21 20:52:43 +000053union u8 f8_1() { while (1) {} }
Daniel Dunbar100f4022009-03-06 17:50:25 +000054void f8_2(union u8 a0) {}
Daniel Dunbar8236bf12009-05-08 22:26:44 +000055
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000056// CHECK: define i64 @f9()
Mike Stumpc36541e2009-07-21 20:52:43 +000057struct s9 { int a; int b; int : 0; } f9(void) { while (1) {} }
Daniel Dunbar8236bf12009-05-08 22:26:44 +000058
Chris Lattner225e2862010-06-29 00:14:52 +000059// CHECK: define void @f10(i64 %a0.coerce)
Daniel Dunbar8236bf12009-05-08 22:26:44 +000060struct s10 { int a; int b; int : 0; };
61void f10(struct s10 a0) {}
62
Daniel Dunbar46c54fb2010-04-21 19:49:55 +000063// CHECK: define void @f11(%struct.s19* sret %agg.result)
Mike Stumpc36541e2009-07-21 20:52:43 +000064union { long double a; float b; } f11() { while (1) {} }
Daniel Dunbar20e95c52009-05-12 15:22:40 +000065
Chris Lattnere2962be2010-07-29 07:30:00 +000066// CHECK: define i32 @f12_0()
67// CHECK: define void @f12_1(i32 %a0.coerce)
Daniel Dunbar7ef455b2009-05-13 18:54:26 +000068struct s12 { int a __attribute__((aligned(16))); };
Mike Stumpc36541e2009-07-21 20:52:43 +000069struct s12 f12_0(void) { while (1) {} }
Daniel Dunbar7ef455b2009-05-13 18:54:26 +000070void f12_1(struct s12 a0) {}
71
Daniel Dunbar3a5f5c52009-05-22 17:33:44 +000072// Check that sret parameter is accounted for when checking available integer
73// registers.
Chris Lattner121b3fa2010-07-05 20:21:00 +000074// CHECK: define void @f13(%struct.s13_0* sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval %e, i32 %f)
Daniel Dunbar3a5f5c52009-05-22 17:33:44 +000075
76struct s13_0 { long long f0[3]; };
Daniel Dunbar55a759b2009-08-23 19:28:59 +000077struct s13_1 { long long f0[2]; };
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000078struct s13_0 f13(int a, int b, int c, int d,
Daniel Dunbar55a759b2009-08-23 19:28:59 +000079 struct s13_1 e, int f) { while (1) {} }
Daniel Dunbar3a5f5c52009-05-22 17:33:44 +000080
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000081// CHECK: define void @f14({{.*}}, i8 signext %X)
82void f14(int a, int b, int c, int d, int e, int f, char X) {}
83
84// CHECK: define void @f15({{.*}}, i8* %X)
85void f15(int a, int b, int c, int d, int e, int f, void *X) {}
86
87// CHECK: define void @f16({{.*}}, float %X)
Daniel Dunbar86e13ee2009-05-26 16:37:37 +000088void f16(float a, float b, float c, float d, float e, float f, float g, float h,
89 float X) {}
Daniel Dunbar0aa1cba2010-04-21 19:10:54 +000090
91// CHECK: define void @f17({{.*}}, x86_fp80 %X)
Daniel Dunbar86e13ee2009-05-26 16:37:37 +000092void f17(float a, float b, float c, float d, float e, float f, float g, float h,
93 long double X) {}
94
Chris Lattnerfaf23b72010-06-28 19:56:59 +000095// Check for valid coercion. The struct should be passed/returned as i32, not
96// as i64 for better code quality.
97// rdar://8135035
Chris Lattner225e2862010-06-29 00:14:52 +000098// CHECK: define void @f18(i32 %a, i32 %f18_arg1.coerce)
Daniel Dunbar55a759b2009-08-23 19:28:59 +000099struct f18_s0 { int f0; };
100void f18(int a, struct f18_s0 f18_arg1) { while (1) {} }
Daniel Dunbarfdf49862009-06-05 07:58:54 +0000101
Daniel Dunbar46c54fb2010-04-21 19:49:55 +0000102// Check byval alignment.
103
104// CHECK: define void @f19(%struct.s19* byval align 16 %x)
105struct s19 {
106 long double a;
107};
108void f19(struct s19 x) {}
109
110// CHECK: define void @f20(%struct.s20* byval align 32 %x)
111struct __attribute__((aligned(32))) s20 {
112 int x;
113 int y;
114};
115void f20(struct s20 x) {}
Chris Lattner9c254f02010-06-29 06:01:59 +0000116
117struct StringRef {
118 long x;
119 const char *Ptr;
120};
121
122// rdar://7375902
123// CHECK: define i8* @f21(i64 %S.coerce0, i8* %S.coerce1)
124const char *f21(struct StringRef S) { return S.x+S.Ptr; }
125
Chris Lattner121b3fa2010-07-05 20:21:00 +0000126// PR7567
127typedef __attribute__ ((aligned(16))) struct f22s { unsigned long long x[2]; } L;
128void f22(L x, L y) { }
129// CHECK: @f22
130// CHECK: %x = alloca{{.*}}, align 16
131// CHECK: %y = alloca{{.*}}, align 16
132
133
Chris Lattner1daf8082010-07-28 22:15:08 +0000134
135// PR7714
136struct f23S {
137 short f0;
138 unsigned f1;
139 int f2;
140};
141
Chris Lattner519f68c2010-07-28 23:06:14 +0000142
Chris Lattner1daf8082010-07-28 22:15:08 +0000143void f23(int A, struct f23S B) {
144 // CHECK: define void @f23(i32 %A, i64 %B.coerce0, i32 %B.coerce1)
145}
146
Chris Lattner519f68c2010-07-28 23:06:14 +0000147struct f24s { long a; int b; };
Chris Lattner1daf8082010-07-28 22:15:08 +0000148
Chris Lattner519f68c2010-07-28 23:06:14 +0000149struct f23S f24(struct f23S *X, struct f24s *P2) {
150 return *X;
151
152 // CHECK: define %struct.f24s @f24(%struct.f23S* %X, %struct.f24s* %P2)
153}
Chris Lattner1daf8082010-07-28 22:15:08 +0000154
Chris Lattner800588f2010-07-29 06:26:06 +0000155// rdar://8248065
Chris Lattnerab5722e2010-07-28 23:47:21 +0000156typedef float v4f32 __attribute__((__vector_size__(16)));
Chris Lattnerab5722e2010-07-28 23:47:21 +0000157v4f32 f25(v4f32 X) {
Chris Lattner800588f2010-07-29 06:26:06 +0000158 // CHECK: define <4 x float> @f25(<4 x float> %X)
159 // CHECK-NOT: alloca
Chris Lattnerc10ab192010-07-29 17:14:05 +0000160 // CHECK: alloca <4 x float>
Chris Lattner800588f2010-07-29 06:26:06 +0000161 // CHECK-NOT: alloca
Chris Lattnerc10ab192010-07-29 17:14:05 +0000162 // CHECK: store <4 x float> %X, <4 x float>*
Chris Lattner800588f2010-07-29 06:26:06 +0000163 // CHECK-NOT: store
164 // CHECK: ret <4 x float>
Chris Lattnerab5722e2010-07-28 23:47:21 +0000165 return X+X;
166}
167
Chris Lattner4711cb02010-07-29 04:46:19 +0000168struct foo26 {
169 int *X;
170 float *Y;
171};
Chris Lattnerab5722e2010-07-28 23:47:21 +0000172
Chris Lattner4711cb02010-07-29 04:46:19 +0000173struct foo26 f26(struct foo26 *P) {
174 // CHECK: define %struct.foo26 @f26(%struct.foo26* %P)
175 return *P;
176}
Chris Lattner15842bd2010-07-29 05:02:29 +0000177
178
179struct v4f32wrapper {
180 v4f32 v;
181};
182
183struct v4f32wrapper f27(struct v4f32wrapper X) {
184 // CHECK: define <4 x float> @f27(<4 x float> %X.coerce)
185 return X;
Chris Lattnere2962be2010-07-29 07:30:00 +0000186}
187
188// rdar://5711709
189struct f28c {
190 double x;
191 int y;
192};
193void f28(struct f28c C) {
194 // CHECK: define void @f28(double %C.coerce0, i32 %C.coerce1)
195}
196
Chris Lattner021c3a32010-07-29 07:43:55 +0000197struct f29a {
198 struct c {
199 double x;
200 int y;
201 } x[1];
202};
203
204void f29a(struct f29a A) {
205 // CHECK: define void @f29a(double %A.coerce0, i32 %A.coerce1)
206}
Chris Lattner9e45a3d2010-07-29 17:34:39 +0000207
208// rdar://8249586
209struct S0 { char f0[8]; char f2; char f3; char f4; };
210void f30(struct S0 p_4) {
211 // CHECK: define void @f30(i64 %p_4.coerce0, i24 %p_4.coerce1)
212}
Chris Lattnerf47c9442010-07-29 18:13:09 +0000213
214// Pass the third element as a float when followed by tail padding.
215// rdar://8251384
216struct f31foo { float a, b, c; };
217float f31(struct f31foo X) {
Chris Lattner22fd4ba2010-08-25 23:39:14 +0000218 // CHECK: define float @f31(<2 x float> %X.coerce0, float %X.coerce1)
Chris Lattnerf47c9442010-07-29 18:13:09 +0000219 return X.c;
220}
221
Chris Lattner22fd4ba2010-08-25 23:39:14 +0000222_Complex float f32(_Complex float A, _Complex float B) {
223 // rdar://6379669
224 // CHECK: define <2 x float> @f32(<2 x float> %A.coerce, <2 x float> %B.coerce)
225 return A+B;
226}
227
Chris Lattnerf47c9442010-07-29 18:13:09 +0000228
Chris Lattnera8b7a7d2010-08-26 06:28:35 +0000229// rdar://8357396
230struct f33s { long x; float c,d; };
231
232void f33(va_list X) {
233 va_arg(X, struct f33s);
234}
235
236