On Tue, Nov 17, 2020 at 3:19 AM Eugene Rozenfeld
<eugene.rozenf...@microsoft.com> wrote:
>
> Thank you for the review Richard!
>
> I re-worked the patch based on your suggestions (attached).
> I made the change to reuse the first bit_xor in both patterns and I added :s 
> to the last xor in the first pattern.
> For the second pattern I didn't add :s because I think the simplification is 
> beneficial even if the second or third bit_xor has more than one use since we 
> are simplifying them to just a single operand (@2). If that is incorrect, 
> please explain why.

Ah, true, that's correct.

The patch is OK.

Thanks,
Richard.

> Eugene
>
> -----Original Message-----
> From: Richard Biener <richard.guent...@gmail.com>
> Sent: Monday, November 16, 2020 4:11 AM
> To: Eugene Rozenfeld <eugene.rozenf...@microsoft.com>
> Cc: gcc-patches@gcc.gnu.org
> Subject: Re: [PATCH] [tree-optimization] Optimize two patterns with three 
> xors.
>
> On Thu, Nov 12, 2020 at 2:53 AM Eugene Rozenfeld via Gcc-patches 
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > Simplify (a ^ b) & ((b ^ c) ^ a) --> (a ^ b) & ~c.
> >
> > int f(int a, int b, int c)
> > {
> >     return (a ^ b) & ((b ^ c) ^ a);
> > }
> >
> > Code without the patch:
> > mov    eax,edx
> > xor    eax,esi
> > xor    eax,edi
> > xor    edi,esi
> > and    eax,edi
> > ret
> >
> > Code with the patch:
> > xor    edi,esi
> > andn   eax,edx,edi
> > ret
> >
> > Simplify (a ^ b) | ((b ^ c) ^ a) --> (a ^ b) | c.
> > int g(int a, int b, int c)
> > {
> >     return (a ^ b) | ((b ^ c) ^ a);
> > }
> >
> > Code without the patch:
> > mov    eax,edx
> > xor    eax,esi
> > xor    eax,edi
> > xor    edi,esi
> > or     eax,edi
> > ret
> >
> > Code with the patch:
> > xor    edi,esi
> > mov    eax,edi
> > or     eax,edx
> > ret
> >
> > This fixes PR96671.
>
> +/* (a ^ b) & ((b ^ c) ^ a) --> (a ^ b) & ~c */ (simplify  (bit_and:c
> +(bit_xor:c @0 @1) (bit_xor:cs (bit_xor:c @1 @2) @0))  (bit_and (bit_xor
> +@0 @1) (bit_not @2)))
>
> you should be able to re-use the first bit_xor by doing
>
> +/* (a ^ b) & ((b ^ c) ^ a) --> (a ^ b) & ~c */ (simplify  (bit_and:c
> +(bit_xor:c@3 @0 @1) (bit_xor:cs (bit_xor:c @1 @2) @0))  (bit_and @3
> +(bit_not @2)))
>
> For completeness the last (bit_xor:c @1 @2) should also have a :s
>
> +/* (a ^ b) | ((b ^ c) ^ a) --> (a ^ b) | c */ (simplify  (bit_ior:c
> +(bit_xor:c @0 @1) (bit_xor:c (bit_xor:c @1 @2) @0))  (bit_ior (bit_xor
> +@0 @1) @2))
>
> completely misses :s here and the same comment about the re-use of the 
> existing xor applies.
>
> Otherwise looks OK to me, sorry for the delay.
>
> Thanks,
> Richard.
>
> > Tested on x86_64-pc-linux-gnu.
> >

Reply via email to