aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-05-05 09:35:13 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2017-05-05 09:35:13 +0200
commit56871768b4cf5c2fd82456e03ae2f83a9789d2fb (patch)
tree3931dd8a559a4ebe52383d293c6f640d81e3894d /gcc/tree.c
parent18c182ff7d54b3ca7bbaeb0a79dbd863a234b470 (diff)
downloadgcc-56871768b4cf5c2fd82456e03ae2f83a9789d2fb.zip
gcc-56871768b4cf5c2fd82456e03ae2f83a9789d2fb.tar.gz
gcc-56871768b4cf5c2fd82456e03ae2f83a9789d2fb.tar.bz2
tree.c (next_type_uid): Change type to unsigned.
* 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
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 3bc6f1c..b76b521 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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;
}