1f79470583759d20c20268711e6111461aefa8461Jim Grosbach// REQUIRES: arm-registered-target
22440fb1f91557912f8c43cb72201170254ae09f4Amara Emerson// RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s
32440fb1f91557912f8c43cb72201170254ae09f4Amara Emerson// RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s
416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define signext i8 @f0()
693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc signext i8 @f0()
716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarchar f0(void) {
816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar  return 0;
916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar}
1016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i8 @f1()
1293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i8 @f1()
1316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s1 { char f0; };
1416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s1 f1(void) {}
1516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
1693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i16 @f2()
1793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i16 @f2()
1816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s2 { short f0; };
1916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s2 f2(void) {}
2016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
2193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f3()
2293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f3()
2316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s3 { int f0; };
2416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s3 f3(void) {}
2516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
2693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f4()
2793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f4()
2816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s4 { struct s4_0 { int f0; } f0; };
2916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s4 f4(void) {}
3016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f5(
325e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s5* noalias sret
3393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f5()
3416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s5 { struct { } f0; int f1; };
3516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s5 f5(void) {}
3616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
3793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f6(
385e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s6* noalias sret
3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f6()
4016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s6 { int f0[1]; };
4116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s6 f6(void) {}
4216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
4393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f7()
4493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc void @f7()
4516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s7 { struct { int : 0; } f0; };
4616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s7 f7(void) {}
4716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
4893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f8(
495e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s8* noalias sret
5093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc void @f8()
5116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s8 { struct { int : 0; } f0[1]; };
5216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s8 f8(void) {}
5316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
5493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f9()
5593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f9()
5616a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s9 { int f0; int : 0; };
5716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s9 f9(void) {}
5816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
5993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f10()
6093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f10()
6116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s10 { int f0; int : 0; int : 0; };
6216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s10 f10(void) {}
6316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
6493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f11(
655e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s11* noalias sret
6693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f11()
6716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s11 { int : 0; int f0; };
6816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarstruct s11 f11(void) {}
6916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar
7093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f12()
7193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f12()
7216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarunion u12 { char f0; short f1; int f2; };
7316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbarunion u12 f12(void) {}
74b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar
7593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f13(
765e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// 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
8393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f14(
845e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: union.u14* noalias sret
8593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f14()
86b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarunion u14 { float f0; };
87b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbarunion u14 f14(void) {}
88420255710694e958fa04bed1d80d96508949879eDaniel Dunbar
8993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f15()
9093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc void @f15()
91420255710694e958fa04bed1d80d96508949879eDaniel Dunbarvoid f15(struct s7 a0) {}
92420255710694e958fa04bed1d80d96508949879eDaniel Dunbar
9393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f16()
9493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc void @f16()
95420255710694e958fa04bed1d80d96508949879eDaniel Dunbarvoid f16(struct s8 a0) {}
96679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
9793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f17()
9893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f17()
99679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s17 { short f0 : 13; char f1 : 4; };
100679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s17 f17(void) {}
101679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
10293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f18()
10393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f18()
104679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s18 { short f0; char f1 : 4; };
105679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s18 f18(void) {}
106679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
10793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f19(
1085e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s19* noalias sret
10993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f19()
110679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s19 { int f0; struct s8 f1; };
111679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s19 f19(void) {}
112679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
11393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define void @f20(
1145e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: struct.s20* noalias sret
11593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f20()
116679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s20 { struct s8 f1; int f0; };
117679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s20 f20(void) {}
118679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar
11993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i8 @f21()
12093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f21()
121679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s21 { struct {} f1; int f0 : 4; };
122679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbarstruct s21 f21(void) {}
1234cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar
12493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i16 @f22()
12593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f23()
12693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i64 @f24()
12793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i128 @f25()
12893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i64 @f26()
12993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i128 @f27()
13093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i16 @f22()
13193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f23()
1325e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// AAPCS: define arm_aapcscc void @f24({{.*}} noalias sret
1335e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// AAPCS: define arm_aapcscc void @f25({{.*}} noalias sret
1345e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// AAPCS: define arm_aapcscc void @f26({{.*}} noalias sret
1355e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// 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
14393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i16 @f28()
14493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i16 @f28()
1454581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s28 { _Complex char f0; };
1464581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s28 f28() {}
1474581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar
14893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// APCS-GNU-LABEL: define i32 @f29()
14993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// AAPCS-LABEL: define arm_aapcscc i32 @f29()
1504581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s29 { _Complex short f0; };
1514581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbarstruct s29 f29() {}
1524581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar
1535e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// APCS-GNU: define void @f30({{.*}} noalias sret
1545e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling// 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) { }
179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// APCS-GNU-LABEL: define void @f33(%struct.s33* byval align 1 %s)
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// AAPCS-LABEL: define arm_aapcscc void @f33(%struct.s33* byval align 1 %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}
212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// APCS-GNU-LABEL: define <4 x float> @f35(i32 %i, %struct.s35* byval align 16, %struct.s35* byval align 16)
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
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// AAPCS-LABEL: define arm_aapcscc <4 x float> @f35(i32 %i, %struct.s35* byval align 16, %struct.s35* byval align 16)
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