Skip to content

Commit 48af94c

Browse files
committed
Operand::extract_field: only cast llval if it's a pointer and replace bitcast w/ pointercast.
1 parent 4b94c23 commit 48af94c

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

compiler/rustc_codegen_ssa/src/mir/operand.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::place::PlaceRef;
22
use super::{FunctionCx, LocalRef};
33

44
use crate::base;
5+
use crate::common::TypeKind;
56
use crate::glue;
67
use crate::traits::*;
78
use crate::MemFlags;
@@ -240,15 +241,24 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
240241
// Bools in union fields needs to be truncated.
241242
*llval = bx.to_immediate(*llval, field);
242243
// HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
243-
*llval = bx.bitcast(*llval, bx.cx().immediate_backend_type(field));
244+
let ty = bx.cx().immediate_backend_type(field);
245+
if bx.type_kind(ty) == TypeKind::Pointer {
246+
*llval = bx.pointercast(*llval, ty);
247+
}
244248
}
245249
(OperandValue::Pair(a, b), Abi::ScalarPair(a_abi, b_abi)) => {
246250
// Bools in union fields needs to be truncated.
247251
*a = bx.to_immediate_scalar(*a, a_abi);
248252
*b = bx.to_immediate_scalar(*b, b_abi);
249253
// HACK(eddyb) have to bitcast pointers until LLVM removes pointee types.
250-
*a = bx.bitcast(*a, bx.cx().scalar_pair_element_backend_type(field, 0, true));
251-
*b = bx.bitcast(*b, bx.cx().scalar_pair_element_backend_type(field, 1, true));
254+
let a_ty = bx.cx().scalar_pair_element_backend_type(field, 0, true);
255+
let b_ty = bx.cx().scalar_pair_element_backend_type(field, 1, true);
256+
if bx.type_kind(a_ty) == TypeKind::Pointer {
257+
*a = bx.pointercast(*a, a_ty);
258+
}
259+
if bx.type_kind(b_ty) == TypeKind::Pointer {
260+
*b = bx.pointercast(*b, b_ty);
261+
}
252262
}
253263
(OperandValue::Pair(..), _) => bug!(),
254264
(OperandValue::Ref(..), _) => bug!(),

0 commit comments

Comments
 (0)