https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110919
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Generalized for -O1 case: // (a & (b & ~a)) -> 0 // (a & (b | ~a)) -> a & b // (a & (b ^ ~a)) -> a & b // (a & (b cmp !a)) -> a & (b cmp 0) (for op (tcc_comparison bit_and bit_xor bit_and) (simplify (bit_and:c zero_one_valued_p@0 (op:c @1 (convert? @2))) (with { bool wascmp; } (if (bitwise_inverted_equal_p (@0, @2, wascmp)) (bit_and @0 (op @1 { build_zero_cst (TREE_TYPE (@1)); }))))) Note I filed PR 111282 for `(a & (b ^ ~a))` also.