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
...

Reply via email to