For the pattern: `(zext i1 X) + (sext i1 Y))Y)`, the constant range is [-1, C1].
We can simplify the pattern by logical operations. when
C == -1 means, X == false ,Y == trueLike:
```
(zext i1 X) + (sext i1 Y) == -1 --> ~X & Y
(zext i1 X) + (sext i1 Y) == 0 --> ~(X ^ Y)
(zext i1 X) + (sext i1 Y) == 1 --> X & ~Y
```
And other predicates can the combination of these results:
```
(zext i1 X) + (sext i1 Y)) != -1 --> X | ~Y
(zext i1 X) + (sext i1 Y)) s> -1 --> X | ~Y
(zext i1 X) + (sext i1 Y)) u< -1 --> X | ~Y
(zext i1 X) + (sext i1 Y)) s> 0 --> X & ~Y
(zext i1 X) + (sext i1 Y)) s< 0 --> ~X & Y
(zext i1 X) + (sext i1 Y)) != 1 --> ~X | Y
(zext i1 X) + (sext i1 Y)) s< 1 --> ~X | Y
(zext i1 X) + (sext i1 Y)) u> 1 --> ~X & Y
```
All alive proofs:
C == 0 means , X == Yhttps://alive2.llvm.org/ce/z/KmgDpF
C == 1 means, X == true, Y == falsehttps://alive2.llvm.org/ce/z/fLwWa9
So based on these info we can simplify the icmp to logical operations.https://alive2.llvm.org/ce/z/ZKQn2P
Fix: https://github.com/llvm/llvm-project/issues/59666