aboutsummaryrefslogtreecommitdiff
path: root/gcc/global.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-12-15 14:57:29 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-12-15 14:57:29 +0000
commit285f3cf09acda794f6e7bba9cb6d5163c94b5af4 (patch)
tree004232333d701e94fd104742dbd3de8db91043a0 /gcc/global.c
parent4940cd6041eaa51d8a9bb245d7be26ac0b68187d (diff)
downloadgcc-285f3cf09acda794f6e7bba9cb6d5163c94b5af4.zip
gcc-285f3cf09acda794f6e7bba9cb6d5163c94b5af4.tar.gz
gcc-285f3cf09acda794f6e7bba9cb6d5163c94b5af4.tar.bz2
caller-save.c (insert_one_insn): Returns struct insn_chain *.
* caller-save.c (insert_one_insn): Returns struct insn_chain *. Handle live_throughout / dead_or_set instead of live_before / live_after. (save_call_clobbered_regs): Get register livenessinformation from chain->live_throughout. (add_stored_regs): New function. (insert_restore, insert_save): Add restored / saved registers to dead_or_set. * global.c (reg_dies): New parameter chain. (reg_becomes_live): Third parameter is regs_set now. Changed all callers. (reg_dies): New parameter chain. Changed all callers. (build_insn_chain): Set live_throughout instead of live_before / live_after. * reload.h (struct insn_chain): Replace members live_before / live_after with live_throughout / dead_or_set. * reload1.c (new_insn_chain): Handle live_throughout / dead_or_set instead of live_before / live_after. (maybe_fix_stack_asms, find_reload_regs, finish_spills): Likewise. (order_regs_for_reload, find_reg, finish_spills): Likewise. (choose_reload_regs_init): Likewise. * stupid.c (current_chain, find_clobbered_regs): Delete. (stupid_life_analysis): Set chain->live_throughout chain->dead_or_set instead of chain->live_before / chain->live_after. (mark_hard_ref): New function. (stupid_mark_refs): Call mark_hard_ref. Clear chain->live_throughout. From-SVN: r30957
Diffstat (limited to 'gcc/global.c')
-rw-r--r--gcc/global.c58
1 files changed, 39 insertions, 19 deletions
diff --git a/gcc/global.c b/gcc/global.c
index c46c297..0405829 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -303,7 +303,8 @@ static void mark_reg_live_nc PROTO((int, enum machine_mode));
static void set_preference PROTO((rtx, rtx));
static void dump_conflicts PROTO((FILE *));
static void reg_becomes_live PROTO((rtx, rtx, void *));
-static void reg_dies PROTO((int, enum machine_mode));
+static void reg_dies PROTO((int, enum machine_mode,
+ struct insn_chain *));
static void build_insn_chain PROTO((rtx));
/* Perform allocation of pseudo-registers not allocated by local_alloc.
@@ -1693,13 +1694,13 @@ mark_elimination (from, to)
current life information. */
static regset live_relevant_regs;
-/* Record in live_relevant_regs that register REG became live. This
- is called via note_stores. */
+/* Record in live_relevant_regs and REGS_SET that register REG became live.
+ This is called via note_stores. */
static void
-reg_becomes_live (reg, setter, data)
+reg_becomes_live (reg, setter, regs_set)
rtx reg;
rtx setter ATTRIBUTE_UNUSED;
- void *data ATTRIBUTE_UNUSED;
+ void *regs_set;
{
int regno;
@@ -1714,26 +1715,44 @@ reg_becomes_live (reg, setter, data)
{
int nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg));
while (nregs-- > 0)
- SET_REGNO_REG_SET (live_relevant_regs, regno++);
+ {
+ SET_REGNO_REG_SET (live_relevant_regs, regno);
+ if (! fixed_regs[regno])
+ SET_REGNO_REG_SET ((regset) regs_set, regno);
+ regno++;
+ }
}
else if (reg_renumber[regno] >= 0)
- SET_REGNO_REG_SET (live_relevant_regs, regno);
+ {
+ SET_REGNO_REG_SET (live_relevant_regs, regno);
+ SET_REGNO_REG_SET ((regset) regs_set, regno);
+ }
}
/* Record in live_relevant_regs that register REGNO died. */
static void
-reg_dies (regno, mode)
+reg_dies (regno, mode, chain)
int regno;
enum machine_mode mode;
+ struct insn_chain *chain;
{
if (regno < FIRST_PSEUDO_REGISTER)
{
int nregs = HARD_REGNO_NREGS (regno, mode);
while (nregs-- > 0)
- CLEAR_REGNO_REG_SET (live_relevant_regs, regno++);
+ {
+ CLEAR_REGNO_REG_SET (live_relevant_regs, regno);
+ if (! fixed_regs[regno])
+ SET_REGNO_REG_SET (chain->dead_or_set, regno);
+ regno++;
+ }
}
else
- CLEAR_REGNO_REG_SET (live_relevant_regs, regno);
+ {
+ CLEAR_REGNO_REG_SET (live_relevant_regs, regno);
+ if (reg_renumber[regno] >= 0)
+ SET_REGNO_REG_SET (chain->dead_or_set, regno);
+ }
}
/* Walk the insns of the current function and build reload_insn_chain,
@@ -1778,8 +1797,6 @@ build_insn_chain (first)
c->insn = first;
c->block = b;
- COPY_REG_SET (c->live_before, live_relevant_regs);
-
if (GET_RTX_CLASS (GET_CODE (first)) == 'i')
{
rtx link;
@@ -1789,16 +1806,18 @@ build_insn_chain (first)
for (link = REG_NOTES (first); link; link = XEXP (link, 1))
if (REG_NOTE_KIND (link) == REG_DEAD
&& GET_CODE (XEXP (link, 0)) == REG)
- reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)));
+ reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)),
+ c);
+
+ COPY_REG_SET (c->live_throughout, live_relevant_regs);
/* Mark everything born in this instruction as live. */
- note_stores (PATTERN (first), reg_becomes_live, NULL);
+ note_stores (PATTERN (first), reg_becomes_live,
+ c->dead_or_set);
}
-
- /* Remember which registers are live at the end of the insn, before
- killing those with REG_UNUSED notes. */
- COPY_REG_SET (c->live_after, live_relevant_regs);
+ else
+ COPY_REG_SET (c->live_throughout, live_relevant_regs);
if (GET_RTX_CLASS (GET_CODE (first)) == 'i')
{
@@ -1809,7 +1828,8 @@ build_insn_chain (first)
for (link = REG_NOTES (first); link; link = XEXP (link, 1))
if (REG_NOTE_KIND (link) == REG_UNUSED
&& GET_CODE (XEXP (link, 0)) == REG)
- reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)));
+ reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)),
+ c);
}
}