Skip to content

Commit

Permalink
PR Feedback: Don't put SSA-only types in CValues
Browse files Browse the repository at this point in the history
  • Loading branch information
scottmcm committed Jul 8, 2021
1 parent 039a3ba commit 3d2869c
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 9 deletions.
8 changes: 5 additions & 3 deletions compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs
Expand Up @@ -1132,14 +1132,15 @@ pub(crate) fn codegen_intrinsic_call<'tcx>(
let is_eq_value =
if size == Size::ZERO {
// No bytes means they're trivially equal
fx.bcx.ins().bconst(types::B1, true)
fx.bcx.ins().iconst(types::I8, 1)
} else if let Some(clty) = type_by_size(size) {
// Can't use `trusted` for these loads; they could be unaligned.
let mut flags = MemFlags::new();
flags.set_notrap();
let lhs_val = fx.bcx.ins().load(clty, flags, lhs_ref, 0);
let rhs_val = fx.bcx.ins().load(clty, flags, rhs_ref, 0);
fx.bcx.ins().icmp(IntCC::Equal, lhs_val, rhs_val)
let eq = fx.bcx.ins().icmp(IntCC::Equal, lhs_val, rhs_val);
fx.bcx.ins().bint(types::I8, eq)
} else {
// Just call `memcmp` (like slices do in core) when the
// size is too large or it's not a power-of-two.
Expand All @@ -1150,7 +1151,8 @@ pub(crate) fn codegen_intrinsic_call<'tcx>(
let returns = vec![AbiParam::new(types::I32)];
let args = &[lhs_ref, rhs_ref, bytes_val];
let cmp = fx.lib_call("memcmp", params, returns, args)[0];
fx.bcx.ins().icmp_imm(IntCC::Equal, cmp, 0)
let eq = fx.bcx.ins().icmp_imm(IntCC::Equal, cmp, 0);
fx.bcx.ins().bint(types::I8, eq)
};
ret.write_cvalue(fx, CValue::by_val(is_eq_value, ret.layout()));
};
Expand Down
10 changes: 4 additions & 6 deletions compiler/rustc_codegen_cranelift/src/value_and_place.rs
Expand Up @@ -437,12 +437,6 @@ impl<'tcx> CPlace<'tcx> {
| (types::F32, types::I32)
| (types::I64, types::F64)
| (types::F64, types::I64) => fx.bcx.ins().bitcast(dst_ty, data),

// Widen an abstract SSA boolean to something that can be stored in memory
(types::B1, types::I8 | types::I16 | types::I32 | types::I64 | types::I128) => {
fx.bcx.ins().bint(dst_ty, data)
}

_ if src_ty.is_vector() && dst_ty.is_vector() => {
fx.bcx.ins().raw_bitcast(dst_ty, data)
}
Expand All @@ -459,6 +453,10 @@ impl<'tcx> CPlace<'tcx> {
ptr.store(fx, data, MemFlags::trusted());
ptr.load(fx, dst_ty, MemFlags::trusted())
}

// `CValue`s should never contain SSA-only types, so if you ended
// up here having seen an error like `B1 -> I8`, then before
// calling `write_cvalue` you need to add a `bint` instruction.
_ => unreachable!("write_cvalue_transmute: {:?} -> {:?}", src_ty, dst_ty),
};
//fx.bcx.set_val_label(data, cranelift_codegen::ir::ValueLabel::new(var.index()));
Expand Down

0 comments on commit 3d2869c

Please sign in to comment.