Patchwork Fix WHOPR partitioning WRT whole unit size

login
register
mail settings
Submitter Jan Hubicka
Date Oct. 8, 2010, 12:52 a.m.
Message ID <20101008005204.GI5152@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/67123/
State New
Headers show

Comments

Jan Hubicka - Oct. 8, 2010, 12:52 a.m.
Hi,
lto_balanced_map accounts incorrectly whole unit size that makes it to get into
negative size after some while that leads it to produce a new partition for every function.
This blats streaming off the space and size that happens for some of spec2006 benchmarks.
Fixed thus.
I went ahead and comitted it as obvious, so the testers are not affected for too long.
Bootstrapped/regtested x86_64-linux.

Honza

	* lto.c (lto_balanced_map): Fix account of whole unit size.

Patch

Index: lto.c
===================================================================
--- lto.c	(revision 165138)
+++ lto.c	(working copy)
@@ -995,7 +991,7 @@ 
   struct cgraph_node **order = XNEWVEC (struct cgraph_node *, cgraph_max_uid);
   int i, postorder_len;
   struct cgraph_node *node;
-  int total_size = 0;
+  int total_size = 0, best_total_size = 0;
   int partition_size;
   ltrans_partition partition;
   unsigned int last_visited_cgraph_node = 0, last_visited_varpool_node = 0;
@@ -1017,7 +1013,7 @@ 
       if (partition_cgraph_node_p (node))
 	{
 	  order[n_nodes++] = node;
-          total_size += node->local.inline_summary.self_size;
+          total_size += node->global.size;
 	}
     }
   free (postorder);
@@ -1035,6 +1031,7 @@ 
   for (i = 0; i < n_nodes; i++)
     {
       add_cgraph_node_to_partition (partition, order[i]);
+      total_size -= order[i]->global.size;
 
       /* Once we added a new node to the partition, we also want to add
          all referenced variables unless they was already added into some
@@ -1069,7 +1066,6 @@ 
 				last_visited_cgraph_node);
 	      refs = &node->ref_list;
 
-	      total_size -= node->local.inline_summary.self_size;
 	      last_visited_cgraph_node++;
 
 	      gcc_assert (node->analyzed);
@@ -1195,6 +1191,7 @@ 
 				     partition->cgraph_set->nodes);
 	  best_n_varpool_nodes = VEC_length (varpool_node_ptr,
 					     partition->varpool_set->nodes);
+	  best_total_size = total_size;
 	}
       if (cgraph_dump_file)
 	fprintf (cgraph_dump_file, "Step %i: added %s, size %i, cost %i/%i best %i/%i, step %i\n", i,
@@ -1218,6 +1215,7 @@ 
 	  partition = new_partition ("");
 	  last_visited_cgraph_node = 0;
 	  last_visited_varpool_node = 0;
+	  total_size = best_total_size;
 	  cost = 0;
 
 	  if (cgraph_dump_file)