@@ -67,7 +67,10 @@ extern "C" {
6767 fn receives_doubledouble ( x : DoubleDouble ) ;
6868 fn returns_doubledouble ( ) -> DoubleDouble ;
6969
70+ // These functions cause an ICE in sparc64 ABI code (https://github.com/rust-lang/rust/issues/122620)
71+ #[ cfg( not( target_arch = "sparc64" ) ) ]
7072 fn receives_doublefloat ( x : DoubleFloat ) ;
73+ #[ cfg( not( target_arch = "sparc64" ) ) ]
7174 fn returns_doublefloat ( ) -> DoubleFloat ;
7275}
7376
@@ -214,28 +217,41 @@ pub unsafe fn return_doubledouble() -> DoubleDouble {
214217 returns_doubledouble ( )
215218}
216219
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
218225#[ no_mangle]
219226pub unsafe fn call_doublefloat ( ) {
220227 // aarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:\[2 x i64\]]], align [[ABI_ALIGN:8]]
221228 // loongarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:{ double, float }]], align [[ABI_ALIGN:8]]
222229 // 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]]
224230
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]]
226234
227235 // aarch64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 16, i1 false)
228236 // loongarch64: call void @llvm.memcpy.{{.+}}(ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], i64 12, i1 false)
229237 // 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)
231238
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]])
234246 let x = DoubleFloat { f : 1. , g : 2. } ;
235247 receives_doublefloat ( x) ;
236248}
237249
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
239255#[ no_mangle]
240256pub unsafe fn return_doublefloat ( ) -> DoubleFloat {
241257 // powerpc returns this struct via sret pointer, it doesn't use the cast ABI.
@@ -248,22 +264,17 @@ pub unsafe fn return_doublefloat() -> DoubleFloat {
248264
249265 // aarch64: [[ABI_ALLOCA:%.+]] = alloca [[ABI_TYPE:\[2 x i64\]]], align [[ABI_ALIGN:8]]
250266 // 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]]
252267
253268 // aarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
254269 // loongarch64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
255- // sparc64: [[RUST_ALLOCA:%.+]] = alloca %DoubleFloat, align [[RUST_ALIGN:8]]
256270
257271 // aarch64: [[ABI_VALUE:%.+]] = call [[ABI_TYPE]] @returns_doublefloat()
258272 // loongarch64: [[ABI_VALUE:%.+]] = call [[ABI_TYPE]] @returns_doublefloat()
259- // sparc64: [[ABI_VALUE:%.+]] = call inreg [[ABI_TYPE]] @returns_doublefloat()
260273
261274 // aarch64: store [[ABI_TYPE]] [[ABI_VALUE]], ptr [[ABI_ALLOCA]], align [[ABI_ALIGN]]
262275 // 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]]
264276
265277 // aarch64: call void @llvm.memcpy.{{.+}}(ptr align [[RUST_ALIGN]] [[RUST_ALLOCA]], ptr align [[ABI_ALIGN]] [[ABI_ALLOCA]], i64 16, i1 false)
266278 // 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)
268279 returns_doublefloat ( )
269280}
0 commit comments