aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGraham Stott <grahams@redhat.com>2000-11-15 11:07:44 +0000
committerGraham Stott <grahams@gcc.gnu.org>2000-11-15 11:07:44 +0000
commit695e4773c10dfbaadf7884216aa6719da7601c64 (patch)
tree5f2bcd8a7bf44b81330e322632977a9095164327 /gcc
parent928c4ba2a71b2181fcead46d2740ebcb96009f69 (diff)
downloadgcc-695e4773c10dfbaadf7884216aa6719da7601c64.zip
gcc-695e4773c10dfbaadf7884216aa6719da7601c64.tar.gz
gcc-695e4773c10dfbaadf7884216aa6719da7601c64.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/regrename.c109
2 files changed, 66 insertions, 48 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f016426..60efafb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/regrename.c b/gcc/regrename.c
index b3aa6c2..c444af8 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -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)
- p = &this->next_chain;
- else if (action == mark_read)
- {
- if (! exact_match)
- abort ();
- if (class == NO_REGS)
- abort ();
+ /* Check if the chain has been terminated if it has then skip to
+ the next chain.
- 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. */
+ 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 ((action == terminate_dead || action == terminate_write)
- && exact_match)
+ if (*this->loc == cc0_rtx)
+ p = &this->next_chain;
+ 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);
+
+ 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
+ else if (action != terminate_overlapping_read || ! exact_match)
{
- 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]);
+ 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;
}
- *p = next;
+ else
+ p = &this->next_chain;
}
- else
- p = &this->next_chain;
}
}