Optimize PartialOrd le

Closes https://github.com/rust-lang/rust/issues/73338
This change stops default implementation of `le()` method from generating jumps.
This commit is contained in:
AngelicosPhosphoros 2021-04-03 20:58:15 +03:00
parent 836c317426
commit ed0d8fa3e8
2 changed files with 41 additions and 1 deletions

View File

@ -981,7 +981,8 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
#[must_use]
#[stable(feature = "rust1", since = "1.0.0")]
fn le(&self, other: &Rhs) -> bool {
matches!(self.partial_cmp(other), Some(Less | Equal))
// Pattern `Some(Less | Eq)` optimizes worse than negating `None | Some(Greater)`.
!matches!(self.partial_cmp(other), None | Some(Greater))
}
/// This method tests greater than (for `self` and `other`) and is used by the `>` operator.

View File

@ -0,0 +1,39 @@
// This test checks that comparison operation
// generated by #[derive(PartialOrd)]
// doesn't contain jumps for C enums
// compile-flags: -Copt-level=3
#![crate_type="lib"]
#[repr(u32)]
#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)]
pub enum Foo {
Zero,
One,
Two,
}
#[no_mangle]
pub fn compare_less(a: Foo, b: Foo)->bool{
// CHECK-NOT: br {{.*}}
a < b
}
#[no_mangle]
pub fn compare_le(a: Foo, b: Foo)->bool{
// CHECK-NOT: br {{.*}}
a <= b
}
#[no_mangle]
pub fn compare_ge(a: Foo, b: Foo)->bool{
// CHECK-NOT: br {{.*}}
a >= b
}
#[no_mangle]
pub fn compare_greater(a: Foo, b: Foo)->bool{
// CHECK-NOT: br {{.*}}
a > b
}