1
Fork 0

Booleans have been removed from Cranelift

This commit is contained in:
bjorn3 2022-10-25 17:13:33 +00:00
parent 70ba23b109
commit 6768d0dd72
5 changed files with 9 additions and 39 deletions

View file

@ -388,11 +388,9 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
_ => unreachable!("{:?}", targets), _ => unreachable!("{:?}", targets),
}; };
let discr = crate::optimize::peephole::maybe_unwrap_bint(&mut fx.bcx, discr);
let (discr, is_inverted) = let (discr, is_inverted) =
crate::optimize::peephole::maybe_unwrap_bool_not(&mut fx.bcx, discr); crate::optimize::peephole::maybe_unwrap_bool_not(&mut fx.bcx, discr);
let test_zero = if is_inverted { !test_zero } else { test_zero }; let test_zero = if is_inverted { !test_zero } else { test_zero };
let discr = crate::optimize::peephole::maybe_unwrap_bint(&mut fx.bcx, discr);
if let Some(taken) = crate::optimize::peephole::maybe_known_branch_taken( if let Some(taken) = crate::optimize::peephole::maybe_known_branch_taken(
&fx.bcx, discr, test_zero, &fx.bcx, discr, test_zero,
) { ) {
@ -569,7 +567,7 @@ fn codegen_stmt<'tcx>(
UnOp::Not => match layout.ty.kind() { UnOp::Not => match layout.ty.kind() {
ty::Bool => { ty::Bool => {
let res = fx.bcx.ins().icmp_imm(IntCC::Equal, val, 0); let res = fx.bcx.ins().icmp_imm(IntCC::Equal, val, 0);
CValue::by_val(fx.bcx.ins().bint(types::I8, res), layout) CValue::by_val(res, layout)
} }
ty::Uint(_) | ty::Int(_) => { ty::Uint(_) | ty::Int(_) => {
CValue::by_val(fx.bcx.ins().bnot(val), layout) CValue::by_val(fx.bcx.ins().bnot(val), layout)

View file

@ -197,7 +197,9 @@ fn bool_to_zero_or_max_uint<'tcx>(
ty => ty, ty => ty,
}; };
let val = fx.bcx.ins().bint(int_ty, val); let val = if int_ty == types::I8 { val } else { fx.bcx.ins().uextend(int_ty, val) };
// FIXME use bmask instead
let mut res = fx.bcx.ins().ineg(val); let mut res = fx.bcx.ins().ineg(val);
if ty.is_float() { if ty.is_float() {
@ -938,8 +940,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
let old = fx.bcx.ins().atomic_cas(MemFlags::trusted(), ptr, test_old, new); let old = fx.bcx.ins().atomic_cas(MemFlags::trusted(), ptr, test_old, new);
let is_eq = fx.bcx.ins().icmp(IntCC::Equal, old, test_old); let is_eq = fx.bcx.ins().icmp(IntCC::Equal, old, test_old);
let ret_val = let ret_val = CValue::by_val_pair(old, is_eq, ret.layout());
CValue::by_val_pair(old, fx.bcx.ins().bint(types::I8, is_eq), ret.layout());
ret.write_cvalue(fx, ret_val) ret.write_cvalue(fx, ret_val)
} }
@ -1261,8 +1262,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
flags.set_notrap(); flags.set_notrap();
let lhs_val = fx.bcx.ins().load(clty, flags, lhs_ref, 0); let lhs_val = fx.bcx.ins().load(clty, flags, lhs_ref, 0);
let rhs_val = fx.bcx.ins().load(clty, flags, rhs_ref, 0); let rhs_val = fx.bcx.ins().load(clty, flags, rhs_ref, 0);
let eq = fx.bcx.ins().icmp(IntCC::Equal, lhs_val, rhs_val); fx.bcx.ins().icmp(IntCC::Equal, lhs_val, rhs_val)
fx.bcx.ins().bint(types::I8, eq)
} else { } else {
// Just call `memcmp` (like slices do in core) when the // Just call `memcmp` (like slices do in core) when the
// size is too large or it's not a power-of-two. // size is too large or it's not a power-of-two.
@ -1272,8 +1272,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
let returns = vec![AbiParam::new(types::I32)]; let returns = vec![AbiParam::new(types::I32)];
let args = &[lhs_ref, rhs_ref, bytes_val]; let args = &[lhs_ref, rhs_ref, bytes_val];
let cmp = fx.lib_call("memcmp", params, returns, args)[0]; let cmp = fx.lib_call("memcmp", params, returns, args)[0];
let eq = fx.bcx.ins().icmp_imm(IntCC::Equal, cmp, 0); 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())); ret.write_cvalue(fx, CValue::by_val(is_eq_value, ret.layout()));
} }

View file

