gimple.c (gimple_types_compatible_p_1): Compare names of the types themselves.
authorRichard Guenther <rguenther@suse.de>
Thu, 19 May 2011 10:31:23 +0000 (10:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 19 May 2011 10:31:23 +0000 (10:31 +0000)
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

gcc/ChangeLog
gcc/gimple.c
gcc/lto/ChangeLog
gcc/lto/lto.c

index a22cc926bdd972b36986da38a4ac6b0dde0aba0e..a653ae8442f22bde80efa7315098e29c1e0fd63a 100644 (file)
@@ -1,3 +1,11 @@
+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
index 3bf369add074ca5ddee5572b5210a615eaf5e5ff..e4c318f9e8a3d7b899275a151c486a97a78c5348 100644 (file)
@@ -3824,8 +3824,7 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
        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.  */
@@ -4202,7 +4201,7 @@ iterative_hash_gimple_type (tree type, hashval_t val,
       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))
        {
@@ -4503,7 +4502,7 @@ gimple_register_type_1 (tree t, bool registering_mv)
 {
   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];
@@ -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.
      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
index 7f10bfbf7ae2237cd4b86dfe66d0323b0bbdc1ed..79e0146694d549bb9ad380cc01f192c6f6e1b997 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        PR lto/48952
index ce72711f99f071b3c9ea819aee75895fb89b35af..67e080f8389618eb94bc252c5426bc3a0368af65 100644 (file)
@@ -605,6 +605,20 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
   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;)