aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2019-04-06 22:10:28 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2019-04-06 22:10:28 +0000
commitb81f7b83631be7dedcdcf44eed6dd575ada3ac23 (patch)
tree7bc7716412e765e98c5dbc22808a8b12304c7246
parent2955784caf887cbc6949b766bc38d6f9e0f3fc48 (diff)
downloadgcc-b81f7b83631be7dedcdcf44eed6dd575ada3ac23.zip
gcc-b81f7b83631be7dedcdcf44eed6dd575ada3ac23.tar.gz
gcc-b81f7b83631be7dedcdcf44eed6dd575ada3ac23.tar.bz2
re PR fortran/87352 (Large stack usage with new gfortran)
2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/87352 * gfortran.h (gfc_component): Add finalized field. * class.c (finalize_component): If the component is already finalized, return early. Set component->finalized on exit. 2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/87352 * gfortran.dg/finalize_28.f90: Adjust count of __builtin_free. * gfortran.dg/finalize_33.f90: Likewise. * gfortran.dg/finalize_34.f90: New test. From-SVN: r270184
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/class.c4
-rw-r--r--gcc/fortran/gfortran.h1
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/finalize_28.f902
-rw-r--r--gcc/testsuite/gfortran.dg/finalize_33.f902
-rw-r--r--gcc/testsuite/gfortran.dg/finalize_34.f9025
7 files changed, 46 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ca17280..563ef9d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org>
+ PR fortran/87352
+ * gfortran.h (gfc_component): Add finalized field.
+ * class.c (finalize_component): If the component is already
+ finalized, return early. Set component->finalized on exit.
+
+2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org>
+
PR fortran/89981
* resolve.c (resolve_global_procedure): If the global symbol is an
ENTRY, also look up its name among the entries.
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 3f23556..8a1f43f 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -911,6 +911,9 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
if (!comp_is_finalizable (comp))
return;
+ if (comp->finalized)
+ return;
+
e = gfc_copy_expr (expr);
if (!e->ref)
e->ref = ref = gfc_get_ref ();
@@ -1038,6 +1041,7 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
sub_ns);
gfc_free_expr (e);
}
+ comp->finalized = true;
}
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index caf5e52..be975cd 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1094,6 +1094,7 @@ typedef struct gfc_component
struct gfc_typebound_proc *tb;
/* When allocatable/pointer and in a coarray the associated token. */
tree caf_token;
+ bool finalized;
}
gfc_component;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2c8de7a..4208625 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org>
+ PR fortran/87352
+ * gfortran.dg/finalize_28.f90: Adjust count of __builtin_free.
+ * gfortran.dg/finalize_33.f90: Likewise.
+ * gfortran.dg/finalize_34.f90: New test.
+
+2019-04-06 Thomas Koenig <tkoenig@gcc.gnu.org>
+
PR fortran/89981
* gfortran.dg/entry_22.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/finalize_28.f90 b/gcc/testsuite/gfortran.dg/finalize_28.f90
index f0c9665..597413b 100644
--- a/gcc/testsuite/gfortran.dg/finalize_28.f90
+++ b/gcc/testsuite/gfortran.dg/finalize_28.f90
@@ -21,4 +21,4 @@ contains
integer, intent(out) :: edges(:,:)
end subroutine coo_dump_edges
end module coo_graphs
-! { dg-final { scan-tree-dump-times "__builtin_free" 6 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_free" 5 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/finalize_33.f90 b/gcc/testsuite/gfortran.dg/finalize_33.f90
index 3857e44..2205f9e 100644
--- a/gcc/testsuite/gfortran.dg/finalize_33.f90
+++ b/gcc/testsuite/gfortran.dg/finalize_33.f90
@@ -116,4 +116,4 @@ contains
! (iii) mci_template
end program main_ut
! { dg-final { scan-tree-dump-times "__builtin_malloc" 17 "original" } }
-! { dg-final { scan-tree-dump-times "__builtin_free" 20 "original" } }
+! { dg-final { scan-tree-dump-times "__builtin_free" 19 "original" } }
diff --git a/gcc/testsuite/gfortran.dg/finalize_34.f90 b/gcc/testsuite/gfortran.dg/finalize_34.f90
new file mode 100644
index 0000000..e2f02a5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/finalize_34.f90
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+! PR 87352 - this used to cause an excessive number of deallocations.
+module testmodule
+ implicit none
+ public
+
+ type :: evtlist_type
+ real, allocatable, dimension(:) :: p1
+ real, allocatable, dimension(:) :: p2
+ real, allocatable, dimension(:) :: p3
+ real, allocatable, dimension(:) :: p4
+ end type evtlist_type
+
+ type :: evtlistlist_type
+ type(evtlist_type) :: evtlist(1:1)
+ end type evtlistlist_type
+
+end module testmodule
+
+program main
+ use testmodule
+ type(evtlist_type), dimension(10) :: a
+end program main
+! { dg-final { scan-tree-dump-times "__builtin_free" 8 "original" } }