[gfortran] patch for pr 21130 - 38822 lines of Fortran 90 takes more than 10 minutes to compile on a dual 3GHz P4 Linux box with lots of RAM

Paul Thomas paulthomas2@wanadoo.fr
Wed Mar 29 07:02:00 GMT 2006


Bud,

>changelog and patch attached.
>
>  
>
OK for trunk and 4.1.

That's brilliant!  I can only say that I am a bit ashamed of the time 
that I spent looking at that bit of code without realising that there is 
such a time penalty involved.  I have just a couple of minor points on 
the patch.

Thanks

Paul

>------------------------------------------------------------------------
>
>Index: gcc/gcc/fortran/module.c
>===================================================================
>--- gcc/gcc/fortran/module.c	(revision 112482)
>+++ gcc/gcc/fortran/module.c	(working copy)
>@@ -3052,26 +3052,27 @@
> }
> 
> /* Recursive function to traverse the pointer_info tree and load a
>-   needed symbol.  We return nonzero if we load a symbol and stop the
>-   traversal, because the act of loading can alter the tree.  */
>+   needed symbol. Because the act of loading can alter the tree, we
>+   keep a count of all possible symbols to deal with.  */
>  
>
Because the act of loading can alter the tree, we return the number of 
loads that were made.

> 
>-static int
>-load_needed (pointer_info * p)
>+static void
>+load_needed (pointer_info * p, int * symbols_remaining)
>  
>
Shouldn't this be symbols_loaded, rather than symbols remaining??

> {
>   gfc_namespace *ns;
>   pointer_info *q;
>   gfc_symbol *sym;
> 
>   if (p == NULL)
>-    return 0;
>-  if (load_needed (p->left))
>-    return 1;
>-  if (load_needed (p->right))
>-    return 1;
>+    return ;
> 
>+  load_needed (p->left, symbols_remaining);
>+  load_needed (p->right, symbols_remaining);
>+
>   if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
>-    return 0;
>+    return ;
> 
>+  (*symbols_remaining)++;
>+
>   p->u.rsym.state = USED;
> 
>   set_module_locus (&p->u.rsym.where);
>@@ -3101,7 +3102,7 @@
>   mio_symbol (sym);
>   sym->attr.use_assoc = 1;
> 
>-  return 1;
>+  return ;
> }
> 
> 
>@@ -3155,6 +3156,7 @@
>   gfc_use_rename *u;
>   gfc_symtree *st;
>   gfc_symbol *sym;
>+  int symbols_remaining;
> 
>   get_module_locus (&operator_interfaces);	/* Skip these for now */
>   skip_list ();
>@@ -3323,7 +3325,12 @@
>      been loaded yet.  If one symbol requires another, the other gets
>      marked as NEEDED if its previous state was UNUSED.  */
>  
>
Thus, we keep on traversing the tree until no more symbols are loaded.

> 
>-  while (load_needed (pi_root));
>+  do 
>+    { 
>+       symbols_remaining = 0;
>+       load_needed (pi_root, &symbols_remaining);
>+    }
>+  while (symbols_remaining > 0);
> 
>   /* Make sure all elements of the rename-list were found in the
>      module.  */
>  
>




More information about the Fortran mailing list