xref: /llvm-project/clang/test/CodeGen/PowerPC/aix-struct-arg.c (revision 39db5e1ed87363a9ffea81e53520b542201b3262)
1f563bd74SQiu Chaofan // REQUIRES: powerpc-registered-target
2*39db5e1eSNikita Popov // RUN: %clang_cc1 -triple powerpc-unknown-aix -target-feature +altivec \
3f563bd74SQiu Chaofan // RUN:   -emit-llvm -o - %s | FileCheck --check-prefix=AIX32 %s
4*39db5e1eSNikita Popov // RUN: %clang_cc1 -triple powerpc64-unknown-aix -target-feature +altivec \
5f563bd74SQiu Chaofan // RUN:   -emit-llvm -o - %s | FileCheck --check-prefix=AIX64 %s
6f563bd74SQiu Chaofan 
7f563bd74SQiu Chaofan typedef struct {
8f563bd74SQiu Chaofan } Zero;
9f563bd74SQiu Chaofan typedef struct {
10f563bd74SQiu Chaofan   char c;
11f563bd74SQiu Chaofan } One;
12f563bd74SQiu Chaofan typedef struct {
13f563bd74SQiu Chaofan   short s;
14f563bd74SQiu Chaofan } Two;
15f563bd74SQiu Chaofan typedef struct {
16f563bd74SQiu Chaofan   char c[3];
17f563bd74SQiu Chaofan } Three;
18f563bd74SQiu Chaofan typedef struct {
19f563bd74SQiu Chaofan   float f;
20f563bd74SQiu Chaofan } Four;
21f563bd74SQiu Chaofan typedef struct {
22f563bd74SQiu Chaofan   char c[5];
23f563bd74SQiu Chaofan } Five;
24f563bd74SQiu Chaofan typedef struct {
25f563bd74SQiu Chaofan   short s[3];
26f563bd74SQiu Chaofan } Six;
27f563bd74SQiu Chaofan typedef struct {
28f563bd74SQiu Chaofan   char c[7];
29f563bd74SQiu Chaofan } Seven;
30f563bd74SQiu Chaofan typedef struct {
31f563bd74SQiu Chaofan   long long l;
32f563bd74SQiu Chaofan } Eight;
33f563bd74SQiu Chaofan typedef struct {
34f563bd74SQiu Chaofan   int i;
35f563bd74SQiu Chaofan } __attribute__((aligned(32))) OverAligned;
36f563bd74SQiu Chaofan typedef struct {
37f563bd74SQiu Chaofan   int i;
38f563bd74SQiu Chaofan   vector signed int vsi;
39f563bd74SQiu Chaofan } StructVector;
40f563bd74SQiu Chaofan 
41*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg0(ptr noundef byval(%struct.Zero) align 4 %x)
42*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg0(ptr noundef byval(%struct.Zero) align 8 %x)
arg0(Zero x)43f563bd74SQiu Chaofan void arg0(Zero x) {}
44f563bd74SQiu Chaofan 
45*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg1(ptr noundef byval(%struct.One) align 4 %x)
46*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg1(ptr noundef byval(%struct.One) align 8 %x)
arg1(One x)47f563bd74SQiu Chaofan void arg1(One x) {}
48f563bd74SQiu Chaofan 
49*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg2(ptr noundef byval(%struct.Two) align 4 %x)
50*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg2(ptr noundef byval(%struct.Two) align 8 %x)
arg2(Two x)51f563bd74SQiu Chaofan void arg2(Two x) {}
52f563bd74SQiu Chaofan 
53*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg3(ptr noundef byval(%struct.Three) align 4 %x)
54*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg3(ptr noundef byval(%struct.Three) align 8 %x)
arg3(Three x)55f563bd74SQiu Chaofan void arg3(Three x) {}
56f563bd74SQiu Chaofan 
57*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg4(ptr noundef byval(%struct.Four) align 4 %x)
58*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg4(ptr noundef byval(%struct.Four) align 8 %x)
arg4(Four x)59f563bd74SQiu Chaofan void arg4(Four x) {}
60f563bd74SQiu Chaofan 
61*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg5(ptr noundef byval(%struct.Five) align 4 %x)
62*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg5(ptr noundef byval(%struct.Five) align 8 %x)
arg5(Five x)63f563bd74SQiu Chaofan void arg5(Five x) {}
64f563bd74SQiu Chaofan 
65*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg6(ptr noundef byval(%struct.Six) align 4 %x)
66*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg6(ptr noundef byval(%struct.Six) align 8 %x)
arg6(Six x)67f563bd74SQiu Chaofan void arg6(Six x) {}
68f563bd74SQiu Chaofan 
69*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg7(ptr noundef byval(%struct.Seven) align 4 %x)
70*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg7(ptr noundef byval(%struct.Seven) align 8 %x)
arg7(Seven x)71f563bd74SQiu Chaofan void arg7(Seven x) {}
72f563bd74SQiu Chaofan 
73*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg8(ptr noundef byval(%struct.Eight) align 4 %0)
74f563bd74SQiu Chaofan // AIX32:         %x = alloca %struct.Eight, align 8
75*39db5e1eSNikita Popov // AIX32:         call void @llvm.memcpy.p0.p0.i32
76*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg8(ptr noundef byval(%struct.Eight) align 8 %x)
arg8(Eight x)77f563bd74SQiu Chaofan void arg8(Eight x) {}
78f563bd74SQiu Chaofan 
79*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg9(ptr noundef byval(%struct.OverAligned) align 4 %0)
80f563bd74SQiu Chaofan // AIX32:         %x = alloca %struct.OverAligned, align 32
81*39db5e1eSNikita Popov // AIX32:         call void @llvm.memcpy.p0.p0.i32
82*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg9(ptr noundef byval(%struct.OverAligned) align 8 %0)
83f563bd74SQiu Chaofan // AIX64:         %x = alloca %struct.OverAligned, align 32
84*39db5e1eSNikita Popov // AIX64:         call void @llvm.memcpy.p0.p0.i64
arg9(OverAligned x)85f563bd74SQiu Chaofan void arg9(OverAligned x) {}
86f563bd74SQiu Chaofan 
87*39db5e1eSNikita Popov // AIX32-LABEL: define void @arg10(ptr noundef byval(%struct.StructVector) align 16 %x)
88*39db5e1eSNikita Popov // AIX64-LABEL: define void @arg10(ptr noundef byval(%struct.StructVector) align 16 %x)
arg10(StructVector x)89f563bd74SQiu Chaofan void arg10(StructVector x) {}
90