1+ // ignore-tidy-linelength
12// revisions:m68k wasm x86_64-linux x86_64-windows i686-linux i686-windows
23
34//[m68k] compile-flags: --target m68k-unknown-linux-gnu
2930impl Copy for i32 { }
3031impl Copy for i64 { }
3132
33+ // This struct can be represented as a pair, so it exercises the OperandValue::Pair
34+ // codepath in `codegen_argument`.
35+ #[ repr( C ) ]
36+ pub struct NaturalAlign1 {
37+ a : i8 ,
38+ b : i8 ,
39+ }
40+
41+ // This struct cannot be represented as an immediate, so it exercises the OperandValue::Ref
42+ // codepath in `codegen_argument`.
3243#[ repr( C ) ]
3344pub struct NaturalAlign2 {
3445 a : [ i16 ; 16 ] ,
@@ -67,7 +78,93 @@ pub struct ForceAlign16 {
6778 b : i8
6879}
6980
81+ // CHECK-LABEL: @call_na1
82+ #[ no_mangle]
83+ pub unsafe fn call_na1 ( x : NaturalAlign1 ) {
84+ // CHECK: start:
85+
86+ // m68k: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 1
87+ // m68k: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}} [[ALLOCA]])
88+
89+ // wasm: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 1
90+ // wasm: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}} [[ALLOCA]])
91+
92+ // x86_64-linux: call void @natural_align_1(i16
93+
94+ // x86_64-windows: call void @natural_align_1(i16
95+
96+ // i686-linux: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 4
97+ // i686-linux: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}} [[ALLOCA]])
98+
99+ // i686-windows: [[ALLOCA:%[a-z0-9+]]] = alloca { i8, i8 }, align 4
100+ // i686-windows: call void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}} [[ALLOCA]])
101+ natural_align_1 ( x) ;
102+ }
103+
104+ // CHECK-LABEL: @call_na2
105+ #[ no_mangle]
106+ pub unsafe fn call_na2 ( x : NaturalAlign2 ) {
107+ // CHECK: start:
108+
109+ // m68k-NEXT: call void @natural_align_2
110+ // wasm-NEXT: call void @natural_align_2
111+ // x86_64-linux-NEXT: call void @natural_align_2
112+ // x86_64-windows-NEXT: call void @natural_align_2
113+
114+ // i686-linux: [[ALLOCA:%[0-9]+]] = alloca %NaturalAlign2, align 4
115+ // i686-linux: call void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}} [[ALLOCA]])
116+
117+ // i686-windows: [[ALLOCA:%[0-9]+]] = alloca %NaturalAlign2, align 4
118+ // i686-windows: call void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}} [[ALLOCA]])
119+ natural_align_2 ( x) ;
120+ }
121+
122+ // CHECK-LABEL: @call_fa4
123+ #[ no_mangle]
124+ pub unsafe fn call_fa4 ( x : ForceAlign4 ) {
125+ // CHECK: start:
126+ // CHECK-NEXT: call void @force_align_4
127+ force_align_4 ( x) ;
128+ }
129+
130+ // CHECK-LABEL: @call_na8
131+ #[ no_mangle]
132+ pub unsafe fn call_na8 ( x : NaturalAlign8 ) {
133+ // CHECK: start:
134+ // CHECK-NEXT: call void @natural_align_8
135+ natural_align_8 ( x) ;
136+ }
137+
138+ // CHECK-LABEL: @call_fa8
139+ #[ no_mangle]
140+ pub unsafe fn call_fa8 ( x : ForceAlign8 ) {
141+ // CHECK: start:
142+ // CHECK-NEXT: call void @force_align_8
143+ force_align_8 ( x) ;
144+ }
145+
146+ // CHECK-LABEL: @call_fa16
147+ #[ no_mangle]
148+ pub unsafe fn call_fa16 ( x : ForceAlign16 ) {
149+ // CHECK: start:
150+ // CHECK-NEXT: call void @force_align_16
151+ force_align_16 ( x) ;
152+ }
153+
70154extern "C" {
155+ // m68k: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}})
156+
157+ // wasm: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 1{{.*}})
158+
159+ // x86_64-linux: declare void @natural_align_1(i16)
160+
161+ // x86_64-windows: declare void @natural_align_1(i16)
162+
163+ // i686-linux: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}})
164+
165+ // i686-windows: declare void @natural_align_1({{.*}}byval({ i8, i8 }) align 4{{.*}})
166+ fn natural_align_1 ( x : NaturalAlign1 ) ;
167+
71168 // m68k: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
72169
73170 // wasm: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 2{{.*}})
@@ -81,7 +178,7 @@ extern "C" {
81178 // i686-linux: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
82179
83180 // i686-windows: declare void @natural_align_2({{.*}}byval(%NaturalAlign2) align 4{{.*}})
84- fn natural_align_2 ( a : NaturalAlign2 ) ;
181+ fn natural_align_2 ( x : NaturalAlign2 ) ;
85182
86183 // m68k: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
87184
@@ -96,7 +193,7 @@ extern "C" {
96193 // i686-linux: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
97194
98195 // i686-windows: declare void @force_align_4({{.*}}byval(%ForceAlign4) align 4{{.*}})
99- fn force_align_4 ( b : ForceAlign4 ) ;
196+ fn force_align_4 ( x : ForceAlign4 ) ;
100197
101198 // m68k: declare void @natural_align_8({{.*}}byval(%NaturalAlign8) align 4{{.*}})
102199
@@ -128,7 +225,7 @@ extern "C" {
128225 // i686-windows: declare void @force_align_8(
129226 // i686-windows-NOT: byval
130227 // i686-windows-SAME: align 8{{.*}})
131- fn force_align_8 ( y : ForceAlign8 ) ;
228+ fn force_align_8 ( x : ForceAlign8 ) ;
132229
133230 // m68k: declare void @force_align_16({{.*}}byval(%ForceAlign16) align 16{{.*}})
134231
@@ -145,16 +242,5 @@ extern "C" {
145242 // i686-windows: declare void @force_align_16(
146243 // i686-windows-NOT: byval
147244 // i686-windows-SAME: align 16{{.*}})
148- fn force_align_16 ( z : ForceAlign16 ) ;
149- }
150-
151- pub unsafe fn main (
152- a : NaturalAlign2 , b : ForceAlign4 ,
153- x : NaturalAlign8 , y : ForceAlign8 , z : ForceAlign16
154- ) {
155- natural_align_2 ( a) ;
156- force_align_4 ( b) ;
157- natural_align_8 ( x) ;
158- force_align_8 ( y) ;
159- force_align_16 ( z) ;
245+ fn force_align_16 ( x : ForceAlign16 ) ;
160246}
0 commit comments