diff options
| author | Luqman Aden <me@luqman.ca> | 2022-12-11 19:11:41 -0800 |
|---|---|---|
| committer | Luqman Aden <me@luqman.ca> | 2023-05-05 14:25:55 -0700 |
| commit | 48af94c080d37a5396dd4452c21cd8006f38fba4 (patch) | |
| tree | 45ce6208652f6d07b9766ae58dbf79b7071ec8b1 | |
| parent | 4b94c232192b0fa0314b5afa18e366356e210c4c (diff) | |
| download | rust-48af94c080d37a5396dd4452c21cd8006f38fba4.tar.gz rust-48af94c080d37a5396dd4452c21cd8006f38fba4.zip | |
Operand::extract_field: only cast llval if it's a pointer and replace bitcast w/ pointercast.
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/operand.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/operand.rs b/compiler/rustc_codegen_ssa/src/mir/operand.rs index b37797fef4c..957ec8629fa 100644 --- a/compiler/rustc_codegen_ssa/src/mir/operand.rs +++ b/compiler/rustc_codegen_ssa/src/mir/operand.rs @@ -2,6 +2,7 @@ use super::place::PlaceRef; use super::{FunctionCx, LocalRef}; use crate::base; +use crate::common::TypeKind; use crate::glue; use crate::traits::*; use crate::MemFlags; @@ -240,15 +241,24 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> { // Bools in union fields needs to be truncated. *llval = bx.to_immediate(*llval, field); // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types. - *llval = bx.bitcast(*llval, bx.cx().immediate_backend_type(field)); + let ty = bx.cx().immediate_backend_type(field); + if bx.type_kind(ty) == TypeKind::Pointer { + *llval = bx.pointercast(*llval, ty); + } } (OperandValue::Pair(a, b), Abi::ScalarPair(a_abi, b_abi)) => { // Bools in union fields needs to be truncated. *a = bx.to_immediate_scalar(*a, a_abi); *b = bx.to_immediate_scalar(*b, b_abi); // HACK(eddyb) have to bitcast pointers until LLVM removes pointee types. - *a = bx.bitcast(*a, bx.cx().scalar_pair_element_backend_type(field, 0, true)); - *b = bx.bitcast(*b, bx.cx().scalar_pair_element_backend_type(field, 1, true)); + let a_ty = bx.cx().scalar_pair_element_backend_type(field, 0, true); + let b_ty = bx.cx().scalar_pair_element_backend_type(field, 1, true); + if bx.type_kind(a_ty) == TypeKind::Pointer { + *a = bx.pointercast(*a, a_ty); + } + if bx.type_kind(b_ty) == TypeKind::Pointer { + *b = bx.pointercast(*b, b_ty); + } } (OperandValue::Pair(..), _) => bug!(), (OperandValue::Ref(..), _) => bug!(), |
