Commit 31b3ca64 by Richard Guenther Committed by Richard Biener

gimple.c (gimple_types_compatible_p_1): Compare names of the types themselves.

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.

	lto/
	* lto.c (uniquify_nodes): First register all types before
	fixing up the tree SCC.

From-SVN: r173900
parent f263981a
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> 2011-05-19 Tom de Vries <tom@codesourcery.com>
PR target/45098 PR target/45098
......
...@@ -3824,8 +3824,7 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p, ...@@ -3824,8 +3824,7 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
tree f1, f2; tree f1, f2;
/* The struct tags shall compare equal. */ /* The struct tags shall compare equal. */
if (!compare_type_names_p (TYPE_MAIN_VARIANT (t1), if (!compare_type_names_p (t1, t2, false))
TYPE_MAIN_VARIANT (t2), false))
goto different_types; goto different_types;
/* For aggregate types, all the fields must be the same. */ /* For aggregate types, all the fields must be the same. */
...@@ -4202,7 +4201,7 @@ iterative_hash_gimple_type (tree type, hashval_t val, ...@@ -4202,7 +4201,7 @@ iterative_hash_gimple_type (tree type, hashval_t val,
unsigned nf; unsigned nf;
tree f; 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)) for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
{ {
...@@ -4503,7 +4502,7 @@ gimple_register_type_1 (tree t, bool registering_mv) ...@@ -4503,7 +4502,7 @@ gimple_register_type_1 (tree t, bool registering_mv)
{ {
void **slot; void **slot;
gimple_type_leader_entry *leader; gimple_type_leader_entry *leader;
tree mv_leader = NULL_TREE; tree mv_leader;
/* If we registered this type before return the cached result. */ /* If we registered this type before return the cached result. */
leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE]; leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
...@@ -4516,10 +4515,15 @@ gimple_register_type_1 (tree t, bool registering_mv) ...@@ -4516,10 +4515,15 @@ gimple_register_type_1 (tree t, bool registering_mv)
It also makes sure that main variants will be merged to main variants. 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 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 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 if (!registering_mv
&& TYPE_MAIN_VARIANT (t) != t) && TYPE_MAIN_VARIANT (t) != t)
mv_leader = gimple_register_type_1 (TYPE_MAIN_VARIANT (t), true); mv_leader = gimple_register_type_1 (TYPE_MAIN_VARIANT (t), true);
else
mv_leader = t;
slot = htab_find_slot (gimple_types, t, INSERT); slot = htab_find_slot (gimple_types, t, INSERT);
if (*slot if (*slot
......
2011-05-19 Richard Guenther <rguenther@suse.de>
* lto.c (uniquify_nodes): First register all types before
fixing up the tree SCC.
2011-05-11 Jan Hubicka <jh@suse.cz> 2011-05-11 Jan Hubicka <jh@suse.cz>
PR lto/48952 PR lto/48952
......
...@@ -605,6 +605,20 @@ uniquify_nodes (struct data_in *data_in, unsigned from) ...@@ -605,6 +605,20 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
struct lto_streamer_cache_d *cache = data_in->reader_cache; struct lto_streamer_cache_d *cache = data_in->reader_cache;
unsigned len = VEC_length (tree, cache->nodes); unsigned len = VEC_length (tree, cache->nodes);
unsigned i; 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 /* Go backwards because childs streamed for the first time come
as part of their parents, and hence are created after them. */ as part of their parents, and hence are created after them. */
for (i = len; i-- > from;) for (i = len; i-- > from;)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment