@@ -67,7 +67,10 @@ extern "C" {
67
67
fn receives_doubledouble ( x : DoubleDouble ) ;
68
68
fn returns_doubledouble ( ) -> DoubleDouble ;
69
69
70
+ // These functions cause an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
71
+ #[ cfg( not( target_arch = "sparc64" ) ) ]
70
72
fn receives_doublefloat ( x : DoubleFloat ) ;
73
+ #[ cfg( not( target_arch = "sparc64" ) ) ]
71
74
fn returns_doublefloat ( ) -> DoubleFloat ;
72
75
}
73
76
@@ -214,28 +217,41 @@ pub unsafe fn return_doubledouble() -> DoubleDouble {
214
217
returns_doubledouble ( )
215
218
}
216
219
217
- // CHECK-LABEL: @call_doublefloat
220
+ // This test causes an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
221
+ #[ cfg( not( target_arch = "sparc64" ) ) ]
222
+ // aarch64-LABEL: @call_doublefloat
223
+ // loongarch64-LABEL: @call_doublefloat
224
+ // powerpc64-LABEL: @call_doublefloat
218
225
#[ no_mangle]
219
226
pub unsafe fn call_doublefloat ( ) {
220
227
// aarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:\[2 x i64\]]], align [[ABI_ALIGN:8]]
221
228
// loongarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:{ double, float }]], align [[ABI_ALIGN:8]]
222
229
// powerpc64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:\[2 x i64\]]], align [[ABI_ALIGN:8]]
223
- // sparc64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:{ double, float, i32, i64 }]], align [[ABI_ALIGN:8]]
224
230
225
- // CHECK: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
231
+ // aarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
232
+ // loongarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
233
+ // powerpc64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
226
234
227
235
// aarch64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 16, i1 false)
228
236
// loongarch64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 12, i1 false)
229
237
// powerpc64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 16, i1 false)
230
- // sparc64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 16, i1 false)
231
238
232
- // CHECK: [[ABI_VALUE:%.+]] = load [[ABI_TYPE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
233
- // CHECK: call void @receives_doublefloat([[ABI_TYPE]] {{(inreg )?}}[[ABI_VALUE]])
239
+ // aarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
240
+ // loongarch64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
241
+ // powerpc64: [[ABI_VALUE:%.+]] = load [[ABI_TYPE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
242
+
243
+ // aarch64: call void @receives_doublefloat([[ABI_TYPE]] {{(inreg )?}}[[ABI_VALUE]])
244
+ // loongarch64: call void @receives_doublefloat([[ABI_TYPE]] {{(inreg )?}}[[ABI_VALUE]])
245
+ // powerpc64: call void @receives_doublefloat([[ABI_TYPE]] {{(inreg )?}}[[ABI_VALUE]])
234
246
let x = DoubleFloat { f : 1. , g : 2. } ;
235
247
receives_doublefloat ( x) ;
236
248
}
237
249
238
- // CHECK-LABEL: @return_doublefloat
250
+ // This test causes an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
251
+ #[ cfg( not( target_arch = "sparc64" ) ) ]
252
+ // aarch64-LABEL: @return_doublefloat
253
+ // loongarch64-LABEL: @return_doublefloat
254
+ // powerpc64-LABEL: @return_doublefloat
239
255
#[ no_mangle]
240
256
pub unsafe fn return_doublefloat ( ) -> DoubleFloat {
241
257
// powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
@@ -248,22 +264,17 @@ pub unsafe fn return_doublefloat() -> DoubleFloat {
248
264
249
265
// aarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:\[2 x i64\]]], align [[ABI_ALIGN:8]]
250
266
// loongarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:{ double, float }]], align [[ABI_ALIGN:8]]
251
- // sparc64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:{ double, float, i32, i64 }]], align [[ABI_ALIGN:8]]
252
267
253
268
// aarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
254
269
// loongarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
255
- // sparc64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
256
270
257
271
// aarch64: [[ABI_VALUE:%.+]] = call [[ABI_TYPE]] @returns_doublefloat()
258
272
// loongarch64: [[ABI_VALUE:%.+]] = call [[ABI_TYPE]] @returns_doublefloat()
259
- // sparc64: [[ABI_VALUE:%.+]] = call inreg [[ABI_TYPE]] @returns_doublefloat()
260
273
261
274
// aarch64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
262
275
// loongarch64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
263
- // sparc64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
264
276
265
277
// aarch64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
266
278
// loongarch64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 12, i1 false)
267
- // sparc64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
268
279
returns_doublefloat ( )
269
280
}
0 commit comments