[llvm] [InstCombine] fold "icmp eq (X + (V - 1)) & -V, X" to "icmp eq (and X, V - 1), 0" (#152851)
This fold optimizes
```llvm
define i1 @src(i32 %num, i32 %val) {
%mask = add i32 %val, -1
%neg = sub nsw i32 0, %val
%num.biased = add i32 %num, %mask
%_2.sroa.0.0 = and i32 %num.biased, %neg
%_0 = icmp eq i32 %_2.sroa.0.0, %num
ret i1 %_0
}
```
to
```llvm
define i1 @tgt(i32 %num, i32 %val) {
%mask = add i32 %val, -1
%tmp = and i32 %num, %mask
%ret = icmp eq i32 %tmp, 0
ret i1 %ret
}
```
For power-of-two `val`.
Observed in real life for following code
```rust
pub fn is_aligned(num: usize) -> bool {
num.next_multiple_of(1 << 12) == num
}
```
which verifies that num is aligned to 4096.
Alive2 proof https://alive2.llvm.org/ce/z/QisECm