diff options
author | Richard Biener <rguenther@suse.de> | 2024-05-03 11:48:07 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-05-03 13:01:10 +0200 |
commit | 7a212ac678e13e0df5da2d090144b246a1262b64 (patch) | |
tree | dcdc4f360787d7c8a3aa7e40aba335f48e1ff4b4 | |
parent | fe40d525619eee9c2821126390df75068df4773a (diff) | |
download | gcc-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.cc | 12 |
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); |