diff mbox

[GSoC,match-and-simplify] change syntax of inner-if

Message ID CAJXstsDRDf59PX+3GvdWFJ0qJWaccS6OAuTJoyrMma1Gtrp4dQ@mail.gmail.com
State New
Headers show

Commit Message

Prathamesh Kulkarni July 23, 2014, 12:09 a.m. UTC
This patch changes syntax of inner-if to be parenthesized - (if (cond))

* genmatch.c (parse_match_and_simplify): Adjust to parse parenthesized if.
     (peek_ident): New function.

* match.pd: Adjust patterns having if-expr to new syntax.

Thanks and Regards,
Prathamesh

Comments

Richard Biener July 23, 2014, 9:20 a.m. UTC | #1
On Wed, Jul 23, 2014 at 2:09 AM, Prathamesh Kulkarni
<bilbotheelffriend@gmail.com> wrote:
> This patch changes syntax of inner-if to be parenthesized - (if (cond))
>
> * genmatch.c (parse_match_and_simplify): Adjust to parse parenthesized if.
>      (peek_ident): New function.
>
> * match.pd: Adjust patterns having if-expr to new syntax.

Thanks - committed.

Richard.

> Thanks and Regards,
> Prathamesh
diff mbox

Patch

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 212916)
+++ gcc/genmatch.c	(working copy)
@@ -1769,6 +1769,20 @@  peek (cpp_reader *r)
   return token;
 }
 
+static const cpp_token *
+peek_ident (cpp_reader *r, const char *id)
+{
+  const cpp_token *token = peek (r);
+  if (token->type != CPP_NAME)
+    return 0;
+
+  const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;  
+  if (strcmp (id, t) == 0)
+    return token;
+
+  return 0;
+}
+
 /* Read the next token from R and assert it is of type TK.  */
 
 static const cpp_token *
@@ -1985,7 +1999,6 @@  parse_op (cpp_reader *r)
   return op;
 }
 
-
 /* Parse
      (define_match_and_simplify "<ident>"
         <op> <op>)  */
@@ -2008,21 +2021,33 @@  parse_match_and_simplify (cpp_reader *r,
   struct operand *match = parse_op (r);
   if (match->type != operand::OP_EXPR)
     fatal_at (loc, "expected uncaptured expression");
+
   token = peek (r);
-  /* Conditional if (....)  */
-  struct operand *ifexpr = NULL;
-  source_location ifexpr_location = 0;
-  if (token->type == CPP_NAME)
+
+  if (token->type != CPP_OPEN_PAREN)
+    return new simplify (id, match, match_location, 0, 0, parse_op (r), token->src_loc);
+
+  eat_token (r, CPP_OPEN_PAREN);
+
+  token = peek (r);
+  source_location result_loc = token->src_loc;
+
+  // ( expr )
+  if (peek_ident (r, "if") == 0)
     {
-      const char *tem = get_ident (r);
-      if (strcmp (tem, "if") != 0)
-	fatal_at (token, "expected 'if' or expression");
-      ifexpr_location = token->src_loc;
-      ifexpr = parse_c_expr (r, CPP_OPEN_PAREN);
+      operand *result = parse_expr (r);
+      eat_token (r, CPP_CLOSE_PAREN);
+      return new simplify (id, match, match_location, 0, 0, result, result_loc); 
     }
-  token = peek (r);
-  return new simplify (id, match, match_location,
-		       ifexpr, ifexpr_location, parse_op (r), token->src_loc);
+
+  // (if c-expr)
+  source_location ifexpr_loc = token->src_loc; 
+  eat_ident (r, "if");
+  operand *ifexpr = parse_c_expr (r, CPP_OPEN_PAREN);
+  eat_token (r, CPP_CLOSE_PAREN);
+
+  result_loc = peek (r)->src_loc;
+  return new simplify (id, match, match_location, ifexpr, ifexpr_loc, parse_op (r), result_loc);
 }
 
 void
