lto.c (uniquify_nodes): Fix bug in one of the previous changes.
authorRichard Guenther <rguenther@suse.de>
Thu, 26 May 2011 15:53:23 +0000 (15:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 26 May 2011 15:53:23 +0000 (15:53 +0000)
2011-05-26  Richard Guenther  <rguenther@suse.de>

lto/
* lto.c (uniquify_nodes): Fix bug in one of the previous changes.

From-SVN: r174296

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

index aa8859c405d8c2f77b33bbf1db892436329d89e8..9412f76ae1d47b5de0867bfa7ceaebdd17fe6d5b 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-26  Richard Guenther  <rguenther@suse.de>
+
+       * lto.c (uniquify_nodes): Fix bug in one of the previous changes.
+
 2011-05-25  Nathan Froyd  <froydnj@codesourcery.com>
 
        * lto.c (lto_ft_typed): New function.
index 1067b51c9482bc436fd9fd53632156e4b79eb641..9d4e2edd250851ef98a4426d1e487783ab79a648 100644 (file)
@@ -610,33 +610,36 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
            }
        }
 
-      else if (RECORD_OR_UNION_TYPE_P (t))
+      else
        {
-         tree f1, f2;
-         if (TYPE_FIELDS (t) != TYPE_FIELDS (oldt))
-           for (f1 = TYPE_FIELDS (t), f2 = TYPE_FIELDS (oldt);
-                f1 && f2; f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
-             {
-               unsigned ix;
-               gcc_assert (f1 != f2 && DECL_NAME (f1) == DECL_NAME (f2));
-               if (!lto_streamer_cache_lookup (cache, f2, &ix))
-                 gcc_unreachable ();
-               /* If we're going to replace an element which we'd
-                  still visit in the next iterations, we wouldn't
-                  handle it, so do it here.  We do have to handle it
-                  even though the field_decl itself will be removed,
-                  as it could refer to e.g. integer_cst which we
-                  wouldn't reach via any other way, hence they
-                  (and their type) would stay uncollected.  */
-               /* ???  We should rather make sure to replace all
-                  references to f2 with f1.  That means handling
-                  COMPONENT_REFs and CONSTRUCTOR elements in
-                  lto_fixup_types and special-case the field-decl
-                  operand handling.  */
-               if (ix < i)
-                 lto_fixup_types (f2);
-               lto_streamer_cache_insert_at (cache, f1, ix);
-             }
+         if (RECORD_OR_UNION_TYPE_P (t))
+           {
+             tree f1, f2;
+             if (TYPE_FIELDS (t) != TYPE_FIELDS (oldt))
+               for (f1 = TYPE_FIELDS (t), f2 = TYPE_FIELDS (oldt);
+                    f1 && f2; f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
+                 {
+                   unsigned ix;
+                   gcc_assert (f1 != f2 && DECL_NAME (f1) == DECL_NAME (f2));
+                   if (!lto_streamer_cache_lookup (cache, f2, &ix))
+                     gcc_unreachable ();
+                   /* If we're going to replace an element which we'd
+                      still visit in the next iterations, we wouldn't
+                      handle it, so do it here.  We do have to handle it
+                      even though the field_decl itself will be removed,
+                      as it could refer to e.g. integer_cst which we
+                      wouldn't reach via any other way, hence they
+                      (and their type) would stay uncollected.  */
+                   /* ???  We should rather make sure to replace all
+                      references to f2 with f1.  That means handling
+                      COMPONENT_REFs and CONSTRUCTOR elements in
+                      lto_fixup_types and special-case the field-decl
+                      operand handling.  */
+                   if (ix < i)
+                     lto_fixup_types (f2);
+                   lto_streamer_cache_insert_at (cache, f1, ix);
+                 }
+           }
 
          /* If we found a tree that is equal to oldt replace it in the
             cache, so that further users (in the various LTO sections)