Auto merge of #133984 - DaniPopes:scmp-ucmp, r=scottmcm
Lower BinOp::Cmp to llvm.{s,u}cmp.* intrinsics
Lowers `mir::BinOp::Cmp` (`three_way_compare` intrinsic) to the corresponding LLVM `llvm.{s,u}cmp.i8.*` intrinsics.
These are the intrinsics mentioned in https://github.com/rust-lang/rust/pull/118310, which are now available in LLVM 19.
I couldn't find any follow-up PRs/discussions about this, please let me know if I missed something.
r? `@scottmcm`
This commit is contained in:
@@ -988,6 +988,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||
mir::BinOp::Cmp => {
|
||||
use std::cmp::Ordering;
|
||||
assert!(!is_float);
|
||||
if let Some(value) = bx.three_way_compare(lhs_ty, lhs, rhs) {
|
||||
return value;
|
||||
}
|
||||
let pred = |op| base::bin_op_to_icmp_predicate(op, is_signed);
|
||||
if bx.cx().tcx().sess.opts.optimize == OptLevel::No {
|
||||
// FIXME: This actually generates tighter assembly, and is a classic trick
|
||||
|
||||
@@ -397,6 +397,18 @@ pub trait BuilderMethods<'a, 'tcx>:
|
||||
fn icmp(&mut self, op: IntPredicate, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
fn fcmp(&mut self, op: RealPredicate, lhs: Self::Value, rhs: Self::Value) -> Self::Value;
|
||||
|
||||
/// Returns `-1` if `lhs < rhs`, `0` if `lhs == rhs`, and `1` if `lhs > rhs`.
|
||||
// FIXME: Move the default implementation from `codegen_scalar_binop` into this method and
|
||||
// remove the `Option` return once LLVM 20 is the minimum version.
|
||||
fn three_way_compare(
|
||||
&mut self,
|
||||
_ty: Ty<'tcx>,
|
||||
_lhs: Self::Value,
|
||||
_rhs: Self::Value,
|
||||
) -> Option<Self::Value> {
|
||||
None
|
||||
}
|
||||
|
||||
fn memcpy(
|
||||
&mut self,
|
||||
dst: Self::Value,
|
||||
|
||||
Reference in New Issue
Block a user