tree.c (next_type_uid): Change type to unsigned.
authorJakub Jelinek <jakub@redhat.com>
Fri, 5 May 2017 07:35:13 +0000 (09:35 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 5 May 2017 07:35:13 +0000 (09:35 +0200)
* 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.

From-SVN: r247628

gcc/ChangeLog
gcc/tree.c

index fbb90a70f856b8292932f40698e6393f66e4b387..44df0d7ecddc4d0fa1317946806537d1ba3afa3c 100644 (file)
@@ -1,3 +1,11 @@
+2017-05-05  Jakub Jelinek  <jakub@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.
+
 2017-05-04  Martin Sebor  <msebor@redhat.com>
 
        * builtins.c: Fix a trivial typo in a comment.
index 3bc6f1c284d2e0ae6a1263adfbca512d50a0b99f..b76b521df61a4ce7bdbeaa1a6e76d01690c9ed8f 100644 (file)
@@ -151,7 +151,7 @@ static const char * const tree_node_kind_names[] = {
 /* 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,22 @@ type_hash_canon (unsigned int hashcode, tree type)
     {
       tree t1 = ((type_hash *) *loc)->type;
       gcc_assert (TYPE_MAIN_VARIANT (t1) == t1);
+      if (TYPE_UID (type) + 1 == next_type_uid)
+       --next_type_uid;
+      /* Free also min/max values and the cache for integer
+        types.  This can't be done in free_node, as LTO frees
+        those on its own.  */
+      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);
       return t1;
     }