diff mbox

[match-and-simplify] Fix outer if parsing

Message ID alpine.LSU.2.11.1409231346060.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Sept. 23, 2014, 11:47 a.m. UTC
This restructures outer if parsing to maintain a stack of active
ifs.  This gets rid of all the reverse if stuff and fixes outer ifs
on (match ...)es.

What is left to be done is delaying 'for' lowering.

Richard.

2014-09-23  Richard Biener  <rguenther@suse.de>

	* genmatch.c 
	(dt_simplify::gen): Adjust.
	(copy_reverse): Remove.
	(parse_simplify): Adjust.
diff mbox

Patch

Index: match-and-simplify/gcc/genmatch.c
===================================================================
--- match-and-simplify.orig/gcc/genmatch.c	2014-09-23 13:42:38.186799538 +0200
+++ match-and-simplify/gcc/genmatch.c	2014-09-23 13:41:43.864803278 +0200
@@ -1878,8 +1878,7 @@  dt_simplify::gen (FILE *f, bool gimple)
   unsigned n_braces = 0;
   if (s->ifexpr_vec != vNULL)
     {
-      // we add in LIFO order, so traverse backwards
-      for (int i = s->ifexpr_vec.length () - 1; i >= 0; --i)
+      for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
 	{
 	  if_or_with &w = s->ifexpr_vec[i];
 	  if (w.is_with)
@@ -1897,7 +1896,7 @@  dt_simplify::gen (FILE *f, bool gimple)
 		w.cexpr->gen_transform (f, NULL, true, 1, "type");
 	      else
 		{
-		  int j = i;
+		  unsigned j = i;
 		  do
 		    {
 		      if (j != i)
@@ -1910,10 +1909,11 @@  dt_simplify::gen (FILE *f, bool gimple)
 		      s->ifexpr_vec[j].cexpr->gen_transform (f, NULL,
 							     true, 1, "type");
 		      fprintf (f, ")");
-		      --j;
+		      ++j;
 		    }
-		  while (j >= 0 && !s->ifexpr_vec[j].is_with);
-		  i = j + 1;
+		  while (j < s->ifexpr_vec.length ()
+			 && !s->ifexpr_vec[j].is_with);
+		  i = j - 1;
 		}
 	      fprintf (f, ")\n");
 	    }
@@ -2511,18 +2511,6 @@  parse_op (cpp_reader *r)
   return op;
 }
 
-/* Return a reversed copy of V.  */
-
-template <class T>
-static vec<T>
-copy_reverse (vec<T> v)
-{
-  vec<T> c = vNULL;
-  for (int i = v.length ()-1; i >= 0; --i)
-    c.safe_push (v[i]);
-  return c;
-}
-
 /* Parse
      'simplify' [ <ident> ] <expr> <result-op>
    with
@@ -2557,12 +2545,12 @@  parse_simplify (cpp_reader *r, source_lo
       if (matcher->nargs == -1)
 	matcher->nargs = 0;
       simplifiers.safe_push
-	(new simplify (match, match_location, NULL, token->src_loc));
+	(new simplify (match, match_location, NULL,
+		       token->src_loc, active_ifs.copy ()));
       return;
     }
 
-  auto_vec<if_or_with> ifexprs;
-  ifexprs.safe_splice (active_ifs);
+  unsigned active_ifs_len = active_ifs.length ();
   while (1)
     {
       if (token->type == CPP_OPEN_PAREN)
@@ -2572,8 +2560,8 @@  parse_simplify (cpp_reader *r, source_lo
 	  if (peek_ident (r, "if"))
 	    {
 	      eat_ident (r, "if");
-	      ifexprs.safe_push (if_or_with (parse_c_expr (r, CPP_OPEN_PAREN),
-					     token->src_loc, false));
+	      active_ifs.safe_push (if_or_with (parse_c_expr (r, CPP_OPEN_PAREN),
+						token->src_loc, false));
 	      /* If this if is immediately closed then it contains a
 	         manual matcher or is part of a predicate definition.
 		 Push it.  */
@@ -2587,7 +2575,7 @@  parse_simplify (cpp_reader *r, source_lo
 		    matcher->nargs = 0;
 		  simplifiers.safe_push
 		      (new simplify (match, match_location, NULL,
-				     paren_loc, ifexprs));
+				     paren_loc, active_ifs.copy ()));
 		}
 	    }
 	  else if (peek_ident (r, "with"))
@@ -2596,7 +2584,7 @@  parse_simplify (cpp_reader *r, source_lo
 	      /* Parse (with c-expr expr) as (if-with (true) expr).  */
 	      c_expr *e = parse_c_expr (r, CPP_OPEN_BRACE);
 	      e->nr_stmts = 0;
-	      ifexprs.safe_push (if_or_with (e, token->src_loc, true));
+	      active_ifs.safe_push (if_or_with (e, token->src_loc, true));
 	    }
 	  else
 	    {
@@ -2614,13 +2602,13 @@  parse_simplify (cpp_reader *r, source_lo
 		}
 	      simplifiers.safe_push
 		  (new simplify (match, match_location, op,
-				 token->src_loc, ifexprs));
+				 token->src_loc, active_ifs.copy ()));
 	      eat_token (r, CPP_CLOSE_PAREN);
 	      /* A "default" result closes the enclosing scope.  */
-	      if (ifexprs.length () > 0)
+	      if (active_ifs.length () > active_ifs_len)
 		{
 		  eat_token (r, CPP_CLOSE_PAREN);
-		  ifexprs.pop ();
+		  active_ifs.pop ();
 		}
 	      else
 		return;
@@ -2629,10 +2617,10 @@  parse_simplify (cpp_reader *r, source_lo
       else if (token->type == CPP_CLOSE_PAREN)
 	{
 	  /* Close a scope if requested.  */
-	  if (ifexprs.length () > 0)
+	  if (active_ifs.length () > active_ifs_len)
 	    {
 	      eat_token (r, CPP_CLOSE_PAREN);
-	      ifexprs.pop ();
+	      active_ifs.pop ();
 	      token = peek (r);
 	    }
 	  else
@@ -2644,12 +2632,12 @@  parse_simplify (cpp_reader *r, source_lo
 	    fatal_at (token, "expected match operand expression");
 	  simplifiers.safe_push
 	      (new simplify (match, match_location, parse_op (r),
-			     token->src_loc, ifexprs));
+			     token->src_loc, active_ifs.copy ()));
 	  /* A "default" result closes the enclosing scope.  */
-	  if (ifexprs.length () > 0)
+	  if (active_ifs.length () > active_ifs_len)
 	    {
 	      eat_token (r, CPP_CLOSE_PAREN);
-	      ifexprs.pop ();
+	      active_ifs.pop ();
 	    }
 	  else
 	    return;