1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | \
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN:   FileCheck %s -check-prefix=CHECK -check-prefix=SSE -check-prefix=NO-AVX512
3b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | \
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN:   FileCheck %s -check-prefix=CHECK -check-prefix=AVX -check-prefix=NO-AVX512
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx512f | \
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN:   FileCheck %s -check-prefix=CHECK -check-prefix=AVX -check-prefix=AVX512
7a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner#include <stdarg.h>
8644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define signext i8 @f0()
10644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarchar f0(void) {
11c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
12644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
13644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
1493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define signext i16 @f1()
15644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarshort f1(void) {
16c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
17644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
18644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
1993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f2()
20644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarint f2(void) {
21c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
22644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
23644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
2493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define float @f3()
25644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarfloat f3(void) {
26c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
27644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
28644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
2993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @f4()
30644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbardouble f4(void) {
31c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
32644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
33644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define x86_fp80 @f5()
35644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarlong double f5(void) {
36c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
37644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
38644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar
3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8* %a4)
40644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarvoid f6(char a0, short a1, int a2, long long a3, void *a4) {
41644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar}
42730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlsson
4393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f7(i32 %a0)
440aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbartypedef enum { A, B, C } e7;
450aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f7(e7 a0) {
464b87142aba52c76ff9ed7c9c2fe0067bd935a2f4Mike Stump}
47100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar
48100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar// Test merging/passing of upper eightbyte with X87 class.
490aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar//
5093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f8_1(%union.u8* noalias sret %agg.result)
5193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f8_2(%union.u8* byval align 16 %a0)
52100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarunion u8 {
53100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  long double a;
54100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar  int b;
55100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar};
56c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion u8 f8_1() { while (1) {} }
57100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarvoid f8_2(union u8 a0) {}
588236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
5993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @f9()
60c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s9 { int a; int b; int : 0; } f9(void) { while (1) {} }
618236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
6293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f10(i64 %a0.coerce)
638236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarstruct s10 { int a; int b; int : 0; };
648236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarvoid f10(struct s10 a0) {}
658236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar
6693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f11(%union.anon* noalias sret %agg.result)
67c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion { long double a; float b; } f11() { while (1) {} }
6820e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar
6993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f12_0()
7093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f12_1(i32 %a0.coerce)
717ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarstruct s12 { int a __attribute__((aligned(16))); };
72c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s12 f12_0(void) { while (1) {} }
737ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarvoid f12_1(struct s12 a0) {}
747ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar
753a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// Check that sret parameter is accounted for when checking available integer
763a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// registers.
77c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: define void @f13(%struct.s13_0* noalias sret %agg.result, i32 %a, i32 %b, i32 %c, i32 %d, {{.*}}* byval align 8 %e, i32 %f)
783a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar
793a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbarstruct s13_0 { long long f0[3]; };
8055a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct s13_1 { long long f0[2]; };
810aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarstruct s13_0 f13(int a, int b, int c, int d,
8255a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar                 struct s13_1 e, int f) { while (1) {} }
833a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar
840aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f14({{.*}}, i8 signext %X)
850aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f14(int a, int b, int c, int d, int e, int f, char X) {}
860aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar
870aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f15({{.*}}, i8* %X)
880aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f15(int a, int b, int c, int d, int e, int f, void *X) {}
890aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar
900aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f16({{.*}}, float %X)
9186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f16(float a, float b, float c, float d, float e, float f, float g, float h,
9286e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         float X) {}
930aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar
940aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f17({{.*}}, x86_fp80 %X)
9586e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f17(float a, float b, float c, float d, float e, float f, float g, float h,
9686e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar         long double X) {}
9786e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar
98faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// Check for valid coercion.  The struct should be passed/returned as i32, not
99faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// as i64 for better code quality.
100faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// rdar://8135035
10193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f18(i32 %a, i32 %f18_arg1.coerce)
10255a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct f18_s0 { int f0; };
10355a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarvoid f18(int a, struct f18_s0 f18_arg1) { while (1) {} }
104fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar
10546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar// Check byval alignment.
10646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar
10793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f19(%struct.s19* byval align 16 %x)
10846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarstruct s19 {
10946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar  long double a;
11046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar};
11146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarvoid f19(struct s19 x) {}
11246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar
11393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f20(%struct.s20* byval align 32 %x)
11446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarstruct __attribute__((aligned(32))) s20 {
11546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar  int x;
11646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar  int y;
11746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar};
11846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarvoid f20(struct s20 x) {}
1199c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner
1209c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattnerstruct StringRef {
1219c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner  long x;
1229c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner  const char *Ptr;
1239c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner};
1249c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner
1259c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner// rdar://7375902
12693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i8* @f21(i64 %S.coerce0, i8* %S.coerce1)
1279c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattnerconst char *f21(struct StringRef S) { return S.x+S.Ptr; }
1289c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner
129121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// PR7567
130121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattnertypedef __attribute__ ((aligned(16))) struct f22s { unsigned long long x[2]; } L;
131121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattnervoid f22(L x, L y) { }
132121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: @f22
133121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: %x = alloca{{.*}}, align 16
134121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: %y = alloca{{.*}}, align 16
135121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner
136121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner
1371daf808a48d26328dd31a3275ce599cee326c957Chris Lattner
1381daf808a48d26328dd31a3275ce599cee326c957Chris Lattner// PR7714
1391daf808a48d26328dd31a3275ce599cee326c957Chris Lattnerstruct f23S {
1401daf808a48d26328dd31a3275ce599cee326c957Chris Lattner  short f0;
1411daf808a48d26328dd31a3275ce599cee326c957Chris Lattner  unsigned f1;
1421daf808a48d26328dd31a3275ce599cee326c957Chris Lattner  int f2;
1431daf808a48d26328dd31a3275ce599cee326c957Chris Lattner};
1441daf808a48d26328dd31a3275ce599cee326c957Chris Lattner
145519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner
1461daf808a48d26328dd31a3275ce599cee326c957Chris Lattnervoid f23(int A, struct f23S B) {
14793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @f23(i32 %A, i64 %B.coerce0, i32 %B.coerce1)
1481daf808a48d26328dd31a3275ce599cee326c957Chris Lattner}
1491daf808a48d26328dd31a3275ce599cee326c957Chris Lattner
150519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattnerstruct f24s { long a; int b; };
1511daf808a48d26328dd31a3275ce599cee326c957Chris Lattner
152519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattnerstruct f23S f24(struct f23S *X, struct f24s *P2) {
153519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner  return *X;
154519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner
1559cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define { i64, i32 } @f24(%struct.f23S* %X, %struct.f24s* %P2)
156519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner}
1571daf808a48d26328dd31a3275ce599cee326c957Chris Lattner
158800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner// rdar://8248065
159ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattnertypedef float v4f32 __attribute__((__vector_size__(16)));
160ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattnerv4f32 f25(v4f32 X) {
16193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define <4 x float> @f25(<4 x float> %X)
162800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner  // CHECK-NOT: alloca
163c10ab19fcbc70e3d3897f3c8dbacf6f89a3dfa8cChris Lattner  // CHECK: alloca <4 x float>
164800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner  // CHECK-NOT: alloca
165c10ab19fcbc70e3d3897f3c8dbacf6f89a3dfa8cChris Lattner  // CHECK: store <4 x float> %X, <4 x float>*
166800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner  // CHECK-NOT: store
167800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner  // CHECK: ret <4 x float>
168ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner  return X+X;
169ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner}
170ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner
1714711cb065922d46bfe80383b2001ae681f74780aChris Lattnerstruct foo26 {
1724711cb065922d46bfe80383b2001ae681f74780aChris Lattner  int *X;
1734711cb065922d46bfe80383b2001ae681f74780aChris Lattner  float *Y;
1744711cb065922d46bfe80383b2001ae681f74780aChris Lattner};
175ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner
1764711cb065922d46bfe80383b2001ae681f74780aChris Lattnerstruct foo26 f26(struct foo26 *P) {
1779cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define { i32*, float* } @f26(%struct.foo26* %P)
1784711cb065922d46bfe80383b2001ae681f74780aChris Lattner  return *P;
1794711cb065922d46bfe80383b2001ae681f74780aChris Lattner}
18015842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner
18115842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner
18215842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattnerstruct v4f32wrapper {
18315842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner  v4f32 v;
18415842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner};
18515842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner
18615842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattnerstruct v4f32wrapper f27(struct v4f32wrapper X) {
18793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define <4 x float> @f27(<4 x float> %X.coerce)
18815842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner  return X;
189e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner}
190e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner
1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// PR22563 - We should unwrap simple structs and arrays to pass
1920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// and return them in the appropriate vector registers if possible.
1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef float v8f32 __attribute__((__vector_size__(32)));
1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper {
1960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  v8f32 v;
1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1990e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper f27a(struct v8f32wrapper X) {
2000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // AVX-LABEL: define <8 x float> @f27a(<8 x float> %X.coerce)
2010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return X;
2020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
2030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2040e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper_wrapper {
2050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  v8f32 v[1];
2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
2070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
2080e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper_wrapper f27b(struct v8f32wrapper_wrapper X) {
2090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // AVX-LABEL: define <8 x float> @f27b(<8 x float> %X.coerce)
2100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return X;
2110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
2120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
213e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner// rdar://5711709
214e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattnerstruct f28c {
215e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner  double x;
216e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner  int y;
217e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner};
218e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattnervoid f28(struct f28c C) {
21993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @f28(double %C.coerce0, i32 %C.coerce1)
220e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner}
221e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner
222021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattnerstruct f29a {
223021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner  struct c {
224021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner    double x;
225021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner    int y;
226021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner  } x[1];
227021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner};
228021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner
229021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattnervoid f29a(struct f29a A) {
23093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @f29a(double %A.coerce0, i32 %A.coerce1)
231021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner}
2329e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner
2339e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner// rdar://8249586
2349e45a3de3f462785a86bba77dee168ab354d9704Chris Lattnerstruct S0 { char f0[8]; char f2; char f3; char f4; };
2359e45a3de3f462785a86bba77dee168ab354d9704Chris Lattnervoid f30(struct S0 p_4) {
23693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @f30(i64 %p_4.coerce0, i24 %p_4.coerce1)
2379e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner}
238f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner
239f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner// Pass the third element as a float when followed by tail padding.
240f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner// rdar://8251384
241f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattnerstruct f31foo { float a, b, c; };
242f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattnerfloat f31(struct f31foo X) {
24393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define float @f31(<2 x float> %X.coerce0, float %X.coerce1)
244f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner  return X.c;
245f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner}
246f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner
24722fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner_Complex float f32(_Complex float A, _Complex float B) {
24822fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner  // rdar://6379669
24993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define <2 x float> @f32(<2 x float> %A.coerce, <2 x float> %B.coerce)
25022fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner  return A+B;
25122fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner}
25222fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner
253f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner
254a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner// rdar://8357396
255a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattnerstruct f33s { long x; float c,d; };
256a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner
257a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattnervoid f33(va_list X) {
258a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner  va_arg(X, struct f33s);
259a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner}
260a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner
261473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattnertypedef unsigned long long v1i64 __attribute__((__vector_size__(8)));
262473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattner
263473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattner// rdar://8359248
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-LABEL: define double @f34(double %arg.coerce)
265473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattnerv1i64 f34(v1i64 arg) { return arg; }
266a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner
2670fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner
2680fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner// rdar://8358475
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-LABEL: define double @f35(double %arg.coerce)
2700fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattnertypedef unsigned long v1i64_2 __attribute__((__vector_size__(8)));
2710fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattnerv1i64_2 f35(v1i64_2 arg) { return arg+arg; }
2720fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner
27367a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall// rdar://9122143
274c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func(%struct._str* byval align 16)
27567a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCalltypedef struct _str {
27667a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall  union {
27767a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall    long double a;
27867a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall    long c;
27967a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall  };
28067a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall} str;
28167a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall
28267a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallvoid func(str s);
28367a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallstr ss;
28467a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallvoid f9122143()
28567a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall{
28667a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall  func(ss);
28767a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall}
28867a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall
28993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @f36(double %arg.coerce)
29014508ff0bffee0fdfe5d336946c6db0e709099c8Eli Friedmantypedef unsigned v2i32 __attribute((__vector_size__(8)));
29114508ff0bffee0fdfe5d336946c6db0e709099c8Eli Friedmanv2i32 f36(v2i32 arg) { return arg; }
2924943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
293ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: declare void @f38(<8 x float>)
294ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: declare void @f37(<8 x float>)
295b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// SSE: declare void @f38(%struct.s256* byval align 32)
296b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// SSE: declare void @f37(<8 x float>* byval align 32)
2974943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef float __m256 __attribute__ ((__vector_size__ (32)));
2984943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef struct {
2994943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes  __m256 m;
3004943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} s256;
3014943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
3024943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopess256 x38;
3034943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes__m256 x37;
3044943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
3054943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f38(s256 x);
3064943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f37(__m256 x);
3074943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f39() { f38(x38); f37(x37); }
3084943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
309089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes// The two next tests make sure that the struct below is passed
310089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes// in the same way regardless of avx being used
311089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes
312c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func40(%struct.t128* byval align 16)
3134943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef float __m128 __attribute__ ((__vector_size__ (16)));
314ccafadb68f5a8132a4ee23f441cf5d6976a4133bBruno Cardoso Lopestypedef struct t128 {
3154943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes  __m128 m;
3164943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes  __m128 n;
3174943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} two128;
3184943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
3194943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesextern void func40(two128 s);
3204943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid func41(two128 s) {
3214943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes  func40(s);
3224943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes}
3234943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes
324c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func42(%struct.t128_2* byval align 16)
325089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopestypedef struct xxx {
326089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes  __m128 array[2];
327089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes} Atwo128;
328089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopestypedef struct t128_2 {
329089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes  Atwo128 x;
330089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes} SA;
331089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes
332089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopesextern void func42(SA s);
333089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopesvoid func43(SA s) {
334089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes  func42(s);
335089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes}
3368d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman
33793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f44
3388d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman// CHECK: ptrtoint
33987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: add i64 %{{[0-9]+}}, 31
34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK-NEXT: and i64 %{{[0-9]+}}, -32
3418d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman// CHECK-NEXT: inttoptr
3428d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmantypedef int T44 __attribute((vector_size(32)));
3438d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmanstruct s44 { T44 x; int y; };
3448d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmanint f44(int i, ...) {
3458d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman  __builtin_va_list ap;
3468d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman  __builtin_va_start(ap, i);
3478d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman  struct s44 s = __builtin_va_arg(ap, struct s44);
3488d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman  __builtin_va_end(ap);
3498d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman  return s.y;
3508d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman}
351ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner
352ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner// Text that vec3 returns the correct LLVM IR type.
35393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AVX-LABEL: define i32 @foo(<3 x i64> %X)
354ce275675d33142c235d7027db16abe43da616ee4Tanya Lattnertypedef long long3 __attribute((ext_vector_type(3)));
355ce275675d33142c235d7027db16abe43da616ee4Tanya Lattnerint foo(long3 X)
356ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner{
357ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner  return 0;
358ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner}
3593ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman
3603ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman// Make sure we don't use a varargs convention for a function without a
3613ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman// prototype where AVX types are involved.
362ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: @test45
363ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: call i32 bitcast (i32 (...)* @f45 to i32 (<8 x float>)*)
3643ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedmanint f45();
3653ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman__m256 x45;
3663ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedmanvoid test45() { f45(x45); }
367ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman
368ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// Make sure we use byval to pass 64-bit vectors in memory; the LLVM call
369ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// lowering can't handle this case correctly because it runs after legalization.
370ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// CHECK: @test46
371c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: call void @f46({{.*}}<2 x float>* byval align 8 {{.*}}, <2 x float>* byval align 8 {{.*}})
372ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmantypedef float v46 __attribute((vector_size(8)));
373ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmanvoid f46(v46,v46,v46,v46,v46,v46,v46,v46,v46,v46);
374ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmanvoid test46() { v46 x = {1,2}; f46(x,x,x,x,x,x,x,x,x,x); }
375edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar
376edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// Check that we pass the struct below without using byval, which helps out
377edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// codegen.
378edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar//
379edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// CHECK: @test47
380edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// CHECK: call void @f47(i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}})
381edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarstruct s47 { unsigned a; };
382edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarvoid f47(int,int,int,int,int,int,struct s47);
383edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarvoid test47(int a, struct s47 b) { f47(a, a, a, a, a, a, b); }
384f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren
385f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// rdar://12723368
386f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// In the following example, there are holes in T4 at the 3rd byte and the 4th
387f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// byte, however, T2 does not have those holes. T4 is chosen to be the
388f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// representing type for union T1, but we can't use load or store of T4 since
389f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// it will skip the 3rd byte and the 4th byte.
390f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// In general, Since we don't accurately represent the data fields of a union,
391f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// do not use load or store of the representing llvm type for the union.
392f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex int T2;
393f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex char T5;
394f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex int T7;
395f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef struct T4 { T5 field0; T7 field1; } T4;
396f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef union T1 { T2 field0; T4 field1; } T1;
397f51c61c78e8487061b6a434286488fa3e5b919e5Manman Renextern T1 T1_retval;
398f51c61c78e8487061b6a434286488fa3e5b919e5Manman RenT1 test48(void) {
399f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// CHECK: @test48
400060f34d6d12a851faa9463da522f7dff1104d0e1Manman Ren// CHECK: memcpy
401060f34d6d12a851faa9463da522f7dff1104d0e1Manman Ren// CHECK: memcpy
402f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren  return T1_retval;
403f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren}
404e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall
405e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test49_helper(double, ...);
406e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test49(double d, double e) {
407e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall  test49_helper(d, e);
408e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall}
40993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL:    define void @test49(
4103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK:      [[T0:%.*]] = load double, double*
4113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T1:%.*]] = load double, double*
41258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK-NEXT: call void (double, ...) @test49_helper(double [[T0]], double [[T1]])
413e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall
414e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test50_helper();
415e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test50(double d, double e) {
416e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall  test50_helper(d, e);
417e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall}
41893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL:    define void @test50(
4193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK:      [[T0:%.*]] = load double, double*
4203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T1:%.*]] = load double, double*
42158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK-NEXT: call void (double, double, ...) bitcast (void (...)* @test50_helper to void (double, double, ...)*)(double [[T0]], double [[T1]])
422eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman
423eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedmanstruct test51_s { __uint128_t intval; };
424eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedmanvoid test51(struct test51_s *s, __builtin_va_list argList) {
425eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman    *s = __builtin_va_arg(argList, struct test51_s);
426eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman}
427eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman
42893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test51
429939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: [[TMP_ADDR:%.*]] = alloca [[STRUCT_TEST51:%.*]], align 16
430939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: br i1
431939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: [[REG_SAVE_AREA_PTR:%.*]] = getelementptr inbounds {{.*}}, i32 0, i32 3
4323ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[REG_SAVE_AREA:%.*]] = load i8*, i8** [[REG_SAVE_AREA_PTR]]
4333ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[VALUE_ADDR:%.*]] = getelementptr i8, i8* [[REG_SAVE_AREA]], i32 {{.*}}
434939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[CASTED_VALUE_ADDR:%.*]] = bitcast i8* [[VALUE_ADDR]] to [[STRUCT_TEST51]]
435939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[CASTED_TMP_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[TMP_ADDR]] to i8*
436939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[RECASTED_VALUE_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[CASTED_VALUE_ADDR]] to i8*
437939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[CASTED_TMP_ADDR]], i8* [[RECASTED_VALUE_ADDR]], i64 16, i32 8, i1 false)
438939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: add i32 {{.*}}, 16
439939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: store i32 {{.*}}, i32* {{.*}}
440939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: br label
4417a1b586a383622e3287a5f3d82736ec513032744Eli Friedman
4427a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test52_helper(int, ...);
4437a1b586a383622e3287a5f3d82736ec513032744Eli Friedman__m256 x52;
4447a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test52() {
4457a1b586a383622e3287a5f3d82736ec513032744Eli Friedman  test52_helper(0, x52, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
4467a1b586a383622e3287a5f3d82736ec513032744Eli Friedman}
4477a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX: @test52_helper(i32 0, <8 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double {{%[a-zA-Z0-9]+}}, double {{%[a-zA-Z0-9]+}})
4487a1b586a383622e3287a5f3d82736ec513032744Eli Friedman
4497a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test53(__m256 *m, __builtin_va_list argList) {
4507a1b586a383622e3287a5f3d82736ec513032744Eli Friedman  *m = __builtin_va_arg(argList, __m256);
4517a1b586a383622e3287a5f3d82736ec513032744Eli Friedman}
45293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AVX-LABEL: define void @test53
4537a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX-NOT: br i1
4547a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX: ret void
4557a1b586a383622e3287a5f3d82736ec513032744Eli Friedman
4567a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test54_helper(__m256, ...);
4577a1b586a383622e3287a5f3d82736ec513032744Eli Friedman__m256 x54;
4587a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test54() {
4597a1b586a383622e3287a5f3d82736ec513032744Eli Friedman  test54_helper(x54, x54, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
4607a1b586a383622e3287a5f3d82736ec513032744Eli Friedman  test54_helper(x54, x54, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
4617a1b586a383622e3287a5f3d82736ec513032744Eli Friedman}
4627a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX: @test54_helper(<8 x float> {{%[a-zA-Z0-9]+}}, <8 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double {{%[a-zA-Z0-9]+}}, double {{%[a-zA-Z0-9]+}})
4637a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX: @test54_helper(<8 x float> {{%[a-zA-Z0-9]+}}, <8 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, { double, double }* byval align 8 {{%[a-zA-Z0-9]+}})
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef float __m512 __attribute__ ((__vector_size__ (64)));
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef struct {
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __m512 m;
46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} s512;
46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainars512 x55;
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar__m512 x56;
47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Even on AVX512, aggregates of size larger than four eightbytes have class
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// MEMORY (AVX512 draft 0.3 3.2.3p2 Rule 1).
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: declare void @f55(%struct.s512* byval align 64)
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f55(s512 x);
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// However, __m512 has type SSE/SSEUP on AVX512.
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512: declare void @f56(<16 x float>)
48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// NO-AVX512: declare void @f56(<16 x float>* byval align 64)
48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f56(__m512 x);
48487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f57() { f55(x55); f56(x56); }
48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Like for __m128 on AVX, check that the struct below is passed
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// in the same way regardless of AVX512 being used.
48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
48987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: declare void @f58(%struct.t256* byval align 32)
49087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef struct t256 {
49187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __m256 m;
49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __m256 n;
49387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} two256;
49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
49587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern void f58(two256 s);
49687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f59(two256 s) {
49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  f58(s);
49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: declare void @f60(%struct.sat256* byval align 32)
50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef struct at256 {
50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  __m256 array[2];
50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} Atwo256;
50487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef struct sat256 {
50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Atwo256 x;
50687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} SAtwo256;
50787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern void f60(SAtwo256 s);
50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f61(SAtwo256 s) {
51087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  f60(s);
51187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
51287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
51387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512: @f62_helper(i32 0, <16 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double {{%[a-zA-Z0-9]+}}, double {{%[a-zA-Z0-9]+}})
51487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f62_helper(int, ...);
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar__m512 x62;
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f62() {
51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  f62_helper(0, x62, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
51887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
52087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Like for __m256 on AVX, we always pass __m512 in memory, and don't
52187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// need to use the register save area.
52287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar//
52387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512-LABEL: define void @f63
52487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512-NOT: br i1
52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512: ret void
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f63(__m512 *m, __builtin_va_list argList) {
52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  *m = __builtin_va_arg(argList, __m512);
52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512: @f64_helper(<16 x float> {{%[a-zA-Z0-9]+}}, <16 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double {{%[a-zA-Z0-9]+}}, double {{%[a-zA-Z0-9]+}})
53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// AVX512: @f64_helper(<16 x float> {{%[a-zA-Z0-9]+}}, <16 x float> {{%[a-zA-Z0-9]+}}, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, { double, double }* byval align 8 {{%[a-zA-Z0-9]+}})
53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f64_helper(__m512, ...);
53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar__m512 x64;
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid f64() {
53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  f64_helper(x64, x64, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  f64_helper(x64, x64, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i);
53787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
538