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. > >