Booleans have been removed from Cranelift
This commit is contained in:
parent
70ba23b109
commit
6768d0dd72
5 changed files with 9 additions and 39 deletions
|
@ -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)
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue