Frederic Riss sent me IRA dump files for an in-house GCC back-end which helped to find a bug in coloring in presence of multi-register allocnos. The bug resulted in making allocno colorable too earlier and as a consequence in worse code. The problem was in preventing processing of all conflicting objects of an allocno although the impact of each object was taken as 1. It was my mistake in merging code for IRA coloring without cover classes and Bernd's work on multi-object allocnos.

The following patch changes SPEC2000 code on x86 (32-bit mode) for vpr, gcc, crafty, parser, and vortex and improves scores (up to 0.7% for crafty) and decrease code size (up to 0.5% for crafty) for these benchmarks. Frederic Riss also reported considerable improvements for his back-end.

The patch was successfully bootstrapped on x86/x86-64 and committed as rev. 185971.

2012-03-29  Vladimir Makarov <>

    * ira-color.c (setup_left_conflict_sizes_p): Process all
    conflicting objects.

Index: ira-color.c
--- ira-color.c	(revision 185967)
+++ ira-color.c	(working copy)
@@ -821,7 +821,6 @@ setup_left_conflict_sizes_p (ira_allocno
   node_preorder_num = node->preorder_num;
   COPY_HARD_REG_SET (node_set, node->hard_regs->set);
-  curr_allocno_process++;
   for (k = 0; k < nobj; k++)
       ira_object_t obj = ALLOCNO_OBJECT (a, k);
@@ -838,12 +837,10 @@ setup_left_conflict_sizes_p (ira_allocno
 	  conflict_data = ALLOCNO_COLOR_DATA (conflict_a);
 	  if (! ALLOCNO_COLOR_DATA (conflict_a)->in_graph_p
-	      || conflict_data->last_process == curr_allocno_process
 	      || ! hard_reg_set_intersect_p (profitable_hard_regs,
-	  conflict_data->last_process = curr_allocno_process;
 	  conflict_node = conflict_data->hard_regs_node;
 	  COPY_HARD_REG_SET (conflict_node_set, conflict_node->hard_regs->set);
 	  if (hard_reg_set_subset_p (node_set, conflict_node_set))

Reply via email to