reload.c (find_reloads): Use a hard reg destination as reload reg for an input reload...
authorRichard Henderson <rth@redhat.com>
Sun, 13 Jan 2002 22:57:29 +0000 (14:57 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 13 Jan 2002 22:57:29 +0000 (14:57 -0800)
        * reload.c (find_reloads): Use a hard reg destination as reload reg
        for an input reload of the source.

From-SVN: r48822

gcc/ChangeLog
gcc/reload.c

index e1464af..ee3047b 100644 (file)
@@ -1,3 +1,8 @@
+2002-01-13  Richard Henderson  <rth@redhat.com>
+
+       * reload.c (find_reloads): Use a hard reg destination as reload reg
+       for an input reload of the source.
+
 2002-01-13  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        * doc/install.texi (Binaries): Make link to ftp.writtenword.com
index 3996050..8f82c93 100644 (file)
@@ -4241,6 +4241,23 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
       rld[i].nregs = CLASS_MAX_NREGS (rld[i].class, rld[i].mode);
     }
 
+  /* Special case a simple move with an input reload and a
+     destination of a hard reg, if the hard reg is ok, use it.  */
+  for (i = 0; i < n_reloads; i++)
+    if (rld[i].when_needed == RELOAD_FOR_INPUT
+       && GET_CODE (PATTERN (insn)) == SET
+       && GET_CODE (SET_DEST (PATTERN (insn))) == REG
+       && SET_SRC (PATTERN (insn)) == rld[i].in)
+      {
+       rtx dest = SET_DEST (PATTERN (insn));
+       unsigned int regno = REGNO (dest);
+
+       if (regno < FIRST_PSEUDO_REGISTER
+           && TEST_HARD_REG_BIT (reg_class_contents[rld[i].class], regno)
+           && HARD_REGNO_MODE_OK (regno, rld[i].mode))
+         rld[i].reg_rtx = dest;
+      }
+
   return retval;
 }