aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-09-24 13:58:43 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-09-24 14:58:43 +0100
commitb29514ee9d0889f3bf368d03db290d36f05f9922 (patch)
tree16b3b4606cc4c408ef87c448b94886678964d256
parent5adf6da0eb8b7cf355e5db02e8266637e24a5d25 (diff)
downloadgcc-b29514ee9d0889f3bf368d03db290d36f05f9922.zip
gcc-b29514ee9d0889f3bf368d03db290d36f05f9922.tar.gz
gcc-b29514ee9d0889f3bf368d03db290d36f05f9922.tar.bz2
reload1.c (choose_reload_regs): Also try inheritance when reload_in is a stack slot of a pseudo...
* reload1.c (choose_reload_regs): Also try inheritance when reload_in is a stack slot of a pseudo, even if we already got a reload reg. From-SVN: r22571
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/reload1.c17
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c462638..0b9d673 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Thu Sep 24 21:48:51 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * reload1.c (choose_reload_regs): Also try inheritance when
+ reload_in is a stack slot of a pseudo, even if we already got a
+ reload reg.
+
Thu Sep 24 21:22:39 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
* reload1.c (reload_cse_regs_1): Renamed from reload_cse_regs.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 91b7294..bb7aa3f 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -5675,13 +5675,16 @@ choose_reload_regs (insn, avoid_return_reg)
&& ! reload_secondary_p[r])
continue;
- /* If find_reloads chose a to use reload_in or reload_out as a reload
+ /* If find_reloads chose to use reload_in or reload_out as a reload
register, we don't need to chose one. Otherwise, try even if it
found one since we might save an insn if we find the value lying
- around. */
+ around.
+ Try also when reload_in is a pseudo without a hard reg. */
if (reload_in[r] != 0 && reload_reg_rtx[r] != 0
&& (rtx_equal_p (reload_in[r], reload_reg_rtx[r])
- || rtx_equal_p (reload_out[r], reload_reg_rtx[r])))
+ || (rtx_equal_p (reload_out[r], reload_reg_rtx[r])
+ && GET_CODE (reload_in[r]) != MEM
+ && true_regnum (reload_in[r]) < FIRST_PSEUDO_REGISTER)))
continue;
#if 0 /* No longer needed for correct operation.
@@ -5827,7 +5830,13 @@ choose_reload_regs (insn, avoid_return_reg)
/* Don't really use the inherited spill reg
if we need it wider than we've got it. */
|| (GET_MODE_SIZE (reload_mode[r])
- > GET_MODE_SIZE (mode)))
+ > GET_MODE_SIZE (mode))
+ /* If find_reloads chose reload_out as reload
+ register, stay with it - that leaves the
+ inherited register for subsequent reloads. */
+ || (reload_reg_rtx
+ && rtx_equal_p (reload_out[r],
+ reload_reg_rtx[r])))
reload_override_in[r] = reg_last_reload_reg[regno];
else
{