diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1998-12-01 10:53:54 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-12-01 03:53:54 -0700 |
commit | 78a2bc08568c524d51ef1ebd69e0fa0be4fcf216 (patch) | |
tree | 5174f36b05a4a1e3f7aae1b75c76b6e959575466 /gcc | |
parent | de80f41622d4d3dd30386ca0fd506fc0b7930f95 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/reload1.c | 28 |
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. */ |