x86_64-arguments.c revision 3ea9e33ea25e0c2b12db56418ba3f994eb662c04
122fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s| FileCheck %s 2ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | FileCheck %s -check-prefix=AVX 3a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner#include <stdarg.h> 4644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define signext i8 @f0() 6644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarchar f0(void) { 7c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 8644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 9644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 1093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define signext i16 @f1() 11644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarshort f1(void) { 12c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 13644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 14644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 1593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f2() 16644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarint f2(void) { 17c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 18644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 19644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 2093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define float @f3() 21644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarfloat f3(void) { 22c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 23644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 24644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 2593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @f4() 26644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbardouble f4(void) { 27c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 28644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 29644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 3093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define x86_fp80 @f5() 31644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarlong double f5(void) { 32c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump return 0; 33644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 34644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar 3593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8* %a4) 36644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbarvoid f6(char a0, short a1, int a2, long long a3, void *a4) { 37644f4c3fe4130c7be75d6191340ba8d857ba0730Daniel Dunbar} 38730f909e146b0ac5dbcf9b8be65cb8f82c68d883Anders Carlsson 3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f7(i32 %a0) 400aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbartypedef enum { A, B, C } e7; 410aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f7(e7 a0) { 424b87142aba52c76ff9ed7c9c2fe0067bd935a2f4Mike Stump} 43100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar 44100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar// Test merging/passing of upper eightbyte with X87 class. 450aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// 4693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f8_1(%union.u8* noalias sret %agg.result) 4793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f8_2(%union.u8* byval align 16 %a0) 48100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarunion u8 { 49100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar long double a; 50100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar int b; 51100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbar}; 52c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion u8 f8_1() { while (1) {} } 53100f402451da96f74ea58b1f49fc53b4fa149a57Daniel Dunbarvoid f8_2(union u8 a0) {} 548236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar 5593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @f9() 56c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s9 { int a; int b; int : 0; } f9(void) { while (1) {} } 578236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar 5893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f10(i64 %a0.coerce) 598236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarstruct s10 { int a; int b; int : 0; }; 608236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbarvoid f10(struct s10 a0) {} 618236bf1800641d1c296579e25218f68f74c5caacDaniel Dunbar 6293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f11(%union.anon* noalias sret %agg.result) 63c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpunion { long double a; float b; } f11() { while (1) {} } 6420e95c5eb400c864bbd4421624fdf7b25ce70f56Daniel Dunbar 6593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f12_0() 6693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f12_1(i32 %a0.coerce) 677ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarstruct s12 { int a __attribute__((aligned(16))); }; 68c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpstruct s12 f12_0(void) { while (1) {} } 697ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbarvoid f12_1(struct s12 a0) {} 707ef455be9beb7a755d815bfbdc38d55d1ce59b86Daniel Dunbar 713a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// Check that sret parameter is accounted for when checking available integer 723a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar// registers. 73c1ea4b96adca4767991bb0a7b21052cef4db059cBill 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) 743a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar 753a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbarstruct s13_0 { long long f0[3]; }; 7655a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct s13_1 { long long f0[2]; }; 770aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarstruct s13_0 f13(int a, int b, int c, int d, 7855a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbar struct s13_1 e, int f) { while (1) {} } 793a5f5c57e0a262207f7cb721a60df3676ab5209fDaniel Dunbar 800aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f14({{.*}}, i8 signext %X) 810aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f14(int a, int b, int c, int d, int e, int f, char X) {} 820aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar 830aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f15({{.*}}, i8* %X) 840aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbarvoid f15(int a, int b, int c, int d, int e, int f, void *X) {} 850aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar 860aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f16({{.*}}, float %X) 8786e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f16(float a, float b, float c, float d, float e, float f, float g, float h, 8886e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar float X) {} 890aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar 900aa1cba02fb3d08500217a46fa1287e43fdae2e1Daniel Dunbar// CHECK: define void @f17({{.*}}, x86_fp80 %X) 9186e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbarvoid f17(float a, float b, float c, float d, float e, float f, float g, float h, 9286e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar long double X) {} 9386e13eeb65397f7b64173523a40c742b2702364bDaniel Dunbar 94faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// Check for valid coercion. The struct should be passed/returned as i32, not 95faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// as i64 for better code quality. 96faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner// rdar://8135035 9793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f18(i32 %a, i32 %f18_arg1.coerce) 9855a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarstruct f18_s0 { int f0; }; 9955a759b8bb52e9d74c92e17543780751c5e5c5ecDaniel Dunbarvoid f18(int a, struct f18_s0 f18_arg1) { while (1) {} } 100fdf4986c4c75514df428ed71d5942252f18e129bDaniel Dunbar 10146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar// Check byval alignment. 10246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 10393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f19(%struct.s19* byval align 16 %x) 10446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarstruct s19 { 10546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar long double a; 10646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar}; 10746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarvoid f19(struct s19 x) {} 10846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f20(%struct.s20* byval align 32 %x) 11046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarstruct __attribute__((aligned(32))) s20 { 11146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar int x; 11246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar int y; 11346c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar}; 11446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbarvoid f20(struct s20 x) {} 1159c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 1169c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattnerstruct StringRef { 1179c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner long x; 1189c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner const char *Ptr; 1199c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner}; 1209c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 1219c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner// rdar://7375902 12293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i8* @f21(i64 %S.coerce0, i8* %S.coerce1) 1239c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattnerconst char *f21(struct StringRef S) { return S.x+S.Ptr; } 1249c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 125121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// PR7567 126121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattnertypedef __attribute__ ((aligned(16))) struct f22s { unsigned long long x[2]; } L; 127121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattnervoid f22(L x, L y) { } 128121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: @f22 129121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: %x = alloca{{.*}}, align 16 130121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner// CHECK: %y = alloca{{.*}}, align 16 131121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner 132121b3facb4e0585d23766f9c1e4fdf9018a4b217Chris Lattner 1331daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 1341daf808a48d26328dd31a3275ce599cee326c957Chris Lattner// PR7714 1351daf808a48d26328dd31a3275ce599cee326c957Chris Lattnerstruct f23S { 1361daf808a48d26328dd31a3275ce599cee326c957Chris Lattner short f0; 1371daf808a48d26328dd31a3275ce599cee326c957Chris Lattner unsigned f1; 1381daf808a48d26328dd31a3275ce599cee326c957Chris Lattner int f2; 1391daf808a48d26328dd31a3275ce599cee326c957Chris Lattner}; 1401daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 141519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1421daf808a48d26328dd31a3275ce599cee326c957Chris Lattnervoid f23(int A, struct f23S B) { 14393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @f23(i32 %A, i64 %B.coerce0, i32 %B.coerce1) 1441daf808a48d26328dd31a3275ce599cee326c957Chris Lattner} 1451daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 146519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattnerstruct f24s { long a; int b; }; 1471daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 148519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattnerstruct f23S f24(struct f23S *X, struct f24s *P2) { 149519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner return *X; 150519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1519cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner // CHECK: define { i64, i32 } @f24(%struct.f23S* %X, %struct.f24s* %P2) 152519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner} 1531daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 154800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner// rdar://8248065 155ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattnertypedef float v4f32 __attribute__((__vector_size__(16))); 156ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattnerv4f32 f25(v4f32 X) { 15793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define <4 x float> @f25(<4 x float> %X) 158800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner // CHECK-NOT: alloca 159c10ab19fcbc70e3d3897f3c8dbacf6f89a3dfa8cChris Lattner // CHECK: alloca <4 x float> 160800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner // CHECK-NOT: alloca 161c10ab19fcbc70e3d3897f3c8dbacf6f89a3dfa8cChris Lattner // CHECK: store <4 x float> %X, <4 x float>* 162800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner // CHECK-NOT: store 163800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner // CHECK: ret <4 x float> 164ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner return X+X; 165ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner} 166ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner 1674711cb065922d46bfe80383b2001ae681f74780aChris Lattnerstruct foo26 { 1684711cb065922d46bfe80383b2001ae681f74780aChris Lattner int *X; 1694711cb065922d46bfe80383b2001ae681f74780aChris Lattner float *Y; 1704711cb065922d46bfe80383b2001ae681f74780aChris Lattner}; 171ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner 1724711cb065922d46bfe80383b2001ae681f74780aChris Lattnerstruct foo26 f26(struct foo26 *P) { 1739cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner // CHECK: define { i32*, float* } @f26(%struct.foo26* %P) 1744711cb065922d46bfe80383b2001ae681f74780aChris Lattner return *P; 1754711cb065922d46bfe80383b2001ae681f74780aChris Lattner} 17615842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 17715842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 17815842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattnerstruct v4f32wrapper { 17915842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner v4f32 v; 18015842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner}; 18115842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 18215842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattnerstruct v4f32wrapper f27(struct v4f32wrapper X) { 18393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define <4 x float> @f27(<4 x float> %X.coerce) 18415842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner return X; 185e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner} 186e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 1870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// PR22563 - We should unwrap simple structs and arrays to pass 1880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// and return them in the appropriate vector registers if possible. 1890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1900e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypedef float v8f32 __attribute__((__vector_size__(32))); 1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper { 1920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines v8f32 v; 1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}; 1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper f27a(struct v8f32wrapper X) { 1960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // AVX-LABEL: define <8 x float> @f27a(<8 x float> %X.coerce) 1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return X; 1980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 1990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 2000e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper_wrapper { 2010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines v8f32 v[1]; 2020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}; 2030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 2040e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct v8f32wrapper_wrapper f27b(struct v8f32wrapper_wrapper X) { 2050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // AVX-LABEL: define <8 x float> @f27b(<8 x float> %X.coerce) 2060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return X; 2070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 2080e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 209e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner// rdar://5711709 210e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattnerstruct f28c { 211e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner double x; 212e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner int y; 213e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner}; 214e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattnervoid f28(struct f28c C) { 21593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @f28(double %C.coerce0, i32 %C.coerce1) 216e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner} 217e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 218021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattnerstruct f29a { 219021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner struct c { 220021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner double x; 221021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner int y; 222021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner } x[1]; 223021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner}; 224021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner 225021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattnervoid f29a(struct f29a A) { 22693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @f29a(double %A.coerce0, i32 %A.coerce1) 227021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner} 2289e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner 2299e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner// rdar://8249586 2309e45a3de3f462785a86bba77dee168ab354d9704Chris Lattnerstruct S0 { char f0[8]; char f2; char f3; char f4; }; 2319e45a3de3f462785a86bba77dee168ab354d9704Chris Lattnervoid f30(struct S0 p_4) { 23293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @f30(i64 %p_4.coerce0, i24 %p_4.coerce1) 2339e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner} 234f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 235f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner// Pass the third element as a float when followed by tail padding. 236f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner// rdar://8251384 237f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattnerstruct f31foo { float a, b, c; }; 238f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattnerfloat f31(struct f31foo X) { 23993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define float @f31(<2 x float> %X.coerce0, float %X.coerce1) 240f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner return X.c; 241f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner} 242f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 24322fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner_Complex float f32(_Complex float A, _Complex float B) { 24422fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner // rdar://6379669 24593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define <2 x float> @f32(<2 x float> %A.coerce, <2 x float> %B.coerce) 24622fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner return A+B; 24722fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner} 24822fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner 249f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 250a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner// rdar://8357396 251a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattnerstruct f33s { long x; float c,d; }; 252a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner 253a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattnervoid f33(va_list X) { 254a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner va_arg(X, struct f33s); 255a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner} 256a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner 257473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattnertypedef unsigned long long v1i64 __attribute__((__vector_size__(8))); 258473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattner 259473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattner// rdar://8359248 26093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @f34(i64 %arg.coerce) 261473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattnerv1i64 f34(v1i64 arg) { return arg; } 262a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner 2630fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner 2640fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner// rdar://8358475 26593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i64 @f35(i64 %arg.coerce) 2660fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattnertypedef unsigned long v1i64_2 __attribute__((__vector_size__(8))); 2670fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattnerv1i64_2 f35(v1i64_2 arg) { return arg+arg; } 2680fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner 26967a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall// rdar://9122143 270c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func(%struct._str* byval align 16) 27167a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCalltypedef struct _str { 27267a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall union { 27367a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall long double a; 27467a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall long c; 27567a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall }; 27667a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall} str; 27767a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall 27867a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallvoid func(str s); 27967a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallstr ss; 28067a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCallvoid f9122143() 28167a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall{ 28267a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall func(ss); 28367a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall} 28467a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall 28593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @f36(double %arg.coerce) 28614508ff0bffee0fdfe5d336946c6db0e709099c8Eli Friedmantypedef unsigned v2i32 __attribute((__vector_size__(8))); 28714508ff0bffee0fdfe5d336946c6db0e709099c8Eli Friedmanv2i32 f36(v2i32 arg) { return arg; } 2884943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 289ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: declare void @f38(<8 x float>) 290ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: declare void @f37(<8 x float>) 291c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @f38(%struct.s256* byval align 32) 292c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @f37(<8 x float>* byval align 32) 2934943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef float __m256 __attribute__ ((__vector_size__ (32))); 2944943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef struct { 2954943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes __m256 m; 2964943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} s256; 2974943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 2984943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopess256 x38; 2994943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes__m256 x37; 3004943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 3014943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f38(s256 x); 3024943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f37(__m256 x); 3034943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid f39() { f38(x38); f37(x37); } 3044943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 305089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes// The two next tests make sure that the struct below is passed 306089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes// in the same way regardless of avx being used 307089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes 308c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func40(%struct.t128* byval align 16) 3094943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopestypedef float __m128 __attribute__ ((__vector_size__ (16))); 310ccafadb68f5a8132a4ee23f441cf5d6976a4133bBruno Cardoso Lopestypedef struct t128 { 3114943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes __m128 m; 3124943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes __m128 n; 3134943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} two128; 3144943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 3154943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesextern void func40(two128 s); 3164943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid func41(two128 s) { 3174943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes func40(s); 3184943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} 3194943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 320c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: declare void @func42(%struct.t128_2* byval align 16) 321089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopestypedef struct xxx { 322089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes __m128 array[2]; 323089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes} Atwo128; 324089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopestypedef struct t128_2 { 325089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes Atwo128 x; 326089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes} SA; 327089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes 328089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopesextern void func42(SA s); 329089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopesvoid func43(SA s) { 330089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes func42(s); 331089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes} 3328d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman 33393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f44 3348d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman// CHECK: ptrtoint 3358d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman// CHECK-NEXT: and {{.*}}, -32 3368d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman// CHECK-NEXT: inttoptr 3378d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmantypedef int T44 __attribute((vector_size(32))); 3388d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmanstruct s44 { T44 x; int y; }; 3398d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedmanint f44(int i, ...) { 3408d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman __builtin_va_list ap; 3418d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman __builtin_va_start(ap, i); 3428d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman struct s44 s = __builtin_va_arg(ap, struct s44); 3438d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman __builtin_va_end(ap); 3448d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman return s.y; 3458d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman} 346ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner 347ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner// Text that vec3 returns the correct LLVM IR type. 34893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AVX-LABEL: define i32 @foo(<3 x i64> %X) 349ce275675d33142c235d7027db16abe43da616ee4Tanya Lattnertypedef long long3 __attribute((ext_vector_type(3))); 350ce275675d33142c235d7027db16abe43da616ee4Tanya Lattnerint foo(long3 X) 351ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner{ 352ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner return 0; 353ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner} 3543ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman 3553ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman// Make sure we don't use a varargs convention for a function without a 3563ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman// prototype where AVX types are involved. 357ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: @test45 358ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// AVX: call i32 bitcast (i32 (...)* @f45 to i32 (<8 x float>)*) 3593ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedmanint f45(); 3603ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman__m256 x45; 3613ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedmanvoid test45() { f45(x45); } 362ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 363ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// Make sure we use byval to pass 64-bit vectors in memory; the LLVM call 364ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// lowering can't handle this case correctly because it runs after legalization. 365ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman// CHECK: @test46 366c1ea4b96adca4767991bb0a7b21052cef4db059cBill Wendling// CHECK: call void @f46({{.*}}<2 x float>* byval align 8 {{.*}}, <2 x float>* byval align 8 {{.*}}) 367ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmantypedef float v46 __attribute((vector_size(8))); 368ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmanvoid f46(v46,v46,v46,v46,v46,v46,v46,v46,v46,v46); 369ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmanvoid test46() { v46 x = {1,2}; f46(x,x,x,x,x,x,x,x,x,x); } 370edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar 371edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// Check that we pass the struct below without using byval, which helps out 372edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// codegen. 373edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// 374edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// CHECK: @test47 375edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar// CHECK: call void @f47(i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 {{.*}}) 376edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarstruct s47 { unsigned a; }; 377edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarvoid f47(int,int,int,int,int,int,struct s47); 378edfac0302490d84419eb958c812c533b8df29785Daniel Dunbarvoid test47(int a, struct s47 b) { f47(a, a, a, a, a, a, b); } 379f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren 380f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// rdar://12723368 381f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// In the following example, there are holes in T4 at the 3rd byte and the 4th 382f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// byte, however, T2 does not have those holes. T4 is chosen to be the 383f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// representing type for union T1, but we can't use load or store of T4 since 384f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// it will skip the 3rd byte and the 4th byte. 385f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// In general, Since we don't accurately represent the data fields of a union, 386f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// do not use load or store of the representing llvm type for the union. 387f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex int T2; 388f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex char T5; 389f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef _Complex int T7; 390f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef struct T4 { T5 field0; T7 field1; } T4; 391f51c61c78e8487061b6a434286488fa3e5b919e5Manman Rentypedef union T1 { T2 field0; T4 field1; } T1; 392f51c61c78e8487061b6a434286488fa3e5b919e5Manman Renextern T1 T1_retval; 393f51c61c78e8487061b6a434286488fa3e5b919e5Manman RenT1 test48(void) { 394f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren// CHECK: @test48 395060f34d6d12a851faa9463da522f7dff1104d0e1Manman Ren// CHECK: memcpy 396060f34d6d12a851faa9463da522f7dff1104d0e1Manman Ren// CHECK: memcpy 397f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren return T1_retval; 398f51c61c78e8487061b6a434286488fa3e5b919e5Manman Ren} 399e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall 400e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test49_helper(double, ...); 401e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test49(double d, double e) { 402e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall test49_helper(d, e); 403e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall} 40493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test49( 4053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[T0:%.*]] = load double, double* 4063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T1:%.*]] = load double, double* 407e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall// CHECK-NEXT: call void (double, ...)* @test49_helper(double [[T0]], double [[T1]]) 408e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall 409e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test50_helper(); 410e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCallvoid test50(double d, double e) { 411e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall test50_helper(d, e); 412e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall} 41393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test50( 4143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: [[T0:%.*]] = load double, double* 4153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[T1:%.*]] = load double, double* 416e56bb36e8eea89bae7dfe6eb6ea0455af126bf4aJohn McCall// CHECK-NEXT: call void (double, double, ...)* bitcast (void (...)* @test50_helper to void (double, double, ...)*)(double [[T0]], double [[T1]]) 417eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman 418eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedmanstruct test51_s { __uint128_t intval; }; 419eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedmanvoid test51(struct test51_s *s, __builtin_va_list argList) { 420eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman *s = __builtin_va_arg(argList, struct test51_s); 421eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman} 422eeb00624413d4a4856e66809b84c558d2cdce17fEli Friedman 42393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @test51 424939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: [[TMP_ADDR:%.*]] = alloca [[STRUCT_TEST51:%.*]], align 16 425939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: br i1 426939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK: [[REG_SAVE_AREA_PTR:%.*]] = getelementptr inbounds {{.*}}, i32 0, i32 3 4273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[REG_SAVE_AREA:%.*]] = load i8*, i8** [[REG_SAVE_AREA_PTR]] 4283ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-NEXT: [[VALUE_ADDR:%.*]] = getelementptr i8, i8* [[REG_SAVE_AREA]], i32 {{.*}} 429939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[CASTED_VALUE_ADDR:%.*]] = bitcast i8* [[VALUE_ADDR]] to [[STRUCT_TEST51]] 430939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[CASTED_TMP_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[TMP_ADDR]] to i8* 431939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: [[RECASTED_VALUE_ADDR:%.*]] = bitcast [[STRUCT_TEST51]]* [[CASTED_VALUE_ADDR]] to i8* 432939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[CASTED_TMP_ADDR]], i8* [[RECASTED_VALUE_ADDR]], i64 16, i32 8, i1 false) 433939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: add i32 {{.*}}, 16 434939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: store i32 {{.*}}, i32* {{.*}} 435939d83efba53994af07c7dc82b88873132a18c0dEli Friedman// CHECK-NEXT: br label 4367a1b586a383622e3287a5f3d82736ec513032744Eli Friedman 4377a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test52_helper(int, ...); 4387a1b586a383622e3287a5f3d82736ec513032744Eli Friedman__m256 x52; 4397a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test52() { 4407a1b586a383622e3287a5f3d82736ec513032744Eli Friedman test52_helper(0, x52, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i); 4417a1b586a383622e3287a5f3d82736ec513032744Eli Friedman} 4427a1b586a383622e3287a5f3d82736ec513032744Eli 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]+}}) 4437a1b586a383622e3287a5f3d82736ec513032744Eli Friedman 4447a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test53(__m256 *m, __builtin_va_list argList) { 4457a1b586a383622e3287a5f3d82736ec513032744Eli Friedman *m = __builtin_va_arg(argList, __m256); 4467a1b586a383622e3287a5f3d82736ec513032744Eli Friedman} 44793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AVX-LABEL: define void @test53 4487a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX-NOT: br i1 4497a1b586a383622e3287a5f3d82736ec513032744Eli Friedman// AVX: ret void 4507a1b586a383622e3287a5f3d82736ec513032744Eli Friedman 4517a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test54_helper(__m256, ...); 4527a1b586a383622e3287a5f3d82736ec513032744Eli Friedman__m256 x54; 4537a1b586a383622e3287a5f3d82736ec513032744Eli Friedmanvoid test54() { 4547a1b586a383622e3287a5f3d82736ec513032744Eli Friedman test54_helper(x54, x54, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i); 4557a1b586a383622e3287a5f3d82736ec513032744Eli Friedman test54_helper(x54, x54, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0i); 4567a1b586a383622e3287a5f3d82736ec513032744Eli Friedman} 4577a1b586a383622e3287a5f3d82736ec513032744Eli 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]+}}) 4587a1b586a383622e3287a5f3d82736ec513032744Eli 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]+}}) 459