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.
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. >
0001-Optimize-two-patterns-with-three-xors.patch
Description: 0001-Optimize-two-patterns-with-three-xors.patch