aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-10-19 19:20:04 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1993-10-19 19:20:04 -0400
commitca76982841fd54733f9d6e9cb380453675978204 (patch)
tree4c3c9e3eec798df975f74296417d4b76b0766652 /gcc/reload.c
parent98c131c38295833821a84f9dc834b7a2dc127856 (diff)
downloadgcc-ca76982841fd54733f9d6e9cb380453675978204.zip
gcc-ca76982841fd54733f9d6e9cb380453675978204.tar.gz
gcc-ca76982841fd54733f9d6e9cb380453675978204.tar.bz2
(push_reload, find_reloads): If an operand is a SUBREG of a PLUS,
force a reload and reload what is inside. From-SVN: r5814
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index 46df172..ca2ed81 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -615,7 +615,7 @@ push_reload (in, out, inloc, outloc, class,
}
/* If we are reloading a (SUBREG constant ...), really reload just the
- inside expression in its own mode.
+ inside expression in its own mode. Similarly for (SUBREG (PLUS ...)).
If we have (SUBREG:M1 (MEM:M2 ...) ...) (or an inner REG that is still
a pseudo and hence will become a MEM) with M1 wider than M2 and the
register is a pseudo, also reload the inside expression.
@@ -639,6 +639,7 @@ push_reload (in, out, inloc, outloc, class,
if (in != 0 && GET_CODE (in) == SUBREG
&& (CONSTANT_P (SUBREG_REG (in))
+ || GET_CODE (SUBREG_REG (in)) == PLUS
|| strict_low
|| (((GET_CODE (SUBREG_REG (in)) == REG
&& REGNO (SUBREG_REG (in)) >= FIRST_PSEUDO_REGISTER)
@@ -2599,9 +2600,10 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
{
offset += SUBREG_WORD (operand);
operand = SUBREG_REG (operand);
- /* Force reload if this is a constant or if there may may
+ /* Force reload if this is a constant or PLUS or if there may may
be a problem accessing OPERAND in the outer mode. */
if (CONSTANT_P (operand)
+ || GET_CODE (operand) == PLUS
#ifdef LOAD_EXTEND_OP
/* If we have a SUBREG where both the inner and outer
modes are different size but no wider than a word,