regrename.c (scan_rtx_rtx): Skip to the next chain on encountering a terminated chain.

* regrename.c (scan_rtx_rtx): Skip to the next chain on
        encountering a terminated chain.

From-SVN: r37473
This commit is contained in:
Graham Stott 2000-11-15 11:07:44 +00:00 committed by Graham Stott
parent 928c4ba2a7
commit 695e4773c1
2 changed files with 67 additions and 49 deletions

View File

@ -1,3 +1,8 @@
2000-11-15 Graham Stott <grahams@redhat.com>
* regrename.c (scan_rtx_rtx): Skip to the next chain on
encountering a terminated chain.
2000-11-14 Mark Mitchell <mark@codesourcery.com>
* configure.in: Move check for V3 above check for C++ header-file

View File

@ -307,62 +307,75 @@ scan_rtx_reg (insn, loc, class, action, type)
for (p = &open_chains; *p;)
{
struct du_chain *this = *p;
int regno = REGNO (*this->loc);
int nregs = HARD_REGNO_NREGS (regno, GET_MODE (*this->loc));
int exact_match = (regno == this_regno && nregs == this_nregs);
if (regno + nregs <= this_regno
|| this_regno + this_nregs <= regno)
/* Check if the chain has been terminated if it has then skip to
the next chain.
This can happen when we've already appended the location to
the chain in Step 3, but are trying to hide in-out operands
from terminate_write in Step 5. */
if (*this->loc == cc0_rtx)
p = &this->next_chain;
else if (action == mark_read)
{
if (! exact_match)
abort ();
if (class == NO_REGS)
abort ();
else
{
int regno = REGNO (*this->loc);
int nregs = HARD_REGNO_NREGS (regno, GET_MODE (*this->loc));
int exact_match = (regno == this_regno && nregs == this_nregs);
this = (struct du_chain *)
obstack_alloc (&rename_obstack, sizeof (struct du_chain));
this->next_use = *p;
this->next_chain = (*p)->next_chain;
this->loc = loc;
this->insn = insn;
this->class = class;
this->need_caller_save_reg = 0;
*p = this;
return;
}
else if (action != terminate_overlapping_read || ! exact_match)
{
struct du_chain *next = this->next_chain;
/* Whether the terminated chain can be used for renaming
depends on the action and this being an exact match.
In either case, we remove this element from open_chains. */
if ((action == terminate_dead || action == terminate_write)
&& exact_match)
if (regno + nregs <= this_regno
|| this_regno + this_nregs <= regno)
p = &this->next_chain;
else if (action == mark_read)
{
this->next_chain = closed_chains;
closed_chains = this;
if (rtl_dump_file)
fprintf (rtl_dump_file,
"Closing chain %s at insn %d (%s)\n",
reg_names[REGNO (*this->loc)], INSN_UID (insn),
scan_actions_name[(int) action]);
if (! exact_match)
abort ();
if (class == NO_REGS)
abort ();
this = (struct du_chain *)
obstack_alloc (&rename_obstack, sizeof (struct du_chain));
this->next_use = *p;
this->next_chain = (*p)->next_chain;
this->loc = loc;
this->insn = insn;
this->class = class;
this->need_caller_save_reg = 0;
*p = this;
return;
}
else if (action != terminate_overlapping_read || ! exact_match)
{
struct du_chain *next = this->next_chain;
/* Whether the terminated chain can be used for renaming
depends on the action and this being an exact match.
In either case, we remove this element from open_chains. */
if ((action == terminate_dead || action == terminate_write)
&& exact_match)
{
this->next_chain = closed_chains;
closed_chains = this;
if (rtl_dump_file)
fprintf (rtl_dump_file,
"Closing chain %s at insn %d (%s)\n",
reg_names[REGNO (*this->loc)], INSN_UID (insn),
scan_actions_name[(int) action]);
}
else
{
if (rtl_dump_file)
fprintf (rtl_dump_file,
"Discarding chain %s at insn %d (%s)\n",
reg_names[REGNO (*this->loc)], INSN_UID (insn),
scan_actions_name[(int) action]);
}
*p = next;
}
else
{
if (rtl_dump_file)
fprintf (rtl_dump_file,
"Discarding chain %s at insn %d (%s)\n",
reg_names[REGNO (*this->loc)], INSN_UID (insn),
scan_actions_name[(int) action]);
}
*p = next;
p = &this->next_chain;
}
else
p = &this->next_chain;
}
}