From 2eb9c6d49ef949c551892fa58270071f5e997416 Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Sun, 18 Feb 2024 19:42:27 -0500 Subject: [PATCH] Lower transmutes from int to pointer type as gep on null --- compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 4 ++-- tests/codegen/intrinsics/transmute.rs | 4 ++-- tests/codegen/transmute-scalar.rs | 2 +- tests/ui/abi/foreign/foreign-call-no-runtime.rs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index 9ae82d4845e..65e90401701 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -306,11 +306,11 @@ fn transmute_immediate( bx.bitcast(imm, to_backend_ty) } (Pointer(..), Pointer(..)) => bx.pointercast(imm, to_backend_ty), - (Int(..), Pointer(..)) => bx.inttoptr(imm, to_backend_ty), + (Int(..), Pointer(..)) => bx.ptradd(bx.const_null(bx.type_ptr()), imm), (Pointer(..), Int(..)) => bx.ptrtoint(imm, to_backend_ty), (F16 | F32 | F64 | F128, Pointer(..)) => { let int_imm = bx.bitcast(imm, bx.cx().type_isize()); - bx.inttoptr(int_imm, to_backend_ty) + bx.ptradd(bx.const_null(bx.type_ptr()), int_imm) } (Pointer(..), F16 | F32 | F64 | F128) => { let int_imm = bx.ptrtoint(imm, bx.cx().type_isize()); diff --git a/tests/codegen/intrinsics/transmute.rs b/tests/codegen/intrinsics/transmute.rs index 5a503e86010..f858562b5f1 100644 --- a/tests/codegen/intrinsics/transmute.rs +++ b/tests/codegen/intrinsics/transmute.rs @@ -296,7 +296,7 @@ pub unsafe fn check_pair_with_bool(x: (u8, bool)) -> (bool, i8) { pub unsafe fn check_float_to_pointer(x: f64) -> *const () { // CHECK-NOT: alloca // CHECK: %0 = bitcast double %x to i64 - // CHECK: %_0 = inttoptr i64 %0 to ptr + // CHECK: %_0 = getelementptr i8, ptr null, i64 %0 // CHECK: ret ptr %_0 transmute(x) } @@ -371,7 +371,7 @@ pub unsafe fn check_issue_110005(x: (usize, bool)) -> Option> { // CHECK-LABEL: @check_pair_to_dst_ref( #[no_mangle] pub unsafe fn check_pair_to_dst_ref<'a>(x: (usize, usize)) -> &'a [u8] { - // CHECK: %_0.0 = inttoptr i64 %x.0 to ptr + // CHECK: %_0.0 = getelementptr i8, ptr null, i64 %x.0 // CHECK: %0 = insertvalue { ptr, i64 } poison, ptr %_0.0, 0 // CHECK: %1 = insertvalue { ptr, i64 } %0, i64 %x.1, 1 // CHECK: ret { ptr, i64 } %1 diff --git a/tests/codegen/transmute-scalar.rs b/tests/codegen/transmute-scalar.rs index 7a5eb4dfcd5..caaa70962d5 100644 --- a/tests/codegen/transmute-scalar.rs +++ b/tests/codegen/transmute-scalar.rs @@ -49,7 +49,7 @@ pub fn ptr_to_int(p: *mut u16) -> usize { } // CHECK: define{{.*}}ptr @int_to_ptr([[USIZE]] %i) -// CHECK: %_0 = inttoptr [[USIZE]] %i to ptr +// CHECK: %_0 = getelementptr i8, ptr null, [[USIZE]] %i // CHECK-NEXT: ret ptr %_0 #[no_mangle] pub fn int_to_ptr(i: usize) -> *mut u16 { diff --git a/tests/ui/abi/foreign/foreign-call-no-runtime.rs b/tests/ui/abi/foreign/foreign-call-no-runtime.rs index 42d8d7b1d25..fccd62b6100 100644 --- a/tests/ui/abi/foreign/foreign-call-no-runtime.rs +++ b/tests/ui/abi/foreign/foreign-call-no-runtime.rs @@ -40,21 +40,21 @@ pub fn main() { extern "C" fn callback_isize(data: libc::uintptr_t) { unsafe { - let data: *const isize = mem::transmute(data); + let data = data as *const isize; assert_eq!(*data, 100); } } extern "C" fn callback_i64(data: libc::uintptr_t) { unsafe { - let data: *const i64 = mem::transmute(data); + let data = data as *const i64; assert_eq!(*data, 100); } } extern "C" fn callback_i32(data: libc::uintptr_t) { unsafe { - let data: *const i32 = mem::transmute(data); + let data = data as *const i32; assert_eq!(*data, 100); } }