On June 11, 2015 5:25:30 PM GMT+02:00, Marc Glisse <marc.gli...@inria.fr> wrote: >On Thu, 11 Jun 2015, Marek Polacek wrote: > >> I have verified this transformation on a toy testcase (tried x and y >> in the range [-1000,1000]) and it does a correct thing for all >integers. > >Note that for pure bitop (only involving &|^), testing the range [0,1] >is >sufficient. > >> +/* (x & y) ^ (x | y) -> x ^ y */ >> +(simplify >> + (bit_xor:c (bit_and@2 @0 @1) (bit_ior@3 @0 @1)) > >Make either bit_and or bit_ior commutative? Or do we canonicalize in a >way >that makes it unnecessary?
Yes, operand canonicalization should make this unnecessary. >> + (if (single_use (@2) && single_use (@3)) >> + (bit_xor @0 @1))) > >I don't think we should use single_use here. The result is never more >complicated than the original. Sure, it might increase register >pressure a >bit in some cases, but we have not used that as a criterion for other >simplifications in match.pd yet (LLVM does though). Hmm yes, you are right here. Richard.