+/* (a & b) ^ (a == b) -> !(a | b) */ +/* (a & b) == (a ^ b) -> !(a | b) */ +(for first_op (bit_xor eq) + second_op (eq bit_xor) + (simplify + (first_op:c (bit_and:c @0 @1) (second_op:c @0 @1)) + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && types_match (TREE_TYPE (@0), TREE_TYPE (@1))) + (convert (bit_not (bit_ior @0 @1))))))
I don't think you need types_match, if both are operands of bit_and, their types must already match.
It isn't clear what the INTEGRAL_TYPE_P test is for. Your 2 transformations don't seem that similar to me. The first one requires that a and b have the same type as the result of ==, so they are boolean-like. The second one makes sense for more general integers, but then it looks like it should produce (a|b)==0.
It doesn't look like we have a canonical representation between a^b and a!=b for booleans :-(
(sorry for the broken thread, I was automatically unsubscribed because mailman doesn't like greylisting)
-- Marc Glisse