+2011-05-19 Richard Guenther <rguenther@suse.de>
+
+ * gimple.c (gimple_types_compatible_p_1): Compare names of
+ the types themselves.
+ (iterative_hash_gimple_type): And hash them that way.
+ (gimple_register_type_1): If we register a main variant properly
+ initialize the leader to ourselves.
+
2011-05-19 Tom de Vries <tom@codesourcery.com>
PR target/45098
tree f1, f2;
/* The struct tags shall compare equal. */
- if (!compare_type_names_p (TYPE_MAIN_VARIANT (t1),
- TYPE_MAIN_VARIANT (t2), false))
+ if (!compare_type_names_p (t1, t2, false))
goto different_types;
/* For aggregate types, all the fields must be the same. */
unsigned nf;
tree f;
- v = iterative_hash_name (TYPE_NAME (TYPE_MAIN_VARIANT (type)), v);
+ v = iterative_hash_name (TYPE_NAME (type), v);
for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
{
{
void **slot;
gimple_type_leader_entry *leader;
- tree mv_leader = NULL_TREE;
+ tree mv_leader;
/* If we registered this type before return the cached result. */
leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
It also makes sure that main variants will be merged to main variants.
As we are operating on a possibly partially fixed up type graph
do not bother to recurse more than once, otherwise we may end up
- walking in circles. */
+ walking in circles.
+ If we are registering a main variant it will either remain its
+ own main variant or it will be merged to something else in which
+ case we do not care for the main variant leader. */
if (!registering_mv
&& TYPE_MAIN_VARIANT (t) != t)
mv_leader = gimple_register_type_1 (TYPE_MAIN_VARIANT (t), true);
+ else
+ mv_leader = t;
slot = htab_find_slot (gimple_types, t, INSERT);
if (*slot
struct lto_streamer_cache_d *cache = data_in->reader_cache;
unsigned len = VEC_length (tree, cache->nodes);
unsigned i;
+
+ /* Go backwards because childs streamed for the first time come
+ as part of their parents, and hence are created after them. */
+ for (i = len; i-- > from;)
+ {
+ tree t = VEC_index (tree, cache->nodes, i);
+ if (!t)
+ continue;
+
+ /* Now try to find a canonical variant of T itself. */
+ if (TYPE_P (t))
+ gimple_register_type (t);
+ }
+
/* Go backwards because childs streamed for the first time come
as part of their parents, and hence are created after them. */
for (i = len; i-- > from;)