]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport reload_combine bugfix
authorBernd Schmidt <bernds@redhat.com>
Tue, 3 Apr 2001 14:46:54 +0000 (14:46 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 3 Apr 2001 14:46:54 +0000 (14:46 +0000)
From-SVN: r41057

gcc/ChangeLog
gcc/reload1.c

index e8552ac619bb4ec894691e5d8274d47a9f6ec8c1..d12f8e2b8ca80224b9f4729493e8ce286d50de0b 100644 (file)
        (get_last_value_validate) : Same.
        (get_last_value) : Same.
 
+       Fri Mar  3 12:49:28 2000  J"orn Rennecke <amylaar@cygnus.co.uk>
+        * reload1.c (reload_combine_note_use): Handle return register USEs.
+       REG case: Handle multi-hard-register hard regs.
+
 2001-03-30  Bernd Schmidt  <bernds@redhat.com>
 
        * jump.c (delete_barrier_successors): Fix error in last change.
index f8d87517a1b619ec365acfa31be327f8a8df0951..24eb0116a7abe57bb011012fa70d17da52df9a90 100644 (file)
@@ -9970,6 +9970,21 @@ reload_combine_note_use (xp, insn)
        }
       break;
 
+    case USE:
+      /* If this is the USE of a return value, we can't change it.  */
+      if (GET_CODE (XEXP (x, 0)) == REG && REG_FUNCTION_VALUE_P (XEXP (x, 0)))
+       {
+       /* Mark the return register as used in an unknown fashion.  */
+         rtx reg = XEXP (x, 0);
+         int regno = REGNO (reg);
+         int nregs = HARD_REGNO_NREGS (regno, GET_MODE (reg));
+
+         while (--nregs >= 0)
+           reg_state[regno + nregs].use_index = -1;
+         return;
+       }
+      break;
+
     case CLOBBER:
       if (GET_CODE (SET_DEST (x)) == REG)
        return;
@@ -9986,12 +10001,23 @@ reload_combine_note_use (xp, insn)
       {
        int regno = REGNO (x);
        int use_index;
+       int nregs;
 
        /* Some spurious USEs of pseudo registers might remain.
           Just ignore them.  */
        if (regno >= FIRST_PSEUDO_REGISTER)
          return;
 
+       nregs = HARD_REGNO_NREGS (regno, GET_MODE (x));
+
+       /* We can't substitute into multi-hard-reg uses.  */
+       if (nregs > 1)
+         {
+           while (--nregs >= 0)
+             reg_state[regno + nregs].use_index = -1;
+           return;
+         }
+
        /* If this register is already used in some unknown fashion, we
           can't do anything.
           If we decrement the index from zero to -1, we can't store more