aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-04-14 03:00:12 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-04-14 03:00:12 -0700
commit4eea1672584f6ff384865ccf3e93194a85b3eb99 (patch)
treeaefb588f66d3ba7808ea9b47c98f91be8b213c0d
parentc5fb6d4a79f2f7f8404089337dd01977134d16e6 (diff)
downloadgcc-4eea1672584f6ff384865ccf3e93194a85b3eb99.zip
gcc-4eea1672584f6ff384865ccf3e93194a85b3eb99.tar.gz
gcc-4eea1672584f6ff384865ccf3e93194a85b3eb99.tar.bz2
reload1.c (emit_reload_insns): Also find equivalent mems for subregs of pseudos.
* reload1.c (emit_reload_insns): Also find equivalent mems for subregs of pseudos. From-SVN: r26444
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reload1.c43
2 files changed, 33 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a701e94..3990cc1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Wed Apr 14 09:59:38 1999 Richard Henderson <rth@cygnus.com>
+
+ * reload1.c (emit_reload_insns): Also find equivalent mems
+ for subregs of pseudos.
+
Wed Apr 14 09:39:20 1999 Richard Henderson <rth@cygnus.com>
* i386.md (neghi): Use the whole register when widening the op.
diff --git a/gcc/reload1.c b/gcc/reload1.c
index e97e98e..c566d38 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -6865,6 +6865,7 @@ emit_reload_insns (chain)
int secondary_reload = reload_secondary_in_reload[j];
rtx real_oldequiv = oldequiv;
rtx real_old = old;
+ rtx tmp;
/* If OLDEQUIV is a pseudo with a MEM, get the real MEM
and similarly for OLD.
@@ -6873,30 +6874,42 @@ emit_reload_insns (chain)
equivalent MEM, we must fall back to reload_in, which
will have all the necessary substitutions registered.
Likewise for a pseudo that can't be replaced with its
- equivalent constant. */
+ equivalent constant.
+
+ Take extra care for subregs of such pseudos. Note that
+ we cannot use reg_equiv_mem in this case because it is
+ not in the right mode. */
- if (GET_CODE (oldequiv) == REG
- && REGNO (oldequiv) >= FIRST_PSEUDO_REGISTER
- && (reg_equiv_memory_loc[REGNO (oldequiv)] != 0
- || reg_equiv_constant[REGNO (oldequiv)] != 0))
+ tmp = oldequiv;
+ if (GET_CODE (tmp) == SUBREG)
+ tmp = SUBREG_REG (tmp);
+ if (GET_CODE (tmp) == REG
+ && REGNO (tmp) >= FIRST_PSEUDO_REGISTER
+ && (reg_equiv_memory_loc[REGNO (tmp)] != 0
+ || reg_equiv_constant[REGNO (tmp)] != 0))
{
- if (! reg_equiv_mem[REGNO (oldequiv)]
- || num_not_at_initial_offset)
+ if (! reg_equiv_mem[REGNO (tmp)]
+ || num_not_at_initial_offset
+ || GET_CODE (oldequiv) == SUBREG)
real_oldequiv = reload_in[j];
else
- real_oldequiv = reg_equiv_mem[REGNO (oldequiv)];
+ real_oldequiv = reg_equiv_mem[REGNO (tmp)];
}
- if (GET_CODE (old) == REG
- && REGNO (old) >= FIRST_PSEUDO_REGISTER
- && (reg_equiv_memory_loc[REGNO (old)] != 0
- || reg_equiv_constant[REGNO (old)] != 0))
+ tmp = old;
+ if (GET_CODE (tmp) == SUBREG)
+ tmp = SUBREG_REG (tmp);
+ if (GET_CODE (tmp) == REG
+ && REGNO (tmp) >= FIRST_PSEUDO_REGISTER
+ && (reg_equiv_memory_loc[REGNO (tmp)] != 0
+ || reg_equiv_constant[REGNO (tmp)] != 0))
{
- if (! reg_equiv_mem[REGNO (old)]
- || num_not_at_initial_offset)
+ if (! reg_equiv_mem[REGNO (tmp)]
+ || num_not_at_initial_offset
+ || GET_CODE (old) == SUBREG)
real_old = reload_in[j];
else
- real_old = reg_equiv_mem[REGNO (old)];
+ real_old = reg_equiv_mem[REGNO (tmp)];
}
second_reload_reg = reload_reg_rtx[secondary_reload];