On Wed, Jun 7, 2023 at 3:57 PM Jeff Law via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > > > On 6/7/23 15:32, Andrew Pinski via Gcc-patches wrote: > > Since there is a pattern to convert `(-zero_one) & z` into `zero_one * z` > > already, > > it is better if we don't do a secondary transformation. This reduces the > > extra > > statements produced by match-and-simplify on the gimple level too. > > > > gcc/ChangeLog: > > > > * match.pd (`zero_one ==/!= 0) ? y : z <op> y`): Use > > multiply rather than negation/bit_and. > Don't you need to check the types in a manner similar to what the A & -Y > -> X * Y pattern does before you make this transformation?
No, because the convert is in a different order than in that transformation; a very subtle difference which makes it work. In A & -Y it was matching: (bit_and (convert? (negate But here we have: (bit_and (negate (convert Notice the convert is in a different location, in the `A & -Y` case, the convert needs to be a sign extending (or a truncation) of the negative value. Here we are converting the one_zero_value to the new type so we get zero_one in the new type and then doing the negation getting us 0 or -1 value. Thanks, Andrew > > jeff >