Empty LTO partition fix

Jan Hubicka hubicka@ucw.cz
Sat Jun 18 12:42:00 GMT 2011


Hi,
the empty partitions gets created when node gets assigned to earlier
partition.  This happens for thunks, aliases and partitioned comdats.
Hope this will fix all occurences of the problem.

Bootstrapped/regtested x86_64-linux

Honza

	PR lto/23754
	* lto.c (lto_1_to_1_map): Don't create empty partitions.
	(lto_balanced_map): Likewise.

Index: lto.c
===================================================================
*** lto.c	(revision 175166)
--- lto.c	(working copy)
*************** lto_1_to_1_map (void)
*** 1516,1522 ****
  
    for (node = cgraph_nodes; node; node = node->next)
      {
!       if (!partition_cgraph_node_p (node))
  	continue;
  
        file_data = node->local.lto_file_data;
--- 1516,1523 ----
  
    for (node = cgraph_nodes; node; node = node->next)
      {
!       if (!partition_cgraph_node_p (node)
! 	  || node->aux)
  	continue;
  
        file_data = node->local.lto_file_data;
*************** lto_1_to_1_map (void)
*** 1545,1557 ****
  	  npartitions++;
  	}
  
!       if (!node->aux)
!         add_cgraph_node_to_partition (partition, node);
      }
  
    for (vnode = varpool_nodes; vnode; vnode = vnode->next)
      {
!       if (!partition_varpool_node_p (vnode))
  	continue;
        file_data = vnode->lto_file_data;
        slot = pointer_map_contains (pmap, file_data);
--- 1546,1558 ----
  	  npartitions++;
  	}
  
!       add_cgraph_node_to_partition (partition, node);
      }
  
    for (vnode = varpool_nodes; vnode; vnode = vnode->next)
      {
!       if (!partition_varpool_node_p (vnode)
! 	  || vnode->aux)
  	continue;
        file_data = vnode->lto_file_data;
        slot = pointer_map_contains (pmap, file_data);
*************** lto_1_to_1_map (void)
*** 1565,1572 ****
  	  npartitions++;
  	}
  
!       if (!vnode->aux)
!         add_varpool_node_to_partition (partition, vnode);
      }
    for (node = cgraph_nodes; node; node = node->next)
      node->aux = NULL;
--- 1566,1572 ----
  	  npartitions++;
  	}
  
!       add_varpool_node_to_partition (partition, vnode);
      }
    for (node = cgraph_nodes; node; node = node->next)
      node->aux = NULL;
*************** lto_balanced_map (void)
*** 1675,1682 ****
  
    for (i = 0; i < n_nodes; i++)
      {
!       if (!order[i]->aux)
!         add_cgraph_node_to_partition (partition, order[i]);
        total_size -= inline_summary (order[i])->size;
  
        /* Once we added a new node to the partition, we also want to add
--- 1675,1683 ----
  
    for (i = 0; i < n_nodes; i++)
      {
!       if (order[i]->aux)
! 	continue;
!       add_cgraph_node_to_partition (partition, order[i]);
        total_size -= inline_summary (order[i])->size;
  
        /* Once we added a new node to the partition, we also want to add
*************** lto_balanced_map (void)
*** 1856,1861 ****
--- 1857,1864 ----
  	    }
  	  i = best_i;
   	  /* When we are finished, avoid creating empty partition.  */
+ 	  while (i < n_nodes - 1 && order[i + 1]->aux)
+ 	    i++;
  	  if (i == n_nodes - 1)
  	    break;
  	  partition = new_partition ("");



More information about the Gcc-patches mailing list