We can't really code-generate those (and thus such patterns are
simply skipped during code-gen ...).  Reject them early.

Committed to the branch.

Richard.

2014-05-20  Richard Biener  <rguent...@suse.de>

        * genmatch.c (parse_match_and_simplify): Reject outermost
        expressions that are captured or not expressions.
        * match.pd: Rewrite negate contracting patterns to avoid
        capturing the outermost expression.

Index: gcc/match.pd
===================================================================
--- gcc/match.pd        (revision 210637)
+++ gcc/match.pd        (working copy)
@@ -26,22 +26,18 @@ along with GCC; see the file COPYING3.
 /* ???  Have match_and_simplify groups guarded with common
    predicates on the outermost type?  */
 
-/* Contract negates.
-   ???  !TYPE_SATURATING condition missing.  */
+/* Contract negates.  */
 (match_and_simplify
-  (PLUS_EXPR @0 (NEGATE_EXPR @1))
-  /* Ugh, free form mixed in ... ;)  Want (if ...) instead?  */
-  if (!TYPE_SATURATING (TREE_TYPE (@0)))
-  (MINUS_EXPR @0 @1))
+  (plus @0 (negate @1))
+  if (!TYPE_SATURATING (type))
+  (minus @0 @1))
 (match_and_simplify
-  /* ???  Allow (MINUS:!TYPE_SATURATING @0 (NEGATE @1)), thus
-     type predicates on operands?  Thus also :INTEGRAL_TYPE_P
-     or @0:INTEGRAL_TYPE_P?  */
-  (MINUS @0 (NEGATE @1))
-  (PLUS @0 @1))
+  (minus @0 (negate @1))
+  if (!TYPE_SATURATING (type))
+  (plus @0 @1))
 (match_and_simplify
-  (plus@2 (negate @0) @1)
-  if (!TYPE_SATURATING (TREE_TYPE (@2)))
+  (plus (negate @0) @1)
+  if (!TYPE_SATURATING (type))
   (minus @1 @0))
 
 /* Change to even more free-form like
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c      (revision 210637)
+++ gcc/genmatch.c      (working copy)
@@ -829,6 +829,8 @@ parse_match_and_simplify (cpp_reader *r)
        fatal ("expected 'if' or expression");
       ifexpr = parse_c_expr (r, CPP_OPEN_PAREN);
     }
+  if (match->type != operand::OP_EXPR)
+    fatal ("expected uncaptured expression");
   return new simplify (id, match, ifexpr, parse_op (r));
 }
 

Reply via email to