On 5/29/2026 10:13 AM, Shivam Gupta wrote:
> Recognize XOR patterns involving zero_one_valued operands compared
> against zero and simplify them to direct equality or inequality tests.
>
> Specifically:
>
> (a == 0) ^ (b != 0)  -> a == b
> (a != 0) ^ (b == 0)  -> a == b
> (a == 0) ^ (b == 0)  -> a != b
> (a != 0) ^ (b != 0)  -> a != b
>
> Also handle a specific case:
> (a == 0) ^ b -> b != (a ^ 1)
>
> Regression tested on aarch64-linux-gnu.
>
> gcc/ChangeLog:
>       * match.pd: Add simplifications for XORs of zero_one_valued
>       comparisons against zero.
>
> gcc/testsuite/ChangeLog:
>       * gcc.dg/tree-ssa/bool-eq-bitxor.c: Update expected number
>       of optimized XOR forms.
>       * gcc.dg/tree-ssa/bool-xor-zero-one-valued.c: New test.
>
> Signed-off-by: Shivam Gupta <[email protected]>
So for the (a == 0) ^ b case, isn't the simplification for that just a 
== b rather than b != (a ^ 1)?  If both are 0/1 valued, that works, right?




> +
> +/* For zero_one_valued operands:
> +     (a == 0) != (b != 0)  -> a == b
> +     (a != 0) != (b == 0)  -> a == b.  */
> +(for op1 (eq ne)
> +     op2 (ne eq)
> + (simplify
> +  (ne:c (op1 zero_one_valued_p@0 integer_zerop)
> +        (op2 zero_one_valued_p@1 integer_zerop))
> +  (if (types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
> +   (eq @0 @1))))
Do you want to handle an outer EQ here in addition to handling the outer 
NE?  I think it just inverts the resulting code, right? SImilarly for 
the other pattern.


Do we need conversions on @0 and @1?  In particular a conditional 
conversion convert?  And if we do that, do we need to adjust the 
types_match conditional?

match.pd isn't my area of speciality, so if Andrew or Richard suggest 
something different, their review matters more than mine.

jeff

Reply via email to