aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-12-01 10:53:54 +0000
committerJeff Law <law@gcc.gnu.org>1998-12-01 03:53:54 -0700
commit78a2bc08568c524d51ef1ebd69e0fa0be4fcf216 (patch)
tree5174f36b05a4a1e3f7aae1b75c76b6e959575466
parentde80f41622d4d3dd30386ca0fd506fc0b7930f95 (diff)
downloadgcc-78a2bc08568c524d51ef1ebd69e0fa0be4fcf216.zip
gcc-78a2bc08568c524d51ef1ebd69e0fa0be4fcf216.tar.gz
gcc-78a2bc08568c524d51ef1ebd69e0fa0be4fcf216.tar.bz2
reload1.c (emit_reload_insns): Clear spill_reg_store when doing a new non-inherited reload from the same pseudo.
* reload1.c (emit_reload_insns): Clear spill_reg_store when doing a new non-inherited reload from the same pseudo. From-SVN: r24029
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/reload1.c28
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cd8ba2b..1eb7c84 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -9,6 +9,9 @@ Tue Dec 1 10:22:18 1998 Nick Clifton <nickc@cygnus.com>
Tue Dec 1 17:58:26 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
+ * reload1.c (emit_reload_insns): Clear spill_reg_store
+ when doing a new non-inherited reload from the same pseudo.
+
* local-alloc.c (function_invariant_p): New function.
(update_equiv_regs): Use function_invariant_p instead of CONSTANT_P
to decide if an equivalence should be recorded.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 08f5375..d27663c 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -7300,6 +7300,34 @@ emit_reload_insns (chain)
register int r = reload_order[j];
register int i = reload_spill_index[r];
+ /* If this is a non-inherited input reload from a pseudo, we must
+ clear any memory of a previous store to the same pseudo. Only do
+ something if there will not be an output reload for the pseudo
+ being reloaded. */
+ if (reload_in_reg[r] != 0
+ && ! (reload_inherited[r] || reload_override_in[r]))
+ {
+ rtx reg = reload_in_reg[r];
+
+ if (GET_CODE (reg) == SUBREG)
+ reg = SUBREG_REG (reg);
+
+ if (GET_CODE (reg) == REG
+ && REGNO (reg) >= FIRST_PSEUDO_REGISTER
+ && ! reg_has_output_reload[REGNO (reg)])
+ {
+ int nregno = REGNO (reg);
+
+ if (reg_last_reload_reg[nregno])
+ {
+ int last_regno = REGNO (reg_last_reload_reg[nregno]);
+
+ if (reg_reloaded_contents[last_regno] == nregno)
+ spill_reg_store[last_regno] = 0;
+ }
+ }
+ }
+
/* I is nonneg if this reload used a register.
If reload_reg_rtx[r] is 0, this is an optional reload
that we opted to ignore. */