This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix fortran creating a huge number of io transfer structs
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: fortran at gcc dot gnu dot org
- Date: Wed, 22 Feb 2006 16:49:28 +0100 (CET)
- Subject: [PATCH] Fix fortran creating a huge number of io transfer structs
Currently for code as simple as
PROGRAM test
WRITE(*,*) 'hello'
WRITE(*,*) 'world'
END
gfortran creates two struct __st_parameter_dt, one for each I/O operation.
This causes a _huge_ regression in compile time if we ever start to create
SFTs for those structs, as observed earlier and caused by the patch to
enable SFTs for structures containing arrays. This has been worked around
sofar, but there's no reason why gfortran cannot share one struct
__st_parameter_dt per function or at least one per sequence of I/O
operations. In fact, the simple patch below cut's down compile time
for channel.f90 from 11s to 2s (if the workaround is disabled).
I'm sure the fortran guys know a better way of keeping track of a
struct __st_parameter_dt in a function, so this is a heads-up, the
patch doesn't work in general as it messes up the scopes for the variable.
Thanks,
Richard.
2006-02-22 Richard Guenther <rguenther@suse.de>
* trans-io.c (build_dt): Try to re-use older dt_parm created
earlier for this function.
Index: trans-io.c
===================================================================
*** trans-io.c (revision 111363)
--- trans-io.c (working copy)
*************** Software Foundation, 51 Franklin Street,
*** 28,33 ****
--- 28,35 ----
#include "ggc.h"
#include "toplev.h"
#include "real.h"
+ #include "target.h"
+ #include "function.h"
#include "gfortran.h"
#include "trans.h"
#include "trans-stmt.h"
*************** build_dt (tree function, gfc_code * code
*** 1353,1366 ****
gfc_namelist *nml;
unsigned int mask = 0;
gfc_start_block (&block);
gfc_init_block (&post_block);
gfc_init_block (&post_end_block);
- var = gfc_create_var (st_parameter[IOPARM_ptype_dt].type, "dt_parm");
-
- set_error_locus (&block, var, &code->loc);
-
if (last_dt == IOLENGTH)
{
gfc_inquire *inq;
--- 1355,1374 ----
gfc_namelist *nml;
unsigned int mask = 0;
+ if (!dt_parm
+ || DECL_CONTEXT (dt_parm) != cfun->decl)
+ {
+ var = gfc_create_var (st_parameter[IOPARM_ptype_dt].type, "dt_parm");
+
+ set_error_locus (&block, var, &code->loc);
+ }
+ else
+ var = dt_parm;
+
gfc_start_block (&block);
gfc_init_block (&post_block);
gfc_init_block (&post_end_block);
if (last_dt == IOLENGTH)
{
gfc_inquire *inq;
*************** build_dt (tree function, gfc_code * code
*** 1477,1483 ****
gfc_add_expr_to_block (&block, gfc_trans_code (code->block->next));
- dt_parm = NULL;
dt_post_end_block = NULL;
return gfc_finish_block (&block);
--- 1485,1490 ----