https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110919
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #7) > 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. The corrected version is: // (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? zero_one_valued_p@2))) (with { bool wascmp; } (if (bitwise_inverted_equal_p (@0, @2, wascmp)) (bit_and @0 (op @1 { build_zero_cst (TREE_TYPE (@1)); }))))))