Auto merge of #126852 - scottmcm:more-checked-math-tweaks, r=Amanieu · model-checking/verify-rust-std@a451b2a (original) (raw)
`@@ -454,8 +454,19 @@ macro_rules! uint_impl {
`
454
454
` without modifying the original"]
`
455
455
` #[inline]
`
456
456
`pub const fn checked_add(self, rhs: Self) -> Option {
`
457
``
`-
let (a, b) = self.overflowing_add(rhs);
`
458
``
`-
if unlikely!(b) { None } else { Some(a) }
`
``
457
`` +
// This used to use overflowing_add
, but that means it ends up being
``
``
458
`` +
// a wrapping_add
, losing some optimization opportunities. Notably,
``
``
459
`` +
// phrasing it this way helps .checked_add(1)
optimize to a check
``
``
460
`` +
// against MAX
and a add nuw
.
``
``
461
`+
// Per https://github.com/rust-lang/rust/pull/124114#issuecomment-2066173305,
`
``
462
`+
// LLVM is happy to re-form the intrinsic later if useful.
`
``
463
+
``
464
`+
if unlikely!(intrinsics::add_with_overflow(self, rhs).1) {
`
``
465
`+
None
`
``
466
`+
} else {
`
``
467
`+
// SAFETY: Just checked it doesn't overflow
`
``
468
`+
Some(unsafe { intrinsics::unchecked_add(self, rhs) })
`
``
469
`+
}
`
459
470
`}
`
460
471
``
461
472
`` /// Strict integer addition. Computes self + rhs
, panicking
``