From: J"orn Rennecke Date: Thu, 18 Mar 1999 11:12:01 +0000 (+0000) Subject: reload.c (find_reloads_toplev): When processing X recursively... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9f4749b181530b7661dff39370ed4e62d63b54f5;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a2388a64f9..e06c403e5ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Thu Mar 18 19:09:50 1999 J"orn Rennecke + + * reload.c (find_reloads_toplev): When processing X recursively, + don't alter it destructively except by filling in constants. + Thu Mar 18 10:14:18 1999 Kaveh R. Ghazi * cccp.c (default_include): Initialize structure memebers. diff --git a/gcc/reload.c b/gcc/reload.c index 936e72fced4..8ba0621068d 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; }