From 2092de0642f48458576e6f34c5f48f55a378c58f Mon Sep 17 00:00:00 2001 From: mikael Date: Thu, 3 Nov 2011 22:50:06 +0000 Subject: [PATCH] * trans.h (struct gfc_ss_info): New field refcount. * trans-array.c (free_ss_info): Decrement refcount. Return early if still non-zero. (gfc_get_array_ss, gfc_get_temp_ss, gfc_get_scalar_ss): Increment refcount. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180883 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/trans-array.c | 8 ++++++++ gcc/fortran/trans.h | 1 + 3 files changed, 17 insertions(+) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9b07f76723f..d014b9d97db 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,13 @@ 2011-11-03 Mikael Morin + * trans.h (struct gfc_ss_info): New field refcount. + * trans-array.c (free_ss_info): Decrement refcount. Return early if + still non-zero. + (gfc_get_array_ss, gfc_get_temp_ss, gfc_get_scalar_ss): Increment + refcount. + +2011-11-03 Mikael Morin + * trans-array.c (gfc_trans_create_temp_array): Move invariant condition out of the containing loop. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 663d12e6e69..abb6db2a97f 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -489,6 +489,11 @@ gfc_free_ss_chain (gfc_ss * ss) static void free_ss_info (gfc_ss_info *ss_info) { + ss_info->refcount--; + if (ss_info->refcount > 0) + return; + + gcc_assert (ss_info->refcount == 0); free (ss_info); } @@ -532,6 +537,7 @@ gfc_get_array_ss (gfc_ss *next, gfc_expr *expr, int dimen, gfc_ss_type type) int i; ss_info = gfc_get_ss_info (); + ss_info->refcount++; ss_info->type = type; ss_info->expr = expr; @@ -556,6 +562,7 @@ gfc_get_temp_ss (tree type, tree string_length, int dimen) int i; ss_info = gfc_get_ss_info (); + ss_info->refcount++; ss_info->type = GFC_SS_TEMP; ss_info->string_length = string_length; ss_info->data.temp.type = type; @@ -580,6 +587,7 @@ gfc_get_scalar_ss (gfc_ss *next, gfc_expr *expr) gfc_ss_info *ss_info; ss_info = gfc_get_ss_info (); + ss_info->refcount++; ss_info->type = GFC_SS_SCALAR; ss_info->expr = expr; diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index c35b1ae0fda..02f2b422f07 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -185,6 +185,7 @@ gfc_ss_type; typedef struct gfc_ss_info { + int refcount; gfc_ss_type type; gfc_expr *expr; tree string_length; -- 2.11.0