aboutsummaryrefslogtreecommitdiff
path: root/gcc/ira-costs.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2010-05-20 22:49:07 +0000
committerJeff Law <law@gcc.gnu.org>2010-05-20 16:49:07 -0600
commit0583835c7dac1e94dce3c6f83fdf3ba7c1a2ec7c (patch)
treead5c9a81fe8ced03d64f7354f5cdb7c56da2c287 /gcc/ira-costs.c
parent882b3d5c2e3be0b367f0eb9a9b94a99a1e22c60a (diff)
downloadgcc-0583835c7dac1e94dce3c6f83fdf3ba7c1a2ec7c.zip
gcc-0583835c7dac1e94dce3c6f83fdf3ba7c1a2ec7c.tar.gz
gcc-0583835c7dac1e94dce3c6f83fdf3ba7c1a2ec7c.tar.bz2
ira.c (ira_non_ordered_class_hard_regs): Define.
* ira.c (ira_non_ordered_class_hard_regs): Define. (setup_class_hard_regs): Initialize ira_non_ordered_class_hard_regs. * ira-int.h (ira_non_ordered_class_hard_regs): Declare. * ira-costs.c (ira_tune_allocno_costs_and_cover_classes): Increase cost of unaligned hard regs when allocating multi-reg pseudos. From-SVN: r159644
Diffstat (limited to 'gcc/ira-costs.c')
-rw-r--r--gcc/ira-costs.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 76aadff..6942931 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -1773,5 +1773,32 @@ ira_tune_allocno_costs_and_cover_classes (void)
}
if (min_cost != INT_MAX)
ALLOCNO_COVER_CLASS_COST (a) = min_cost;
+
+ /* Some targets allow pseudos to be allocated to unaligned
+ sequences of hard registers. However, selecting an unaligned
+ sequence can unnecessarily restrict later allocations. So
+ increase the cost of unaligned hard regs to encourage the use
+ of aligned hard regs. */
+ {
+ int nregs, index;
+
+ if ((nregs = ira_reg_class_nregs[cover_class][ALLOCNO_MODE (a)]) > 1)
+ {
+ ira_allocate_and_set_costs
+ (&ALLOCNO_HARD_REG_COSTS (a), cover_class,
+ ALLOCNO_COVER_CLASS_COST (a));
+ reg_costs = ALLOCNO_HARD_REG_COSTS (a);
+ for (j = n - 1; j >= 0; j--)
+ {
+ if (j % nregs != 0)
+ {
+ regno = ira_non_ordered_class_hard_regs[cover_class][j];
+ index = ira_class_hard_reg_index[cover_class][regno];
+ ira_assert (index != 0);
+ reg_costs[index] += ALLOCNO_FREQ (a);
+ }
+ }
+ }
+ }
}
}