Patchwork [fortran] Some cleanup / fixes in front-end statement walker

login
register
mail settings
Submitter Thomas Koenig
Date Oct. 16, 2011, 8:19 p.m.
Message ID <4E9B3C37.3020103@netcologne.de>
Download mbox | patch
Permalink /patch/120067/
State New
Headers show

Comments

Thomas Koenig - Oct. 16, 2011, 8:19 p.m.
Hello world,

working on PR 50690, I noticed a few things which are
not quite right in front-end optimization statement
walking:

- BLOCKs were walked via their namespaces, not directly.
   This caused out-of-order walking, which was confusing.
- current_ns was not marked static.
- ASSOCIATE lists were not walked.

This patch corrects these things.  Regression-tested.
OK for trunk?  (I will not be able to commit for a few
days due to business travel, unless somebody is _really_
fast :-)

	Thomas

2011-10-16  Thomas Koenig  <tkoenig@gcc.gnu.org>

         * frontend-passes.c (current_ns):  Make static.
         (create_var):  Note parent of newly created namespace.
         (optimize_namespace):  Don't wak sibling namespaces
         if they are EXEC_BLOCK because this is handled...
         (gfc_code_walker):  ... here.  Also walk ASSOCIATE lists.
Steven Bosscher - Oct. 16, 2011, 8:23 p.m.
> This patch corrects these things.  Regression-tested.
> OK for trunk?  (I will not be able to commit for a few
> days due to business travel, unless somebody is _really_
> fast :-)

Looks OK to me. Fast enough for you?

Ciao!
Steven
Thomas Koenig - Oct. 16, 2011, 10:07 p.m.
Steven Bosscher wote:
>> This patch corrects these things.  Regression-tested.
>> OK for trunk?  (I will not be able to commit for a few
>> days due to business travel, unless somebody is _really_
>> fast :-)
>
> Looks OK to me. Fast enough for you?

Yes indeed.  Committed as rev. 180063.

Thanks a lot!

	Thomas

Patch

Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 179770)
+++ frontend-passes.c	(Arbeitskopie)
@@ -60,7 +60,7 @@  static gfc_code *inserted_block, **changed_stateme
 
 /* The namespace we are currently dealing with.  */
 
-gfc_namespace *current_ns;
+static gfc_namespace *current_ns;
 
 /* If we are within any forall loop.  */
 
@@ -261,6 +261,7 @@  create_var (gfc_expr * e)
       (*current_code)->next = NULL;
       /* Insert the BLOCK at the right position.  */
       *current_code = inserted_block;
+      ns->parent = current_ns;
     }
   else
     ns = inserted_block->ext.block.ns;
@@ -509,8 +510,12 @@  optimize_namespace (gfc_namespace *ns)
   gfc_code_walker (&ns->code, cfe_code, cfe_expr_0, NULL);
   gfc_code_walker (&ns->code, optimize_code, optimize_expr, NULL);
 
+  /* BLOCKs are handled in the expression walker below.  */
   for (ns = ns->contained; ns; ns = ns->sibling)
-    optimize_namespace (ns);
+    {
+      if (ns->code == NULL || ns->code->op != EXEC_BLOCK)
+	optimize_namespace (ns);
+    }
 }
 
 /* Replace code like
@@ -1143,6 +1148,7 @@  gfc_code_walker (gfc_code **c, walk_code_fn_t code
 	  gfc_code *b;
 	  gfc_actual_arglist *a;
 	  gfc_code *co;
+	  gfc_association_list *alist;
 
 	  /* There might be statement insertions before the current code,
 	     which must not affect the expression walker.  */
@@ -1151,6 +1157,13 @@  gfc_code_walker (gfc_code **c, walk_code_fn_t code
 
 	  switch (co->op)
 	    {
+
+	    case EXEC_BLOCK:
+	      WALK_SUBCODE (co->ext.block.ns->code);
+	      for (alist = co->ext.block.assoc; alist; alist = alist->next)
+		WALK_SUBEXPR (alist->target);
+	      break;
+
 	    case EXEC_DO:
 	      WALK_SUBEXPR (co->ext.iterator->var);
 	      WALK_SUBEXPR (co->ext.iterator->start);