https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110992
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This is what I have so far: /* Transform (a * { 0 or 1 }) != 0 into {0 or 1} != 0 & (a != 0) */ /* Transform (a * { 0 or 1 }) == 0 into ({0 or 1} == 0) | (a == 0) */ (for cmp (ne eq) bit_op (bit_and bit_ior) (simplify (cmp (mult:cs @0 zero_one_valued_p@1) integer_zerop@2) (bit_op (cmp @1 { build_zero_cst (TREE_TYPE (@1)); }) (cmp @0 @2)))) /* zero_one_valued_p != 0 -> (cast)zero_one_valued_p */ (simplify (ne zero_one_valued_p@0 integer_zerop) (convert @0))