1f79470583759d20c20268711e6111461aefa8461Jim Grosbach// REQUIRES: arm-registered-target
2a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-abi apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s
3a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-abi aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s
416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
575d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define signext i8 @f0()
616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc signext i8 @f0()
716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarchar f0(void) {
816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar  return 0;
916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar}
1016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
1175d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i8 @f1()
1216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i8 @f1()
1316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s1 { char f0; };
1416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s1 f1(void) {}
1516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
1675d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i16 @f2()
1716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i16 @f2()
1816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s2 { short f0; };
1916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s2 f2(void) {}
2016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
2175d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f3()
2216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f3()
2316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s3 { int f0; };
2416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s3 f3(void) {}
2516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
2675d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f4()
2716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f4()
2816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s4 { struct s4_0 { int f0; } f0; };
2916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s4 f4(void) {}
3016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
3175d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f5(
32410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s5* noalias sret
3316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f5()
3416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s5 { struct { } f0; int f1; };
3516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s5 f5(void) {}
3616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
3775d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f6(
38410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s6* noalias sret
3916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f6()
4016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s6 { int f0[1]; };
4116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s6 f6(void) {}
4216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
4375d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f7()
4416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc void @f7()
4516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s7 { struct { int : 0; } f0; };
4616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s7 f7(void) {}
4716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
4875d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f8(
49410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s8* noalias sret
5016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc void @f8()
5116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s8 { struct { int : 0; } f0[1]; };
5216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s8 f8(void) {}
5316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
5475d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f9()
5516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f9()
5616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s9 { int f0; int : 0; };
5716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s9 f9(void) {}
5816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
5975d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f10()
6016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f10()
6116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s10 { int f0; int : 0; int : 0; };
6216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s10 f10(void) {}
6316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
6475d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f11(
65410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s11* noalias sret
6616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f11()
6716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s11 { int : 0; int f0; };
6816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s11 f11(void) {}
6916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
7075d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f12()
7116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar// AAPCS: define arm_aapcscc i32 @f12()
7216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarunion u12 { char f0; short f1; int f2; };
7316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarunion u12 f12(void) {}
74b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar
7575d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f13(
76410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s13* noalias sret
77b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar
78b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar// FIXME: This should return a float.
7975d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// AAPCS-FIXME: darm_aapcscc efine float @f13()
80b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarstruct s13 { float f0; };
81b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarstruct s13 f13(void) {}
82b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar
8375d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f14(
84410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: union.u14* noalias sret
85b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f14()
86b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarunion u14 { float f0; };
87b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarunion u14 f14(void) {}
88420255710694e958fa04bed1d80d96508949879eDaniel Dunbar
8975d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f15()
90420255710694e958fa04bed1d80d96508949879eDaniel Dunbar// AAPCS: define arm_aapcscc void @f15()
91420255710694e958fa04bed1d80d96508949879eDaniel Dunbarvoid f15(struct s7 a0) {}
92420255710694e958fa04bed1d80d96508949879eDaniel Dunbar
9375d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f16()
94420255710694e958fa04bed1d80d96508949879eDaniel Dunbar// AAPCS: define arm_aapcscc void @f16()
95420255710694e958fa04bed1d80d96508949879eDaniel Dunbarvoid f16(struct s8 a0) {}
96679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
9775d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f17()
98679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f17()
99679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s17 { short f0 : 13; char f1 : 4; };
100679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s17 f17(void) {}
101679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
10275d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f18()
103679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f18()
104679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s18 { short f0; char f1 : 4; };
105679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s18 f18(void) {}
106679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
10775d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f19(
108410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s19* noalias sret
109679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f19()
110679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s19 { int f0; struct s8 f1; };
111679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s19 f19(void) {}
112679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
11375d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define void @f20(
114410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: struct.s20* noalias sret
115679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f20()
116679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s20 { struct s8 f1; int f0; };
117679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s20 f20(void) {}
118679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
11975d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i8 @f21()
120679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f21()
121679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s21 { struct {} f1; int f0 : 4; };
122679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s21 f21(void) {}
1234cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar
12475d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i16 @f22()
12575d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f23()
12675d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i64 @f24()
12775d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i128 @f25()
12875d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i64 @f26()
12975d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i128 @f27()
1304cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar// AAPCS: define arm_aapcscc i16 @f22()
1314cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f23()
132410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// AAPCS: define arm_aapcscc void @f24({{.*}} noalias sret
133410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// AAPCS: define arm_aapcscc void @f25({{.*}} noalias sret
134410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// AAPCS: define arm_aapcscc void @f26({{.*}} noalias sret
135410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// AAPCS: define arm_aapcscc void @f27({{.*}} noalias sret
1364cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex char       f22(void) {}
1374cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex short      f23(void) {}
1384cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex int        f24(void) {}
1394cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex long long  f25(void) {}
1404cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex float      f26(void) {}
1414cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar_Complex double     f27(void) {}
1424581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar
14375d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i16 @f28()
1444581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar// AAPCS: define arm_aapcscc i16 @f28()
1454581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s28 { _Complex char f0; };
1464581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s28 f28() {}
1474581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar
14875d0f82e50565cc4cf71140ecf2141a40a3a5af9Rafael Espindola// APCS-GNU: define i32 @f29()
1494581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar// AAPCS: define arm_aapcscc i32 @f29()
1504581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s29 { _Complex short f0; };
1514581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s29 f29() {}
1524581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar
153410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// APCS-GNU: define void @f30({{.*}} noalias sret
154410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall// AAPCS: define arm_aapcscc void @f30({{.*}} noalias sret
1554581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s30 { _Complex int f0; };
1564581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s30 f30() {}
157a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov
158a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov// PR11905
159a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanovstruct s31 { char x; };
160a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanovvoid f31(struct s31 s) { }
161a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov// AAPCS: @f31([1 x i32] %s.coerce)
162a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov// AAPCS: %s = alloca %struct.s31, align 4
1631067d05041db25301cd923712870bcf97db6d8bcEvgeniy Stepanov// AAPCS: alloca [1 x i32]
1641067d05041db25301cd923712870bcf97db6d8bcEvgeniy Stepanov// AAPCS: store [1 x i32] %s.coerce, [1 x i32]*
165a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov// APCS-GNU: @f31([1 x i32] %s.coerce)
166a6ce20ea10b1788ed1f266d5809a7ac2bca7bf1bEvgeniy Stepanov// APCS-GNU: %s = alloca %struct.s31, align 4
1671067d05041db25301cd923712870bcf97db6d8bcEvgeniy Stepanov// APCS-GNU: alloca [1 x i32]
1681067d05041db25301cd923712870bcf97db6d8bcEvgeniy Stepanov// APCS-GNU: store [1 x i32] %s.coerce, [1 x i32]*
16979f30981fcd25c6ff88807372a2744af02a7690eEli Friedman
17079f30981fcd25c6ff88807372a2744af02a7690eEli Friedman// PR13562
17179f30981fcd25c6ff88807372a2744af02a7690eEli Friedmanstruct s32 { double x; };
17279f30981fcd25c6ff88807372a2744af02a7690eEli Friedmanvoid f32(struct s32 s) { }
17379f30981fcd25c6ff88807372a2744af02a7690eEli Friedman// AAPCS: @f32([1 x i64] %s.coerce)
17479f30981fcd25c6ff88807372a2744af02a7690eEli Friedman// APCS-GNU: @f32([2 x i32] %s.coerce)
17516ba7c8498933781cff103058612e76e8045c798Manman Ren
17616ba7c8498933781cff103058612e76e8045c798Manman Ren// PR13350
17716ba7c8498933781cff103058612e76e8045c798Manman Renstruct s33 { char buf[32*32]; };
17816ba7c8498933781cff103058612e76e8045c798Manman Renvoid f33(struct s33 s) { }
17916ba7c8498933781cff103058612e76e8045c798Manman Ren// APCS-GNU: define void @f33(%struct.s33* byval %s)
18016ba7c8498933781cff103058612e76e8045c798Manman Ren// AAPCS: define arm_aapcscc void @f33(%struct.s33* byval %s)
181f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth
182f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// PR14048
183f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruthstruct s34 { char c; };
184f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruthvoid f34(struct s34 s);
185f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruthvoid g34(struct s34 *s) { f34(*s); }
186f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// APCS-GNU: @g34(%struct.s34* %s)
187f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// APCS-GNU: %[[a:.*]] = alloca { [1 x i32] }
188f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// APCS-GNU: %[[gep:.*]] = getelementptr { [1 x i32] }* %[[a]], i32 0, i32 0
189f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// APCS-GNU: load [1 x i32]* %[[gep]]
190f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// AAPCS: @g34(%struct.s34* %s)
191f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// AAPCS: %[[a:.*]] = alloca { [1 x i32] }
192f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// AAPCS: %[[gep:.*]] = getelementptr { [1 x i32] }* %[[a]], i32 0, i32 0
193f82232c8b73851337b83b954ba1292cf6475c7c5Chandler Carruth// AAPCS: load [1 x i32]* %[[gep]]
194885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren
195885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// rdar://12596507
196885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Renstruct s35
197885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren{
198885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren   float v[18]; //make sure byval is on.
199885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren} __attribute__((aligned(16)));
200885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Rentypedef struct s35 s35_with_align;
201885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren
202885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Rentypedef __attribute__((neon_vector_type(4))) float float32x4_t;
203885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Renstatic __attribute__((__always_inline__, __nodebug__)) float32x4_t vaddq_f32(
204885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren       float32x4_t __a, float32x4_t __b) {
205885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren return __a + __b;
206885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren}
207885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Renfloat32x4_t f35(int i, s35_with_align s1, s35_with_align s2) {
208885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren  float32x4_t v = vaddq_f32(*(float32x4_t *)&s1,
209885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren                            *(float32x4_t *)&s2);
210885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren  return v;
211885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren}
212885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: define <4 x float> @f35(i32 %i, %struct.s35* byval, %struct.s35* byval)
213885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: %[[a:.*]] = alloca %struct.s35, align 16
214885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
215885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
216885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
217885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
218885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// APCS-GNU: load <4 x float>* %[[d]], align 16
219885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: define arm_aapcscc <4 x float> @f35(i32 %i, %struct.s35* byval, %struct.s35* byval)
220885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: %[[a:.*]] = alloca %struct.s35, align 16
221885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
222885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
223885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
224885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
225885ad6928f8aca8e9f66eeece53e00364e14ea75Manman Ren// AAPCS: load <4 x float>* %[[d]], align 16
226