The following patch solves PR 21617 which is described on http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21617.

Just adding number of necessary hard registers solves the problem but creates 2% SPEC2000 perlbmk degradation on x86. Fortunately, removing allocno class comparison removes the degradation. The allocno class comparison was originally added for debugging purposes to put coloring of allocnos of the same class in one place. It was ok when we had cover classes which did not intersect. Now allocno classes intersect and this comparison should be not used (at least as highest priority heuristic).

Beside solving the problem, the patch improves a bit SPEC2000 performance and code size on x86.

The patch was successfully bootstrapped on x86/x86-64. I expect it should be pretty safe for other targets because it changes heuristics only.

Committed as rev. 182263.


2011-12-12  Vladimir Makarov <vmaka...@redhat.com>

        PR rtl-optimization/21617
        * ira-color.c (bucket_allocno_compare_func): Don't compare
        allocno classes.  Compare number of hard registers needed.

Index: ira-color.c
===================================================================
--- ira-color.c (revision 182262)
+++ ira-color.c (working copy)
@@ -1797,8 +1797,14 @@ bucket_allocno_compare_func (const void 
   ira_allocno_t a1 = *(const ira_allocno_t *) v1p;
   ira_allocno_t a2 = *(const ira_allocno_t *) v2p;
   int diff, a1_freq, a2_freq, a1_num, a2_num;
+  int cl1 = ALLOCNO_CLASS (a1), cl2 = ALLOCNO_CLASS (a2);
 
-  if ((diff = (int) ALLOCNO_CLASS (a2) - ALLOCNO_CLASS (a1)) != 0)
+  /* Push pseudos requiring less hard registers first.  It means that
+     we will assign pseudos requiring more hard registers first
+     avoiding creation small holes in free hard register file into
+     which the pseudos requiring more hard registers can not fit.  */
+  if ((diff = (ira_reg_class_max_nregs[cl1][ALLOCNO_MODE (a1)]
+              - ira_reg_class_max_nregs[cl2][ALLOCNO_MODE (a2)])) != 0)
     return diff;
   a1_freq = ALLOCNO_FREQ (a1);
   a2_freq = ALLOCNO_FREQ (a2);

Reply via email to