> 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

Reply via email to