Skip to content

Commit 4c41a72

Browse files
committed
Avoid is_some_and so the generic MIR is simpler
1 parent 9cc52bc commit 4c41a72

File tree

4 files changed

+54
-27
lines changed

4 files changed

+54
-27
lines changed

library/core/src/cmp.rs

+18-10
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,12 @@ pub enum Ordering {
397397
}
398398

399399
impl Ordering {
400+
#[inline]
401+
const fn as_raw(self) -> i8 {
402+
// FIXME(const-hack): just use `PartialOrd` against `Equal` once that's const
403+
crate::intrinsics::discriminant_value(&self)
404+
}
405+
400406
/// Returns `true` if the ordering is the `Equal` variant.
401407
///
402408
/// # Examples
@@ -413,7 +419,7 @@ impl Ordering {
413419
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
414420
#[stable(feature = "ordering_helpers", since = "1.53.0")]
415421
pub const fn is_eq(self) -> bool {
416-
matches!(self, Equal)
422+
self.as_raw() == 0
417423
}
418424

419425
/// Returns `true` if the ordering is not the `Equal` variant.
@@ -432,7 +438,7 @@ impl Ordering {
432438
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
433439
#[stable(feature = "ordering_helpers", since = "1.53.0")]
434440
pub const fn is_ne(self) -> bool {
435-
!matches!(self, Equal)
441+
self.as_raw() != 0
436442
}
437443

438444
/// Returns `true` if the ordering is the `Less` variant.
@@ -451,7 +457,7 @@ impl Ordering {
451457
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
452458
#[stable(feature = "ordering_helpers", since = "1.53.0")]
453459
pub const fn is_lt(self) -> bool {
454-
matches!(self, Less)
460+
self.as_raw() < 0
455461
}
456462

457463
/// Returns `true` if the ordering is the `Greater` variant.
@@ -470,7 +476,7 @@ impl Ordering {
470476
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
471477
#[stable(feature = "ordering_helpers", since = "1.53.0")]
472478
pub const fn is_gt(self) -> bool {
473-
matches!(self, Greater)
479+
self.as_raw() > 0
474480
}
475481

476482
/// Returns `true` if the ordering is either the `Less` or `Equal` variant.
@@ -489,7 +495,7 @@ impl Ordering {
489495
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
490496
#[stable(feature = "ordering_helpers", since = "1.53.0")]
491497
pub const fn is_le(self) -> bool {
492-
!matches!(self, Greater)
498+
self.as_raw() <= 0
493499
}
494500

495501
/// Returns `true` if the ordering is either the `Greater` or `Equal` variant.
@@ -508,7 +514,7 @@ impl Ordering {
508514
#[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
509515
#[stable(feature = "ordering_helpers", since = "1.53.0")]
510516
pub const fn is_ge(self) -> bool {
511-
!matches!(self, Less)
517+
self.as_raw() >= 0
512518
}
513519

514520
/// Reverses the `Ordering`.
@@ -1369,7 +1375,9 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
13691375
#[stable(feature = "rust1", since = "1.0.0")]
13701376
#[rustc_diagnostic_item = "cmp_partialord_lt"]
13711377
fn lt(&self, other: &Rhs) -> bool {
1372-
self.partial_cmp(other).is_some_and(Ordering::is_lt)
1378+
// FIXME(#137901): weirdly, passing these as `Ordering::is_lt` doesn't
1379+
// MIR-inline, thus the "unnecessary" closure form here.
1380+
self.partial_cmp(other).is_some_and(|c| c.is_lt())
13731381
}
13741382

13751383
/// Tests less than or equal to (for `self` and `other`) and is used by the
@@ -1387,7 +1395,7 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
13871395
#[stable(feature = "rust1", since = "1.0.0")]
13881396
#[rustc_diagnostic_item = "cmp_partialord_le"]
13891397
fn le(&self, other: &Rhs) -> bool {
1390-
self.partial_cmp(other).is_some_and(Ordering::is_le)
1398+
self.partial_cmp(other).is_some_and(|c| c.is_le())
13911399
}
13921400

13931401
/// Tests greater than (for `self` and `other`) and is used by the `>`
@@ -1405,7 +1413,7 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
14051413
#[stable(feature = "rust1", since = "1.0.0")]
14061414
#[rustc_diagnostic_item = "cmp_partialord_gt"]
14071415
fn gt(&self, other: &Rhs) -> bool {
1408-
self.partial_cmp(other).is_some_and(Ordering::is_gt)
1416+
self.partial_cmp(other).is_some_and(|c| c.is_gt())
14091417
}
14101418

14111419
/// Tests greater than or equal to (for `self` and `other`) and is used by
@@ -1423,7 +1431,7 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
14231431
#[stable(feature = "rust1", since = "1.0.0")]
14241432
#[rustc_diagnostic_item = "cmp_partialord_ge"]
14251433
fn ge(&self, other: &Rhs) -> bool {
1426-
self.partial_cmp(other).is_some_and(Ordering::is_ge)
1434+
self.partial_cmp(other).is_some_and(|c| c.is_ge())
14271435
}
14281436
}
14291437

tests/mir-opt/pre-codegen/derived_ord.demo_le.PreCodegen.after.mir

+16-14
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@ fn demo_le(_1: &MultiField, _2: &MultiField) -> bool {
66
let mut _0: bool;
77
scope 1 (inlined <MultiField as PartialOrd>::le) {
88
let mut _11: std::option::Option<std::cmp::Ordering>;
9-
scope 2 (inlined Option::<std::cmp::Ordering>::is_some_and::<fn(std::cmp::Ordering) -> bool {std::cmp::Ordering::is_le}>) {
9+
scope 2 (inlined Option::<std::cmp::Ordering>::is_some_and::<{closure@<MultiField as PartialOrd>::le::{closure#0}}>) {
1010
let _12: std::cmp::Ordering;
11-
let mut _13: (std::cmp::Ordering,);
1211
scope 3 {
12+
scope 4 (inlined <MultiField as PartialOrd>::le::{closure#0}) {
13+
scope 5 (inlined std::cmp::Ordering::is_le) {
14+
let mut _13: i8;
15+
scope 6 (inlined std::cmp::Ordering::as_raw) {
16+
}
17+
}
18+
}
1319
}
1420
}
15-
scope 4 (inlined <MultiField as PartialOrd>::partial_cmp) {
21+
scope 7 (inlined <MultiField as PartialOrd>::partial_cmp) {
1622
let mut _6: std::option::Option<std::cmp::Ordering>;
1723
let mut _7: i8;
18-
scope 5 {
24+
scope 8 {
1925
}
20-
scope 6 (inlined std::cmp::impls::<impl PartialOrd for char>::partial_cmp) {
26+
scope 9 (inlined std::cmp::impls::<impl PartialOrd for char>::partial_cmp) {
2127
let mut _3: char;
2228
let mut _4: char;
2329
let mut _5: std::cmp::Ordering;
2430
}
25-
scope 7 (inlined std::cmp::impls::<impl PartialOrd for i16>::partial_cmp) {
31+
scope 10 (inlined std::cmp::impls::<impl PartialOrd for i16>::partial_cmp) {
2632
let mut _8: i16;
2733
let mut _9: i16;
2834
let mut _10: std::cmp::Ordering;
@@ -31,6 +37,7 @@ fn demo_le(_1: &MultiField, _2: &MultiField) -> bool {
3137
}
3238

3339
bb0: {
40+
StorageLive(_12);
3441
StorageLive(_11);
3542
StorageLive(_5);
3643
StorageLive(_7);
@@ -59,29 +66,24 @@ fn demo_le(_1: &MultiField, _2: &MultiField) -> bool {
5966
StorageDead(_10);
6067
StorageDead(_7);
6168
StorageDead(_5);
62-
StorageLive(_12);
6369
goto -> bb3;
6470
}
6571

6672
bb2: {
6773
_11 = copy _6;
6874
StorageDead(_7);
6975
StorageDead(_5);
70-
StorageLive(_12);
7176
goto -> bb3;
7277
}
7378

7479
bb3: {
7580
_12 = move ((_11 as Some).0: std::cmp::Ordering);
7681
StorageLive(_13);
77-
_13 = (copy _12,);
78-
_0 = <fn(std::cmp::Ordering) -> bool {std::cmp::Ordering::is_le} as FnOnce<(std::cmp::Ordering,)>>::call_once(std::cmp::Ordering::is_le, move _13) -> [return: bb4, unwind unreachable];
79-
}
80-
81-
bb4: {
82+
_13 = discriminant(_12);
83+
_0 = Le(move _13, const 0_i8);
8284
StorageDead(_13);
83-
StorageDead(_12);
8485
StorageDead(_11);
86+
StorageDead(_12);
8587
return;
8688
}
8789
}

tests/mir-opt/pre-codegen/derived_ord.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// skip-filecheck
21
//@ compile-flags: -O -Zmir-opt-level=2 -Cdebuginfo=0
32

43
#![crate_type = "lib"]
@@ -9,6 +8,24 @@ pub struct MultiField(char, i16);
98
// Because this isn't derived by the impl, it's not on the `{impl#0}-partial_cmp`,
109
// and thus we need to call it to see what the inlined generic one produces.
1110
pub fn demo_le(a: &MultiField, b: &MultiField) -> bool {
11+
// CHECK-LABEL: fn demo_le
12+
// CHECK: inlined <MultiField as PartialOrd>::le
13+
// CHECK: inlined{{.+}}is_some_and
14+
// CHECK: inlined <MultiField as PartialOrd>::partial_cmp
15+
16+
// CHECK: [[A0:_[0-9]+]] = copy ((*_1).0: char);
17+
// CHECK: [[B0:_[0-9]+]] = copy ((*_2).0: char);
18+
// CHECK: Cmp(move [[A0]], move [[B0]]);
19+
20+
// CHECK: [[D0:_[0-9]+]] = discriminant({{.+}});
21+
// CHECK: switchInt(move [[D0]]) -> [0: bb{{[0-9]+}}, otherwise: bb{{[0-9]+}}];
22+
23+
// CHECK: [[A1:_[0-9]+]] = copy ((*_1).1: i16);
24+
// CHECK: [[B1:_[0-9]+]] = copy ((*_2).1: i16);
25+
// CHECK: Cmp(move [[A1]], move [[B1]]);
26+
27+
// CHECK: [[D1:_[0-9]+]] = discriminant({{.+}});
28+
// CHECK: _0 = Le(move [[D1]], const 0_i8);
1229
*a <= *b
1330
}
1431

tests/mir-opt/pre-codegen/derived_ord.{impl#0}-partial_cmp.PreCodegen.after.mir

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// MIR for `<impl at $DIR/derived_ord.rs:6:10: 6:20>::partial_cmp` after PreCodegen
1+
// MIR for `<impl at $DIR/derived_ord.rs:5:10: 5:20>::partial_cmp` after PreCodegen
22

3-
fn <impl at $DIR/derived_ord.rs:6:10: 6:20>::partial_cmp(_1: &MultiField, _2: &MultiField) -> Option<std::cmp::Ordering> {
3+
fn <impl at $DIR/derived_ord.rs:5:10: 5:20>::partial_cmp(_1: &MultiField, _2: &MultiField) -> Option<std::cmp::Ordering> {
44
debug self => _1;
55
debug other => _2;
66
let mut _0: std::option::Option<std::cmp::Ordering>;

0 commit comments

Comments
 (0)