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

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.

--
Marc Glisse

Reply via email to