diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1999-03-18 11:12:01 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1999-03-18 11:12:01 +0000 |
commit | 9f4749b181530b7661dff39370ed4e62d63b54f5 (patch) | |
tree | 55ba561fcf89fdfd7073a691dfd67f4e9a76fc1c /gcc/reload.c | |
parent | 735396d963d1d45bb18645001f53fdeb7a9d69a2 (diff) | |
download | gcc-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.c | 20 |
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; } |