@ -112,10 +112,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
_ => unreachable!(), _ => unreachable!(),
}; };
let ty = fx.clif_type(res_lane_ty).unwrap(); bool_to_zero_or_max_uint(fx, res_lane_ty, res_lane)
let res_lane = fx.bcx.ins().bint(ty, res_lane);
fx.bcx.ins().ineg(res_lane)
}); });
} }

View file

@ -49,7 +49,6 @@ fn codegen_compare_bin_op<'tcx>(
) -> CValue<'tcx> { ) -> CValue<'tcx> {
let intcc = crate::num::bin_op_to_intcc(bin_op, signed).unwrap(); let intcc = crate::num::bin_op_to_intcc(bin_op, signed).unwrap();
let val = fx.bcx.ins().icmp(intcc, lhs, rhs); let val = fx.bcx.ins().icmp(intcc, lhs, rhs);
let val = fx.bcx.ins().bint(types::I8, val);
CValue::by_val(val, fx.layout_of(fx.tcx.types.bool)) CValue::by_val(val, fx.layout_of(fx.tcx.types.bool))
} }
@ -290,8 +289,6 @@ pub(crate) fn codegen_checked_int_binop<'tcx>(
_ => bug!("binop {:?} on checked int/uint lhs: {:?} rhs: {:?}", bin_op, in_lhs, in_rhs), _ => bug!("binop {:?} on checked int/uint lhs: {:?} rhs: {:?}", bin_op, in_lhs, in_rhs),
}; };
let has_overflow = fx.bcx.ins().bint(types::I8, has_overflow);
let out_layout = fx.layout_of(fx.tcx.mk_tup([in_lhs.layout().ty, fx.tcx.types.bool].iter())); let out_layout = fx.layout_of(fx.tcx.mk_tup([in_lhs.layout().ty, fx.tcx.types.bool].iter()));
CValue::by_val_pair(res, has_overflow, out_layout) CValue::by_val_pair(res, has_overflow, out_layout)
} }
@ -368,7 +365,6 @@ pub(crate) fn codegen_float_binop<'tcx>(
_ => unreachable!(), _ => unreachable!(),
}; };
let val = fx.bcx.ins().fcmp(fltcc, lhs, rhs); let val = fx.bcx.ins().fcmp(fltcc, lhs, rhs);
let val = fx.bcx.ins().bint(types::I8, val);
return CValue::by_val(val, fx.layout_of(fx.tcx.types.bool)); return CValue::by_val(val, fx.layout_of(fx.tcx.types.bool));
} }
_ => unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs, in_rhs), _ => unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs, in_rhs),
@ -440,7 +436,7 @@ pub(crate) fn codegen_ptr_binop<'tcx>(
_ => panic!("bin_op {:?} on ptr", bin_op), _ => panic!("bin_op {:?} on ptr", bin_op),
}; };
CValue::by_val(fx.bcx.ins().bint(types::I8, res), fx.layout_of(fx.tcx.types.bool)) CValue::by_val(res, fx.layout_of(fx.tcx.types.bool))
} }
} }

View file

@ -3,19 +3,6 @@
use cranelift_codegen::ir::{condcodes::IntCC, InstructionData, Opcode, Value, ValueDef}; use cranelift_codegen::ir::{condcodes::IntCC, InstructionData, Opcode, Value, ValueDef};
use cranelift_frontend::FunctionBuilder; use cranelift_frontend::FunctionBuilder;
/// If the given value was produced by a `bint` instruction, return it's input, otherwise return the
/// given value.
pub(crate) fn maybe_unwrap_bint(bcx: &mut FunctionBuilder<'_>, arg: Value) -> Value {
if let ValueDef::Result(arg_inst, 0) = bcx.func.dfg.value_def(arg) {
match bcx.func.dfg[arg_inst] {
InstructionData::Unary { opcode: Opcode::Bint, arg } => arg,
_ => arg,
}
} else {
arg
}
}
/// If the given value was produced by the lowering of `Rvalue::Not` return the input and true, /// If the given value was produced by the lowering of `Rvalue::Not` return the input and true,
/// otherwise return the given value and false. /// otherwise return the given value and false.
pub(crate) fn maybe_unwrap_bool_not(bcx: &mut FunctionBuilder<'_>, arg: Value) -> (Value, bool) { pub(crate) fn maybe_unwrap_bool_not(bcx: &mut FunctionBuilder<'_>, arg: Value) -> (Value, bool) {
@ -48,13 +35,6 @@ pub(crate) fn maybe_known_branch_taken(
}; };
match bcx.func.dfg[arg_inst] { match bcx.func.dfg[arg_inst] {
InstructionData::UnaryBool { opcode: Opcode::Bconst, imm } => {
if test_zero {
Some(!imm)
} else {
Some(imm)
}
}
InstructionData::UnaryImm { opcode: Opcode::Iconst, imm } => { InstructionData::UnaryImm { opcode: Opcode::Iconst, imm } => {
if test_zero { if test_zero {
Some(imm.bits() == 0) Some(imm.bits() == 0)