diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-26 19:21:18 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-03-26 19:21:18 +0000 |
commit | d9cee1b1a198bdd084f9c6afb3e6819a7f1bfc11 (patch) | |
tree | 2ef34201f4df14c498170cd86eb9e4b7f45f141f /gcc | |
parent | bde8fea72a788f83cc7474873d740cdfb9f8b0b8 (diff) | |
download | gcc-d9cee1b1a198bdd084f9c6afb3e6819a7f1bfc11.tar.gz |
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: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145093 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reload1.c | 34 |
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 (®_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); } |