diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-08-24 22:35:55 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-08-24 22:35:55 +0000 |
commit | 0cc10fd32985e2c604c4e0fdd10af4554f759b36 (patch) | |
tree | e86a9635ca292ea67589cef742a73eea422d2d19 /gcc/resource.c | |
parent | 131872590b7c1c8f0cef6ec3dccc4bb8279dc351 (diff) | |
download | gcc-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.c | 56 |
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; +} |