aboutsummaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1999-03-18 11:12:01 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1999-03-18 11:12:01 +0000
commit9f4749b181530b7661dff39370ed4e62d63b54f5 (patch)
tree55ba561fcf89fdfd7073a691dfd67f4e9a76fc1c /gcc/reload.c
parent735396d963d1d45bb18645001f53fdeb7a9d69a2 (diff)
downloadgcc-9f4749b181530b7661dff39370ed4e62d63b54f5.zip
gcc-9f4749b181530b7661dff39370ed4e62d63b54f5.tar.gz
gcc-9f4749b181530b7661dff39370ed4e62d63b54f5.tar.bz2
reload.c (find_reloads_toplev): When processing X recursively...
* reload.c (find_reloads_toplev): When processing X recursively, don't alter it destructively except by filling in constants. From-SVN: r25840
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index 936e72f..8ba0621 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -4367,6 +4367,7 @@ find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, insn)
register char *fmt = GET_RTX_FORMAT (code);
register int i;
+ int copied;
if (code == REG)
{
@@ -4503,11 +4504,24 @@ find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest, insn)
insn);
}
- for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+ for (copied = 0, i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
{
if (fmt[i] == 'e')
- XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type,
- ind_levels, is_set_dest, insn);
+ {
+ rtx new_part = find_reloads_toplev (XEXP (x, i), opnum, type,
+ ind_levels, is_set_dest, insn);
+ /* If we have replaced a reg with it's equivalent memory loc -
+ that can still be handled here e.g. if it's in a paradoxical
+ subreg - we must make the change in a copy, rather than using
+ a destructive change. This way, find_reloads can still elect
+ not to do the change. */
+ if (new_part != XEXP (x, i) && ! CONSTANT_P (new_part) && ! copied)
+ {
+ x = copy_rtx (x);
+ copied = 1;
+ }
+ XEXP (x, i) = new_part;
+ }
}
return x;
}