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:
commit
1df5affaca
8 changed files with 124 additions and 42 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue