This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[ppc bootstrap] Check all hard regs of a wide mode in one more place
- From: Alexander Monakov <amonakov at ispras dot ru>
- To: gcc-patches at gcc dot gnu dot org
- Cc: abel at ispras dot ru, vmakarov at redhat dot com, Alexander Monakov <amonakov at ispras dot ru>
- Date: Wed, 30 Dec 2009 19:33:51 +0300
- Subject: [ppc bootstrap] Check all hard regs of a wide mode in one more place
- References: <4B3B7703.1070409@ispras.ru>
When applying renaming, we have to choose a register which is used in the
function, but which is not live on all code motion paths. However, there are additional
complications for modes that occupy more than one hard register (as indicated
by hard_regno_nregs). The loop over all hard registers was missing in choose_best_reg_1,
which is fixed by the patch.
2009-12-30 Alexander Monakov <amonakov@ispras.ru>
* sel-sched.c (choose_best_reg_1): Loop over all regs for mode.
---
gcc/sel-sched.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 01e51ba..ce55aec 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -1429,6 +1429,16 @@ choose_best_reg_1 (HARD_REG_SET hard_regs_used,
0, cur_reg, hrsi)
if (! TEST_HARD_REG_BIT (hard_regs_used, cur_reg))
{
+ /* Check that all hard regs for mode are available. */
+ for (i = 1, n = hard_regno_nregs[cur_reg][mode]; i < n; i++)
+ if (TEST_HARD_REG_BIT (hard_regs_used, cur_reg + i)
+ || !TEST_HARD_REG_BIT (reg_rename_p->available_for_renaming,
+ cur_reg + i))
+ break;
+
+ if (i < n)
+ continue;
+
/* All hard registers are available. */
if (best_new_reg < 0
|| reg_rename_tick[cur_reg] < reg_rename_tick[best_new_reg])
@@ -1460,6 +1470,7 @@ choose_best_reg (HARD_REG_SET hard_regs_used, struct reg_rename *reg_rename_p,
rtx best_reg = choose_best_reg_1 (hard_regs_used, reg_rename_p,
original_insns, is_orig_reg_p_ptr);
+ /* FIXME loop over hard_regno_nregs here. */
gcc_assert (best_reg == NULL_RTX
|| TEST_HARD_REG_BIT (sel_hrd.regs_ever_used, REGNO (best_reg)));
--
1.6.4.3