diff options
| author | Pietro Albini <pietro.albini@ferrous-systems.com> | 2021-10-27 15:45:31 +0200 |
|---|---|---|
| committer | Pietro Albini <pietro.albini@ferrous-systems.com> | 2021-10-27 17:01:05 +0200 |
| commit | 68a4460b614bc925a12231d5bba04dd66cb78c6e (patch) | |
| tree | 4932dde79a35989123774b2a219eecdf45752e50 | |
| parent | 81130fe188ff37f2deacdf53d7afe823ceaba7ec (diff) | |
| download | rust-68a4460b614bc925a12231d5bba04dd66cb78c6e.tar.gz rust-68a4460b614bc925a12231d5bba04dd66cb78c6e.zip | |
replace `&` with `&&` in {integer}::checked_rem
Using short-circuit operators makes it easier to perform some kinds of source code analysis, like MC/DC code coverage (a requirement in safety-critical environments). The optimized x86 assembly is the same between the old and new versions: ``` xor eax, eax test esi, esi je .LBB0_1 cmp edi, -2147483648 jne .LBB0_4 cmp esi, -1 jne .LBB0_4 ret .LBB0_1: ret .LBB0_4: mov eax, edi cdq idiv esi mov eax, 1 ret ```
| -rw-r--r-- | library/core/src/num/int_macros.rs | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs index 22d36d4eba3..052e1a21b32 100644 --- a/library/core/src/num/int_macros.rs +++ b/library/core/src/num/int_macros.rs @@ -661,8 +661,7 @@ macro_rules! int_impl { without modifying the original"] #[inline] pub const fn checked_rem(self, rhs: Self) -> Option<Self> { - // Using `&` helps LLVM see that it is the same check made in division. - if unlikely!(rhs == 0 || ((self == Self::MIN) & (rhs == -1))) { + if unlikely!(rhs == 0 || ((self == Self::MIN) && (rhs == -1))) { None } else { // SAFETY: div by zero and by INT_MIN have been checked above |
