summaryrefslogtreecommitdiff
path: root/gcc/resource.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-08-24 22:35:55 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-08-24 22:35:55 +0000
commit0cc10fd32985e2c604c4e0fdd10af4554f759b36 (patch)
treee86a9635ca292ea67589cef742a73eea422d2d19 /gcc/resource.c
parent131872590b7c1c8f0cef6ec3dccc4bb8279dc351 (diff)
downloadgcc-0cc10fd32985e2c604c4e0fdd10af4554f759b36.tar.gz
* haifa-sched.c (split_hard_reg_notes): Move to flow.c
(new_insn_dead_notes): Likewise. (update_n_sets): Likewise. (update_flow_info): Move to flow.c, renamed to update_life_info; extend to handle multiple source insns. * flow.c: Include resource.h (unlink_insn_chain): New. (split_hard_reg_notes): New. (maybe_add_dead_note): New. (maybe_add_dead_note_use): New. (find_insn_with_note): New. (new_insn_dead_notes): New. (update_n_sets): New. (sets_reg_or_subreg_1, sets_reg_or_subreg): New. (maybe_remove_dead_notes): New. (update_life_info): New. (prepend_reg_notes): New. (replace_insns): New. * output.h (update_life_info): Declare. * recog.c (split_block_insns): Use update_life_info. * resource.c (find_free_register): Use reg_alloc_order, don't use fixed regs, make sure the mode is supported, don't use new regs. (reg_dead_p): New. * rtl.h (replace_insns): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@28828 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/resource.c')
-rw-r--r--gcc/resource.c56
1 files changed, 48 insertions, 8 deletions
diff --git a/gcc/resource.c b/gcc/resource.c
index d200f30dfce..b310dd654d3 100644
--- a/gcc/resource.c
+++ b/gcc/resource.c
@@ -1264,14 +1264,33 @@ find_free_register (current_insn, class_str, mode, reg_set)
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{
- int success = 1;
+ int regno;
+ int success;
+
+#ifdef REG_ALLOC_ORDER
+ regno = reg_alloc_order [i];
+#else
+ regno = i;
+#endif
- if (! TEST_HARD_REG_BIT (reg_class_contents[class], i))
+ /* Don't allocate fixed registers. */
+ if (fixed_regs[regno])
+ continue;
+ /* Make sure the register is of the right class. */
+ if (! TEST_HARD_REG_BIT (reg_class_contents[class], regno))
+ continue;
+ /* And can support the mode we need. */
+ if (! HARD_REGNO_MODE_OK (regno, mode))
continue;
- for (j = HARD_REGNO_NREGS (i, mode) - 1; j >= 0; j--)
+ /* And that we don't create an extra save/restore. */
+ if (! call_used_regs[regno] && ! regs_ever_live[regno])
+ continue;
+
+ success = 1;
+ for (j = HARD_REGNO_NREGS (regno, mode) - 1; j >= 0; j--)
{
- if (TEST_HARD_REG_BIT (*reg_set, i + j)
- || TEST_HARD_REG_BIT (used.regs, i + j))
+ if (TEST_HARD_REG_BIT (*reg_set, regno + j)
+ || TEST_HARD_REG_BIT (used.regs, regno + j))
{
success = 0;
break;
@@ -1279,12 +1298,33 @@ find_free_register (current_insn, class_str, mode, reg_set)
}
if (success)
{
- for (j = HARD_REGNO_NREGS (i, mode) - 1; j >= 0; j--)
+ for (j = HARD_REGNO_NREGS (regno, mode) - 1; j >= 0; j--)
{
- SET_HARD_REG_BIT (*reg_set, i + j);
+ SET_HARD_REG_BIT (*reg_set, regno + j);
}
- return gen_rtx_REG (mode, i);
+ return gen_rtx_REG (mode, regno);
}
}
return NULL_RTX;
}
+
+/* Return true if REG is dead at CURRENT_INSN. */
+
+int
+reg_dead_p (current_insn, reg)
+ rtx current_insn, reg;
+{
+ struct resources used;
+ int regno, j;
+
+ mark_target_live_regs (get_insns (), current_insn, &used);
+
+ regno = REGNO (reg);
+ for (j = HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1; j >= 0; j--)
+ {
+ if (TEST_HARD_REG_BIT (used.regs, regno + j))
+ return 0;
+ }
+
+ return 1;
+}