aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2011-12-12 20:51:16 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2011-12-12 20:51:16 +0000
commit9c3b03463a63d80970178d7df77bb36e19ee9e0b (patch)
treed2749a25b5b9e15e38600edea42e404451d98329
parent35a730f86f0167a0160b20e5b9e25f7efb5108d7 (diff)
downloadgcc-9c3b03463a63d80970178d7df77bb36e19ee9e0b.zip
gcc-9c3b03463a63d80970178d7df77bb36e19ee9e0b.tar.gz
gcc-9c3b03463a63d80970178d7df77bb36e19ee9e0b.tar.bz2
re PR rtl-optimization/21617 (CRC64 algorithm optimization problem on Intel 32-bit)
2011-12-12 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/21617 * ira-color.c (bucket_allocno_compare_func): Don't compare allocno classes. Compare number of hard registers needed. From-SVN: r182263
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-color.c10
2 files changed, 14 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0d1dea3..9de9571 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-12-12 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/21617
+ * ira-color.c (bucket_allocno_compare_func): Don't compare
+ allocno classes. Compare number of hard registers needed.
+
2011-12-12 Eric Botcazou <ebotcazou@adacore.com>
PR tree-optimization/50569
diff --git a/gcc/ira-color.c b/gcc/ira-color.c
index 1c03a4a..92f68bf 100644
--- a/gcc/ira-color.c
+++ b/gcc/ira-color.c
@@ -1797,8 +1797,14 @@ bucket_allocno_compare_func (const void *v1p, const void *v2p)
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;
-
- if ((diff = (int) ALLOCNO_CLASS (a2) - ALLOCNO_CLASS (a1)) != 0)
+ int cl1 = ALLOCNO_CLASS (a1), cl2 = ALLOCNO_CLASS (a2);
+
+ /* 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);