Commit 108c535a by Richard Henderson

Revert last change until I figure out what's wrong with it.

From-SVN: r28592
parent 22ccea1b
...@@ -271,7 +271,7 @@ static void set_preference PROTO((rtx, rtx)); ...@@ -271,7 +271,7 @@ static void set_preference PROTO((rtx, rtx));
static void dump_conflicts PROTO((FILE *)); static void dump_conflicts PROTO((FILE *));
static void reg_becomes_live PROTO((rtx, rtx)); static void reg_becomes_live PROTO((rtx, rtx));
static void reg_dies PROTO((int, enum machine_mode)); static void reg_dies PROTO((int, enum machine_mode));
static void build_insn_chain PROTO((void)); static void build_insn_chain PROTO((rtx));
/* Perform allocation of pseudo-registers not allocated by local_alloc. /* Perform allocation of pseudo-registers not allocated by local_alloc.
FILE is a file to output debugging information on, FILE is a file to output debugging information on,
...@@ -578,7 +578,7 @@ global_alloc (file) ...@@ -578,7 +578,7 @@ global_alloc (file)
if (n_basic_blocks > 0) if (n_basic_blocks > 0)
#endif #endif
{ {
build_insn_chain (); build_insn_chain (get_insns ());
retval = reload (get_insns (), 1, file); retval = reload (get_insns (), 1, file);
} }
...@@ -1667,88 +1667,96 @@ reg_dies (regno, mode) ...@@ -1667,88 +1667,96 @@ reg_dies (regno, mode)
/* Walk the insns of the current function and build reload_insn_chain, /* Walk the insns of the current function and build reload_insn_chain,
and record register life information. */ and record register life information. */
static void static void
build_insn_chain () build_insn_chain (first)
rtx first;
{ {
struct insn_chain **p = &reload_insn_chain; struct insn_chain **p = &reload_insn_chain;
struct insn_chain *prev = 0; struct insn_chain *prev = 0;
int b; int b = 0;
live_relevant_regs = ALLOCA_REG_SET (); live_relevant_regs = ALLOCA_REG_SET ();
for (b = n_basic_blocks - 1; b >= 0; --b) for (; first; first = NEXT_INSN (first))
{ {
basic_block bb = BASIC_BLOCK (b); struct insn_chain *c;
rtx insn, end;
int i;
CLEAR_REG_SET (live_relevant_regs);
EXECUTE_IF_SET_IN_REG_SET (bb->global_live_at_start, 0, i, if (first == BLOCK_HEAD (b))
{ {
if ((i < FIRST_PSEUDO_REGISTER int i;
CLEAR_REG_SET (live_relevant_regs);
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, i)
&& ! TEST_HARD_REG_BIT (eliminable_regset, i)) && ! TEST_HARD_REG_BIT (eliminable_regset, i))
|| (i >= FIRST_PSEUDO_REGISTER
&& reg_renumber[i] >= 0))
SET_REGNO_REG_SET (live_relevant_regs, i); SET_REGNO_REG_SET (live_relevant_regs, i);
});
insn = bb->head, end = bb->end; for (; i < max_regno; i++)
while (1) if (reg_renumber[i] >= 0
{ && REGNO_REG_SET_P (BASIC_BLOCK (b)->global_live_at_start, i))
struct insn_chain *c; SET_REGNO_REG_SET (live_relevant_regs, i);
}
if (GET_CODE (insn) != NOTE) if (GET_CODE (first) != NOTE && GET_CODE (first) != BARRIER)
{ {
c = new_insn_chain (); c = new_insn_chain ();
c->prev = prev; c->prev = prev;
prev = c; prev = c;
*p = c; *p = c;
p = &c->next; p = &c->next;
c->insn = insn; c->insn = first;
c->block = b; c->block = b;
COPY_REG_SET (c->live_before, live_relevant_regs); COPY_REG_SET (c->live_before, live_relevant_regs);
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') if (GET_RTX_CLASS (GET_CODE (first)) == 'i')
{ {
rtx link; rtx link;
/* Mark the death of everything that dies in this /* Mark the death of everything that dies in this instruction. */
instruction. */
for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) for (link = REG_NOTES (first); link; link = XEXP (link, 1))
if (REG_NOTE_KIND (link) == REG_DEAD if (REG_NOTE_KIND (link) == REG_DEAD
&& GET_CODE (XEXP (link, 0)) == REG) && GET_CODE (XEXP (link, 0)) == REG)
reg_dies (REGNO (XEXP (link, 0)), reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)));
GET_MODE (XEXP (link, 0)));
/* Mark everything born in this instruction as live. */ /* Mark everything born in this instruction as live. */
note_stores (PATTERN (insn), reg_becomes_live);
note_stores (PATTERN (first), reg_becomes_live);
} }
/* Remember which registers are live at the end of the insn, /* Remember which registers are live at the end of the insn, before
before killing those with REG_UNUSED notes. */ killing those with REG_UNUSED notes. */
COPY_REG_SET (c->live_after, live_relevant_regs); COPY_REG_SET (c->live_after, live_relevant_regs);
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') if (GET_RTX_CLASS (GET_CODE (first)) == 'i')
{ {
rtx link; rtx link;
/* Mark anything that is set in this insn and then unused /* Mark anything that is set in this insn and then unused as dying. */
as dying. */
for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) for (link = REG_NOTES (first); link; link = XEXP (link, 1))
if (REG_NOTE_KIND (link) == REG_UNUSED if (REG_NOTE_KIND (link) == REG_UNUSED
&& GET_CODE (XEXP (link, 0)) == REG) && GET_CODE (XEXP (link, 0)) == REG)
reg_dies (REGNO (XEXP (link, 0)), reg_dies (REGNO (XEXP (link, 0)), GET_MODE (XEXP (link, 0)));
GET_MODE (XEXP (link, 0)));
} }
} }
if (insn == end) if (first == BLOCK_END (b))
b++;
/* Stop after we pass the end of the last basic block. Verify that
no real insns are after the end of the last basic block.
We may want to reorganize the loop somewhat since this test should
always be the right exit test. */
if (b == n_basic_blocks)
{
for (first = NEXT_INSN (first) ; first; first = NEXT_INSN (first))
if (GET_RTX_CLASS (GET_CODE (first)) == 'i'
&& GET_CODE (PATTERN (first)) != USE)
abort ();
break; break;
insn = NEXT_INSN (insn);
} }
} }
FREE_REG_SET (live_relevant_regs); FREE_REG_SET (live_relevant_regs);
*p = 0; *p = 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment