aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorTom Wood <wood@gnu.org>1992-12-11 13:18:32 +0000
committerTom Wood <wood@gnu.org>1992-12-11 13:18:32 +0000
commitdb660765c7a94b5dec6d95f34797e29f69aed990 (patch)
tree7e825ea2d6908df23fbb50fbb104bf7c7fb432b3 /gcc/reload1.c
parentd8cfa4ee64a9f661e35b2e1549b0ae85ae5a9888 (diff)
downloadgcc-db660765c7a94b5dec6d95f34797e29f69aed990.zip
gcc-db660765c7a94b5dec6d95f34797e29f69aed990.tar.gz
gcc-db660765c7a94b5dec6d95f34797e29f69aed990.tar.bz2
(choose_reload_regs): Don't inherit a reload if the
previous reload wasn't at least as wide as the current reload. From-SVN: r2864
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r--gcc/reload1.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 7458018..261be05 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4382,13 +4382,20 @@ choose_reload_regs (insn, avoid_return_reg)
if (inheritance)
{
register int regno = -1;
+ enum machine_mode mode;
if (reload_in[r] == 0)
;
else if (GET_CODE (reload_in[r]) == REG)
- regno = REGNO (reload_in[r]);
+ {
+ regno = REGNO (reload_in[r]);
+ mode = GET_MODE (reload_in[r]);
+ }
else if (GET_CODE (reload_in_reg[r]) == REG)
- regno = REGNO (reload_in_reg[r]);
+ {
+ regno = REGNO (reload_in_reg[r]);
+ mode = GET_MODE (reload_in_reg[r]);
+ }
#if 0
/* This won't work, since REGNO can be a pseudo reg number.
Also, it takes much more hair to keep track of all the things
@@ -4403,6 +4410,8 @@ choose_reload_regs (insn, avoid_return_reg)
i = spill_reg_order[REGNO (reg_last_reload_reg[regno])];
if (reg_reloaded_contents[i] == regno
+ && (GET_MODE_SIZE (GET_MODE (reg_last_reload_reg[regno]))
+ >= GET_MODE_SIZE (mode))
&& HARD_REGNO_MODE_OK (spill_regs[i], reload_mode[r])
&& TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]],
spill_regs[i])