aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2009-03-26 19:21:18 +0000
committerVladimir Makarov <vmakarov@redhat.com>2009-03-26 19:21:18 +0000
commitdb9b02b5ba9dd55bdb197e9013a9f1d666165ede (patch)
tree2ef34201f4df14c498170cd86eb9e4b7f45f141f
parent578bbda211e14d27b56f742e671a699f24d61538 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@145093 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/reload1.c34
2 files changed, 28 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 877fce3dd1a..947f34f30a2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2009-03-26 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* config/spu/divv2df3.c: New file.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 9a485f08300..fcf0bd3fc4d 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);
}