]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
reload.c (push_reload): When using a dying register for the reload register in an...
authorJ"orn Rennecke <amylaar@redhat.com>
Tue, 19 Dec 2000 00:42:31 +0000 (00:42 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 19 Dec 2000 00:42:31 +0000 (00:42 +0000)
* reload.c (push_reload): When using a dying register for the reload
register in an in-out reload, use outmode if wider than inmode.

From-SVN: r38373

gcc/ChangeLog
gcc/reload.c

index cb3001e0b137dee74e1cce8a0434cbb5aa423089..6932876158beac2844ea5687dde7360e2b661d62 100644 (file)
@@ -1,3 +1,8 @@
+Tue Dec 19 00:37:08 2000  J"orn Rennecke <amylaar@redhat.com>
+
+       * reload.c (push_reload): When using a dying register for the reload
+       register in an in-out reload, use outmode if wider than inmode.
+
 2000-12-19  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * config/d30v/d30v.h (EXIT_BODY): Update comment.
index 86d80c1af23bd670f753bd0231058e9539ba2e7d..ddc599fc247d070d8dbe410426f3d0b815039575 100644 (file)
@@ -1451,6 +1451,10 @@ push_reload (in, out, inloc, outloc, class,
     {
       rtx note;
       int regno;
+      enum machine_mode rel_mode = inmode;
+
+      if (out && GET_MODE_SIZE (outmode) > GET_MODE_SIZE (inmode))
+       rel_mode = outmode;
 
       for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1))
        if (REG_NOTE_KIND (note) == REG_DEAD
@@ -1460,7 +1464,7 @@ push_reload (in, out, inloc, outloc, class,
            && ! refers_to_regno_for_reload_p (regno,
                                               (regno
                                                + HARD_REGNO_NREGS (regno,
-                                                                   inmode)),
+                                                                   rel_mode)),
                                               PATTERN (this_insn), inloc)
            /* If this is also an output reload, IN cannot be used as
               the reload register if it is set in this insn unless IN
@@ -1469,7 +1473,7 @@ push_reload (in, out, inloc, outloc, class,
                || ! hard_reg_set_here_p (regno,
                                          (regno
                                           + HARD_REGNO_NREGS (regno,
-                                                              inmode)),
+                                                              rel_mode)),
                                          PATTERN (this_insn)))
            /* ??? Why is this code so different from the previous?
               Is there any simple coherent way to describe the two together?
@@ -1481,9 +1485,9 @@ push_reload (in, out, inloc, outloc, class,
                        == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))
                             + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
            /* Make sure the operand fits in the reg that dies.  */
-           && GET_MODE_SIZE (inmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
+           && (GET_MODE_SIZE (rel_mode)
+               <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))))
            && HARD_REGNO_MODE_OK (regno, inmode)
-           && GET_MODE_SIZE (outmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
            && HARD_REGNO_MODE_OK (regno, outmode))
          {
            unsigned int offs;
@@ -1498,7 +1502,7 @@ push_reload (in, out, inloc, outloc, class,
 
            if (offs == nregs)
              {
-               rld[i].reg_rtx = gen_rtx_REG (inmode, regno);
+               rld[i].reg_rtx = gen_rtx_REG (rel_mode, regno);
                break;
              }
          }