aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-03-22 14:27:23 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-03-22 14:27:23 +0000
commit02eb1393dc78d672af977764716d7d084b730ca4 (patch)
treec91cde79385f2b22b1cd431fd7737dc3c85653f2 /gcc/reload1.c
parent50270076bd7e9aaca337ab7dd944268082b25b42 (diff)
downloadgcc-02eb1393dc78d672af977764716d7d084b730ca4.zip
gcc-02eb1393dc78d672af977764716d7d084b730ca4.tar.gz
gcc-02eb1393dc78d672af977764716d7d084b730ca4.tar.bz2
reload1.c (reload_as_needed): Set reload_is_output_reload / reload_has_output_reload for auto_inc expressions...
* reload1.c (reload_as_needed): Set reload_is_output_reload / reload_has_output_reload for auto_inc expressions that could be reloaded. Call forget_old_reloads for REG_INC notes. From-SVN: r25899
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 081b997..1295d32 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4414,17 +4414,37 @@ reload_as_needed (live_known)
break;
}
if (n == 1)
- REG_NOTES (p) = gen_rtx_EXPR_LIST (REG_INC, reload_reg,
- REG_NOTES (p));
+ {
+ REG_NOTES (p)
+ = gen_rtx_EXPR_LIST (REG_INC, reload_reg,
+ REG_NOTES (p));
+ /* Mark this as having an output reload so that the
+ REG_INC processing code below won't invalidate
+ the reload for inheritance. */
+ SET_HARD_REG_BIT (reg_is_output_reload,
+ REGNO (reload_reg));
+ reg_has_output_reload[REGNO (XEXP (in_reg, 0))] = 1;
+ }
else
forget_old_reloads_1 (XEXP (in_reg, 0), NULL_RTX);
}
+ else if ((code == PRE_INC || code == PRE_DEC)
+ && TEST_HARD_REG_BIT (reg_reloaded_valid,
+ REGNO (reload_reg_rtx[i]))
+ /* Make sure it is the inc/dec pseudo, and not
+ some other (e.g. output operand) pseudo. */
+ && (reg_reloaded_contents[REGNO (reload_reg_rtx[i])]
+ == REGNO (XEXP (in_reg, 0))))
+ {
+ SET_HARD_REG_BIT (reg_is_output_reload,
+ REGNO (reload_reg_rtx[i]));
+ reg_has_output_reload[REGNO (XEXP (in_reg, 0))] = 1;
+ }
}
}
-#if 0 /* ??? Is this code obsolete now? Need to check carefully. */
- /* Likewise for regs altered by auto-increment in this insn.
- But note that the reg-notes are not changed by reloading:
- they still contain the pseudo-regs, not the spill regs. */
+ /* If a pseudo that got a hard register is auto-incremented,
+ we must purge records of copying it into pseudos without
+ hard registers. */
for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
if (REG_NOTE_KIND (x) == REG_INC)
{
@@ -4439,7 +4459,6 @@ reload_as_needed (live_known)
forget_old_reloads_1 (XEXP (x, 0), NULL_RTX);
}
#endif
-#endif
}
/* A reload reg's contents are unknown after a label. */
if (GET_CODE (insn) == CODE_LABEL)