https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110992
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> --- This is what I came up with in the end: /* (a * b@[0,1]) == CST -> CST == 0 ? (a == CST | b == 0) : (a == CST & b != 0) (a * b@[0,1]) != CST -> CST != 0 ? (a != CST | b == 0) : (a != CST & b != 0) */ (for cmp (ne eq) (simplify (cmp (mult:cs @0 zero_one_valued_p@1) INTEGER_CST@2) (if ((cmp == EQ_EXPR) ^ (wi::to_wide (@2) != 0)) (bit_ior (cmp @0 @2) (convert (bit_xor @1 { build_one_cst (TREE_TYPE (@1)); }))) (bit_and (cmp @0 @2) (convert @1))))) This allows more than just CST == 0 even. I will write up some testcases now ...