about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPietro Albini <pietro.albini@ferrous-systems.com>2021-10-27 15:45:31 +0200
committerPietro Albini <pietro.albini@ferrous-systems.com>2021-10-27 17:01:05 +0200
commit68a4460b614bc925a12231d5bba04dd66cb78c6e (patch)
tree4932dde79a35989123774b2a219eecdf45752e50
parent81130fe188ff37f2deacdf53d7afe823ceaba7ec (diff)
downloadrust-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.rs3
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