On Thu, 21 Aug 2014, Marc Glisse wrote: > On Thu, 21 Aug 2014, Richard Biener wrote: > > > 2014-08-21 Richard Biener <rguent...@suse.de> > > > > * match.pd ((T1)(~(T2) X) -> ~(T1) X): Paste all comment > > from fold-const.c, fix simplification result. > > > > Index: gcc/match.pd > > =================================================================== > > --- gcc/match.pd (revision 214268) > > +++ gcc/match.pd (working copy) > > @@ -109,7 +109,9 @@ along with GCC; see the file COPYING3. > > > > /* From fold_unary. */ > > > > -/* (T1)(~(T2) X) -> ~(T1) X */ > > +/* Convert (T1)(~(T2)X) into ~(T1)X if T1 and T2 are integral types > > + of the same precision, and X is an integer type not narrower than > > + types T1 or T2, i.e. the cast (T2)X isn't an extension. */ > > (simplify > > (convert (bit_not@0 (convert @1))) > > (if (INTEGRAL_TYPE_P (type) > > @@ -117,7 +119,7 @@ along with GCC; see the file COPYING3. > > && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (@0)) > > && INTEGRAL_TYPE_P (TREE_TYPE (@1)) > > && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (@1))) > > - (bit_not (convert (bit_not @0))))) > > + (bit_not (convert @0)))) > > Er, I think you mean: > (bit_not (convert @1))
Oops, fixed ;) > Your pattern (bit_not (convert (bit_not @0))) was valid, @0 is the bit_not, so > it simplifies, but that was a pretty unreadable way to write it, and I was > scared that you had done it on purpose to help the machinery guess the type. > Glad to see that the simple version is ok. Of course. Thanks, Richard. 2014-08-26 Richard Biener <rguent...@suse.de> * match.pd ((T1)(~(T2) X) -> ~(T1) X): Fix simplification again. Index: gcc/match.pd =================================================================== --- gcc/match.pd (revision 214490) +++ gcc/match.pd (working copy) @@ -119,7 +119,7 @@ along with GCC; see the file COPYING3. && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (@0)) && INTEGRAL_TYPE_P (TREE_TYPE (@1)) && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (@1))) - (bit_not (convert @0)))) + (bit_not (convert @1)))) #include "match-plusminus.pd"