> Am 26.09.2026 um 00:06 schrieb Andrea Pinski <[email protected]>:
>
> On Fri, Sep 25, 2026 at 6:11 AM Richard Biener <[email protected]> wrote:
>>
>> The following complements the existing (xor (and A B) B) to (and (not A) B)
>> transform. I've seen this candidate when analyzing PR127606.
>>
>> Bootstrapped and tested on x86_64-unknown-linux-gnu.
>>
>> OK?
>
> I think this makes sense since nand (bic on aarch64/arm) is a very
> common instruction.
> Also we have done this on the gimple/generic level for a long time.
> The match pattern was done in r6-1883-g5b00d9211625c1 but we have done
> in fold-const since r0-69890-g9d24eb542cfde8 (I didn't even realize it
> was my change until I looked it up).
>
> So yes this is ok.
>
> I suspect we have many patterns that were added to fold-const (and
> match) that never made it to simplify-rtx.cc but that is for another
> day.
We might want to experiment with a match.pd RTL generator, possibly opt-in per
pattern where an obvious 1:1 translation exists …
Richard
>
> Thanks,
> Andrea
>
>
>>
>> Thanks,
>> Richard.
>>
>> * simplify-rtx.cc (simplify_context::simplify_binary_operation_1):
>> Also simplify (xor (ior A B) B) to (and (not B) A).
>> ---
>> gcc/simplify-rtx.cc | 16 ++++++++++++++++
>> 1 file changed, 16 insertions(+)
>>
>> diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc
>> index 38c8abfe3e7..e74f241c7cd 100644
>> --- a/gcc/simplify-rtx.cc
>> +++ b/gcc/simplify-rtx.cc
>> @@ -4119,6 +4119,22 @@ simplify_context::simplify_binary_operation_1
>> (rtx_code code,
>> XEXP (op0, 1), mode),
>> op1);
>>
>> + /* Similarly, convert (xor (ior A B) B) to (and (not B) A). */
>> + else if (GET_CODE (op0) == IOR
>> + && rtx_equal_p (XEXP (op0, 1), op1)
>> + && ! side_effects_p (op1))
>> + return simplify_gen_binary (AND, mode,
>> + simplify_gen_unary (NOT, mode,
>> + op1, mode),
>> + XEXP (op0, 0));
>> + else if (GET_CODE (op0) == IOR
>> + && rtx_equal_p (XEXP (op0, 0), op1)
>> + && ! side_effects_p (op1))
>> + return simplify_gen_binary (AND, mode,
>> + simplify_gen_unary (NOT, mode,
>> + op1, mode),
>> + XEXP (op0, 1));
>> +
>> /* Given (xor (ior (xor A B) C) D), where B, C and D are
>> constants, simplify to (xor (ior A C) (B&~C)^D), canceling
>> out bits inverted twice and not set by C. Similarly, given
>> --
>> 2.51.0