aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2009-03-26 19:21:18 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2009-03-26 19:21:18 +0000
commitd5f89b53026d0705832786606216a7b3a08c4478 (patch)
tree2ef34201f4df14c498170cd86eb9e4b7f45f141f /gcc/reload1.c
parent359b867255469491a68466f8d4258aa63ef2ff5c (diff)
downloadgcc-d5f89b53026d0705832786606216a7b3a08c4478.zip
gcc-d5f89b53026d0705832786606216a7b3a08c4478.tar.gz
gcc-d5f89b53026d0705832786606216a7b3a08c4478.tar.bz2
re PR rtl-optimization/39522 (fix for PR37514 gives FAIL: gcc.c-torture/execute/stdarg-3.c compilation, -O3 -fomit-frame-pointer -funroll-loops (internal compiler error))
2009-03-26 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/39522 * reload1.c (reload_as_needed): Invalidate reg_last_reload_reg too when reg_reloaded_valid is set. From-SVN: r145093
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 9a485f0..fcf0bd3 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4367,29 +4367,39 @@ reload_as_needed (int live_known)
SET_REGNO_REG_SET (&reg_has_output_reload,
REGNO (XEXP (in_reg, 0)));
}
- else if ((code == PRE_INC || code == PRE_DEC
- || code == POST_INC || code == POST_DEC))
+ else if (code == PRE_INC || code == PRE_DEC
+ || code == POST_INC || code == POST_DEC)
{
- int in_hard_regno;
int in_regno = REGNO (XEXP (in_reg, 0));
if (reg_last_reload_reg[in_regno] != NULL_RTX)
{
+ int in_hard_regno;
+ bool forget_p = true;
+
in_hard_regno = REGNO (reg_last_reload_reg[in_regno]);
- gcc_assert (TEST_HARD_REG_BIT (reg_reloaded_valid,
- in_hard_regno));
- for (x = old_prev ? NEXT_INSN (old_prev) : insn;
- x != old_next;
- x = NEXT_INSN (x))
- if (x == reg_reloaded_insn[in_hard_regno])
- break;
+ if (TEST_HARD_REG_BIT (reg_reloaded_valid,
+ in_hard_regno))
+ {
+ for (x = old_prev ? NEXT_INSN (old_prev) : insn;
+ x != old_next;
+ x = NEXT_INSN (x))
+ if (x == reg_reloaded_insn[in_hard_regno])
+ {
+ forget_p = false;
+ break;
+ }
+ }
/* If for some reasons, we didn't set up
reg_last_reload_reg in this insn,
invalidate inheritance from previous
insns for the incremented/decremented
register. Such registers will be not in
- reg_has_output_reload. */
- if (x == old_next)
+ reg_has_output_reload. Invalidate it
+ also if the corresponding element in
+ reg_reloaded_insn is also
+ invalidated. */
+ if (forget_p)
forget_old_reloads_1 (XEXP (in_reg, 0),
NULL_RTX, NULL);
}