On May 4, 2017 4:43:45 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >While type_hash_canon in case of reusing an already existing type >ggc_frees the freshly created type, we still waste one type uid >for each such case, this patch attempts to avoid that. >Furthermore, for INTEGER_TYPE we keep around the min and max value >INTEGER_CSTs and the cached values vector (until it is GCed). > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > >2017-05-04 Jakub Jelinek <ja...@redhat.com> > > * tree.c (next_type_uid): Change type to unsigned. > (type_hash_canon): Decrement back next_type_uid if > freeing a type node with the highest TYPE_UID. For INTEGER_TYPEs > also ggc_free TYPE_MIN_VALUE, TYPE_MAX_VALUE and TYPE_CACHED_VALUES > if possible. > >--- gcc/tree.c.jj 2017-05-03 16:55:39.688052581 +0200 >+++ gcc/tree.c 2017-05-03 18:49:30.662185944 +0200 >@@ -151,7 +151,7 @@ static const char * const tree_node_kind > /* Unique id for next decl created. */ > static GTY(()) int next_decl_uid; > /* Unique id for next type created. */ >-static GTY(()) int next_type_uid = 1; >+static GTY(()) unsigned next_type_uid = 1; > /* Unique id for next debug decl created. Use negative numbers, > to catch erroneous uses. */ > static GTY(()) int next_debug_decl_uid; >@@ -7188,6 +7188,19 @@ type_hash_canon (unsigned int hashcode, > { > tree t1 = ((type_hash *) *loc)->type; > gcc_assert (TYPE_MAIN_VARIANT (t1) == t1); >+ if (TYPE_UID (type) + 1 == next_type_uid) >+ --next_type_uid; >+ if (TREE_CODE (type) == INTEGER_TYPE) >+ { >+ if (TYPE_MIN_VALUE (type) >+ && TREE_TYPE (TYPE_MIN_VALUE (type)) == type) >+ ggc_free (TYPE_MIN_VALUE (type)); >+ if (TYPE_MAX_VALUE (type) >+ && TREE_TYPE (TYPE_MAX_VALUE (type)) == type) >+ ggc_free (TYPE_MAX_VALUE (type)); >+ if (TYPE_CACHED_VALUES_P (type)) >+ ggc_free (TYPE_CACHED_VALUES (type)); >+ } > free_node (type);
Shouldn't free_node handle this? That said, is freeing min/max safe? The constants are shared after all. Richard. > return t1; > } > > Jakub