https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111542
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Note IOR with != 0 has the same issue.
Full testcase:
```
_Bool f_and(int x,int y)
{
_Bool a = x == 0;
_Bool b = y == 0;
_Bool t = a & b;
return t & !a;
}
_Bool f_or(int x,int y)
{
_Bool a = x != 0;
_Bool b = y != 0;
_Bool t = a | b;
return t | !a;
}
```
Match pattern:
```
(for bitop (bit_ior bit_and)
cmp1 (eq ne )
cmp2 (ne eq )
(simplify
(bitop:c
(cmp1 @1 integer_zerop)
(cmp2 (bit_ior:c @0 @1) integer_zerop))
{ constant_boolean_node (bitop == BIT_IOR_EXPR, type); }))
```