Index: gcc/match.pd
===================================================================
--- gcc/match.pd	(revision 212916)
+++ gcc/match.pd	(working copy)
@@ -49,7 +49,7 @@  along with GCC; see the file COPYING3.
    and simplifies 0 % x to 0.  */
 (match_and_simplify
   (trunc_mod integer_zerop@0 @1)
-  if (!integer_zerop (@1))
+  (if (!integer_zerop (@1)))
   @0)
 (match_and_simplify
   (bit_ior @0 integer_all_onesp@1)
@@ -83,7 +83,7 @@  along with GCC; see the file COPYING3.
 #if GIMPLE
 (match_and_simplify
   (pointer_plus (addr@2 @0) INTEGER_CST_P@1)
-  if (is_gimple_min_invariant (@2))
+  (if (is_gimple_min_invariant (@2)))
   {
     HOST_WIDE_INT off;
     tree base = get_addr_base_and_unit_offset (@0, &off);
@@ -106,11 +106,11 @@  along with GCC; see the file COPYING3.
 /* Contract negates.  */
 (match_and_simplify
   (plus:c @0 (negate @1))
-  if (!TYPE_SATURATING (type))
+  (if (!TYPE_SATURATING (type)))
   (minus @0 @1))
 (match_and_simplify
   (minus @0 (negate @1))
-  if (!TYPE_SATURATING (type))
+  (if (!TYPE_SATURATING (type)))
   (plus @0 @1))
 
 
@@ -123,24 +123,24 @@  along with GCC; see the file COPYING3.
 /* (A +- B) - A -> +-B.  */
 (match_and_simplify
   (minus (plus @0 @1) @0)
-  if (!TYPE_SATURATING (type)
-      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type))
+  (if (!TYPE_SATURATING (type)
+      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)))
   @1)
 (match_and_simplify
   (minus (minus @0 @1) @0)
-  if (!TYPE_SATURATING (type)
-      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type))
+  (if (!TYPE_SATURATING (type)
+      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)))
   (negate @1))
 /* (A +- B) -+ B -> A.  */
 (match_and_simplify
   (minus (plus @0 @1) @1)
-  if (!TYPE_SATURATING (type)
-      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type))
+  (if (!TYPE_SATURATING (type)
+      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)))
   @0)
 (match_and_simplify
   (plus:c (minus @0 @1) @1)
-  if (!TYPE_SATURATING (type)
-      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type))
+  (if (!TYPE_SATURATING (type)
+      && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type)))
   @0)
 /* (CST +- A) +- CST -> CST' +- A.  */
 /* match_and_simplify handles constant folding for us so we can
@@ -152,7 +152,7 @@  along with GCC; see the file COPYING3.
   /* If the constant operation overflows we cannot do the transform
      as we would introduce undefined overflow, for example
      with (a - 1) + INT_MIN.  */
-  if (!TREE_OVERFLOW (@1 = int_const_binop (PLUS_EXPR, @1, @2)))
+  (if (!TREE_OVERFLOW (@1 = int_const_binop (PLUS_EXPR, @1, @2))))
   (plus @0 @1))
 (match_and_simplify
   (plus (minus INTEGER_CST_P@0 @1) INTEGER_CST_P@2)
@@ -202,7 +202,7 @@  along with GCC; see the file COPYING3.
      if the new mask might be further optimized.  */
 (match_and_simplify
   (bit_and (rshift@0 @1 INTEGER_CST_P@2) integer_onep)
-  if (compare_tree_int (@2, TYPE_PRECISION (TREE_TYPE (@1)) - 1) == 0)
+  (if (compare_tree_int (@2, TYPE_PRECISION (TREE_TYPE (@1)) - 1) == 0))
   @0)
 
 /* COMPLEX_EXPR and REALPART/IMAGPART_EXPR cancellations.  */
@@ -258,7 +258,7 @@  along with GCC; see the file COPYING3.
   /* This needs to be conditionalized on flag_unsafe_math_optimizations,
      but we keep it for now to exercise function re-optimization.
      It makes gcc.dg/pr43419.c FAIL execution though.  */
-  if (REAL_VALUES_EQUAL (TREE_REAL_CST (@1), dconsthalf))
+  (if (REAL_VALUES_EQUAL (TREE_REAL_CST (@1), dconsthalf)))
   (BUILT_IN_SQRT @0))
 
 /* TODO bitwise patterns:
@@ -349,10 +349,10 @@  along with GCC; see the file COPYING3.
 (for op in plus bit_ior bit_xor 
 (match_and_simplify
   (op:c (lshift @0 INTEGER_CST_P@1) (rshift @0 INTEGER_CST_P@2))
-  if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
+  (if (INTEGRAL_TYPE_P (type) && TYPE_UNSIGNED (type)
       && TYPE_PRECISION (type) == GET_MODE_PRECISION (TYPE_MODE (type))
       && tree_fits_uhwi_p (@1) && tree_fits_uhwi_p (@2)
-      && tree_to_uhwi (@1) + tree_to_uhwi (@2) == TYPE_PRECISION (type))
+      && tree_to_uhwi (@1) + tree_to_uhwi (@2) == TYPE_PRECISION (type)))
   (lrotate @0 @1)))