[PATCH] Fix bug in uniquify_nodes reorg

Richard Guenther rguenther@suse.de
Thu May 26 15:59:00 GMT 2011


I merged one if too eagerly, resulting in not fixing up the
cache for merged types.  Oops.

LTO bootstrapped on x86_64-unknown-linux-gnu, testing and SPEC2k6
build in progress.

Richard.

2011-05-26  Richard Guenther  <rguenther@suse.de>

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

Index: gcc/lto/lto.c
===================================================================
--- gcc/lto/lto.c	(revision 174269)
+++ gcc/lto/lto.c	(working copy)
@@ -610,33 +610,36 @@ uniquify_nodes (struct data_in *data_in,
 	    }
 	}
 
-      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)



More information about the Gcc-patches mailing list