reload.c (find_reloads_toplev): When processing X recursively...
authorJ"orn Rennecke <amylaar@cygnus.co.uk>
Thu, 18 Mar 1999 11:12:01 +0000 (11:12 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 18 Mar 1999 11:12:01 +0000 (11:12 +0000)
* reload.c (find_reloads_toplev): When processing X recursively,
don't alter it destructively except by filling in constants.

From-SVN: r25840

gcc/ChangeLog
gcc/reload.c

index 1a2388a64f972371851acfd2db46f99728a5e965..e06c403e5ceb4d53edf7bb60697e173db413a5bc 100644 (file)
@@ -1,3 +1,8 @@
+Thu Mar 18 19:09:50 1999  J"orn Rennecke <amylaar@cygnus.co.uk>
+
+       * 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  <ghazi@caip.rutgers.edu>
 
        * cccp.c (default_include): Initialize structure memebers.
index 936e72fced424a637f35ae860d5a59bde3caa871..8ba0621068d1adfaefa629f18d8baab66fe50c89 100644 (file)
@@ -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;
 }