| // REQUIRES: powerpc-registered-target |
| // RUN: %clang_cc1 -triple powerpc-unknown-aix -target-feature +altivec \ |
| // RUN: -emit-llvm -o - %s | FileCheck --check-prefix=AIX32 %s |
| // RUN: %clang_cc1 -triple powerpc64-unknown-aix -target-feature +altivec \ |
| // RUN: -emit-llvm -o - %s | FileCheck --check-prefix=AIX64 %s |
| |
| typedef struct { |
| } Zero; |
| typedef struct { |
| char c; |
| } One; |
| typedef struct { |
| short s; |
| } Two; |
| typedef struct { |
| char c[3]; |
| } Three; |
| typedef struct { |
| float f; |
| } Four; |
| typedef struct { |
| char c[5]; |
| } Five; |
| typedef struct { |
| short s[3]; |
| } Six; |
| typedef struct { |
| char c[7]; |
| } Seven; |
| typedef struct { |
| long long l; |
| } Eight; |
| typedef struct { |
| int i; |
| } __attribute__((aligned(32))) OverAligned; |
| typedef struct { |
| int i; |
| vector signed int vsi; |
| } StructVector; |
| |
| // AIX32-LABEL: define void @arg0(%struct.Zero* byval(%struct.Zero) align 4 %x) |
| // AIX64-LABEL: define void @arg0(%struct.Zero* byval(%struct.Zero) align 8 %x) |
| void arg0(Zero x) {} |
| |
| // AIX32-LABEL: define void @arg1(%struct.One* byval(%struct.One) align 4 %x) |
| // AIX64-LABEL: define void @arg1(%struct.One* byval(%struct.One) align 8 %x) |
| void arg1(One x) {} |
| |
| // AIX32-LABEL: define void @arg2(%struct.Two* byval(%struct.Two) align 4 %x) |
| // AIX64-LABEL: define void @arg2(%struct.Two* byval(%struct.Two) align 8 %x) |
| void arg2(Two x) {} |
| |
| // AIX32-LABEL: define void @arg3(%struct.Three* byval(%struct.Three) align 4 %x) |
| // AIX64-LABEL: define void @arg3(%struct.Three* byval(%struct.Three) align 8 %x) |
| void arg3(Three x) {} |
| |
| // AIX32-LABEL: define void @arg4(%struct.Four* byval(%struct.Four) align 4 %x) |
| // AIX64-LABEL: define void @arg4(%struct.Four* byval(%struct.Four) align 8 %x) |
| void arg4(Four x) {} |
| |
| // AIX32-LABEL: define void @arg5(%struct.Five* byval(%struct.Five) align 4 %x) |
| // AIX64-LABEL: define void @arg5(%struct.Five* byval(%struct.Five) align 8 %x) |
| void arg5(Five x) {} |
| |
| // AIX32-LABEL: define void @arg6(%struct.Six* byval(%struct.Six) align 4 %x) |
| // AIX64-LABEL: define void @arg6(%struct.Six* byval(%struct.Six) align 8 %x) |
| void arg6(Six x) {} |
| |
| // AIX32-LABEL: define void @arg7(%struct.Seven* byval(%struct.Seven) align 4 %x) |
| // AIX64-LABEL: define void @arg7(%struct.Seven* byval(%struct.Seven) align 8 %x) |
| void arg7(Seven x) {} |
| |
| // AIX32-LABEL: define void @arg8(%struct.Eight* byval(%struct.Eight) align 4 %0) |
| // AIX32: %x = alloca %struct.Eight, align 8 |
| // AIX32: call void @llvm.memcpy.p0i8.p0i8.i32 |
| // AIX64-LABEL: define void @arg8(%struct.Eight* byval(%struct.Eight) align 8 %x) |
| void arg8(Eight x) {} |
| |
| // AIX32-LABEL: define void @arg9(%struct.OverAligned* byval(%struct.OverAligned) align 4 %0) |
| // AIX32: %x = alloca %struct.OverAligned, align 32 |
| // AIX32: call void @llvm.memcpy.p0i8.p0i8.i32 |
| // AIX64-LABEL: define void @arg9(%struct.OverAligned* byval(%struct.OverAligned) align 8 %0) |
| // AIX64: %x = alloca %struct.OverAligned, align 32 |
| // AIX64: call void @llvm.memcpy.p0i8.p0i8.i64 |
| void arg9(OverAligned x) {} |
| |
| // AIX32-LABEL: define void @arg10(%struct.StructVector* byval(%struct.StructVector) align 16 %x) |
| // AIX64-LABEL: define void @arg10(%struct.StructVector* byval(%struct.StructVector) align 16 %x) |
| void arg10(StructVector x) {} |