diff options
| author | bors <bors@rust-lang.org> | 2022-12-14 19:14:39 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-12-14 19:14:39 +0000 |
| commit | b70baa4f922a1809d79caeaeb902800c3be283b9 (patch) | |
| tree | 5a0604d612b44709a6ad083a1d975ae29b526252 /compiler/rustc_codegen_ssa/src | |
| parent | fbf8b937b44d39ba03835b82ed7ea443321eb7c7 (diff) | |
| parent | 3069bc0c14a79721bb73a4174620cee2aa27382d (diff) | |
| download | rust-b70baa4f922a1809d79caeaeb902800c3be283b9.tar.gz rust-b70baa4f922a1809d79caeaeb902800c3be283b9.zip | |
Auto merge of #105703 - matthiaskrgr:rollup-tfpeam2, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #105399 (Use more LFS functions.) - #105578 (Fix transmutes between pointers in different address spaces (e.g. fn ptrs on AVR)) - #105598 (explain mem::forget(env_lock) in fork/exec) - #105624 (Fix unsoundness in bootstrap cache code) - #105630 (Add a test for #92481) - #105684 (Improve rustdoc markdown variable naming) - #105697 (Remove fee1-dead from reviewers) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/block.rs | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs index 58dfd17fb36..3860138018b 100644 --- a/compiler/rustc_codegen_ssa/src/mir/block.rs +++ b/compiler/rustc_codegen_ssa/src/mir/block.rs @@ -1802,15 +1802,20 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { match (src.layout.abi, dst.layout.abi) { (abi::Abi::Scalar(src_scalar), abi::Abi::Scalar(dst_scalar)) => { // HACK(eddyb) LLVM doesn't like `bitcast`s between pointers and non-pointers. - if (src_scalar.primitive() == abi::Pointer) - == (dst_scalar.primitive() == abi::Pointer) - { + let src_is_ptr = src_scalar.primitive() == abi::Pointer; + let dst_is_ptr = dst_scalar.primitive() == abi::Pointer; + if src_is_ptr == dst_is_ptr { assert_eq!(src.layout.size, dst.layout.size); // NOTE(eddyb) the `from_immediate` and `to_immediate_scalar` // conversions allow handling `bool`s the same as `u8`s. let src = bx.from_immediate(src.immediate()); - let src_as_dst = bx.bitcast(src, bx.backend_type(dst.layout)); + // LLVM also doesn't like `bitcast`s between pointers in different address spaces. + let src_as_dst = if src_is_ptr { + bx.pointercast(src, bx.backend_type(dst.layout)) + } else { + bx.bitcast(src, bx.backend_type(dst.layout)) + }; Immediate(bx.to_immediate_scalar(src_as_dst, dst_scalar)).store(bx, dst); return; } |
