https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52345
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The generic rule is: original 3 expressions; (((int)b) | i) == 0 -> (b == 0) & (i == 0) -> ~b & (i == 0) (4 expressions; maybe 3 if b is a comparison and single use) (((int)b) | i) != 0 -> (b != 0) | (i != 0) -> b | (i != 0) (still 3 expressions) (((int)b) & i) == 0 -> (b == 0) | ((i&1) == 0) -> ~b | ((i&1) == 0) (4 expressions; maybe 3 if b is a comparison and single use) (((int)b) & i) != 0 -> (b != 0) & ((i&1) != 0) -> b & ((i&1) != 0) (still 3 expressions) Where b is a "boolean" type variable.