aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-05-03 11:48:07 +0200
committerRichard Biener <rguenther@suse.de>2024-05-03 13:01:10 +0200
commit7a212ac678e13e0df5da2d090144b246a1262b64 (patch)
treedcdc4f360787d7c8a3aa7e40aba335f48e1ff4b4
parentfe40d525619eee9c2821126390df75068df4773a (diff)
downloadgcc-7a212ac678e13e0df5da2d090144b246a1262b64.zip
gcc-7a212ac678e13e0df5da2d090144b246a1262b64.tar.gz
gcc-7a212ac678e13e0df5da2d090144b246a1262b64.tar.bz2
Avoid changing type in the type_hash_canon hash
When building a type and type_hash_canon returns an existing type avoid changing it, in particular its TYPE_CANONICAL. PR middle-end/114931 * tree.cc (build_array_type_1): Return early when type_hash_canon returned an older existing type. (build_function_type): Likewise. (build_method_type_directly): Likewise. (build_offset_type): Likewise.
-rw-r--r--gcc/tree.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 83f3bf3..7806625 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -7352,7 +7352,10 @@ build_array_type_1 (tree elt_type, tree index_type, bool typeless_storage,
if (shared)
{
hashval_t hash = type_hash_canon_hash (t);
+ tree probe_type = t;
t = type_hash_canon (hash, t);
+ if (t != probe_type)
+ return t;
}
if (TYPE_CANONICAL (t) == t && set_canonical)
@@ -7509,7 +7512,10 @@ build_function_type (tree value_type, tree arg_types,
/* If we already have such a type, use the old one. */
hashval_t hash = type_hash_canon_hash (t);
+ tree probe_type = t;
t = type_hash_canon (hash, t);
+ if (t != probe_type)
+ return t;
/* Set up the canonical type. */
any_structural_p = TYPE_STRUCTURAL_EQUALITY_P (value_type);
@@ -7663,7 +7669,10 @@ build_method_type_directly (tree basetype,
/* If we already have such a type, use the old one. */
hashval_t hash = type_hash_canon_hash (t);
+ tree probe_type = t;
t = type_hash_canon (hash, t);
+ if (t != probe_type)
+ return t;
/* Set up the canonical type. */
any_structural_p
@@ -7720,7 +7729,10 @@ build_offset_type (tree basetype, tree type)
/* If we already have such a type, use the old one. */
hashval_t hash = type_hash_canon_hash (t);
+ tree probe_type = t;
t = type_hash_canon (hash, t);
+ if (t != probe_type)
+ return t;
if (!COMPLETE_TYPE_P (t))
layout_type (t);