regrename.c (scan_rtx_reg): Handle the case where we write to an open chain in a...
authorBernd Schmidt <bernds@codesourcery.com>
Mon, 20 Jun 2011 17:16:10 +0000 (17:16 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Mon, 20 Jun 2011 17:16:10 +0000 (17:16 +0000)
* regrename.c (scan_rtx_reg): Handle the case where we write to an
open chain in a smaller mode without failing the entire block.

From-SVN: r175225

gcc/ChangeLog
gcc/regrename.c

index 30b07fabb4de1005fe046eefd7c5b128060441c2..59300e5e82166d86f3f6b4408b2fd280f2f2184f 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-20  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * regrename.c (scan_rtx_reg): Handle the case where we write to an
+       open chain in a smaller mode without failing the entire block.
+
 2011-06-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR middle-end/47725
index f313d084ee34d91cef46bf9fba6675e75499f94c..b83c7258fb7fb956a0e7591be18fcbfafda162b1 100644 (file)
@@ -721,25 +721,34 @@ scan_rtx_reg (rtx insn, rtx *loc, enum reg_class cl, enum scan_actions action,
         In either case, we remove this element from open_chains.  */
 
       if ((action == terminate_dead || action == terminate_write)
-         && superset)
+         && (superset || subset))
        {
          unsigned nregs;
 
          head->terminated = 1;
+         if (subset && !superset)
+           head->cannot_rename = 1;
          head->next_chain = closed_chains;
          closed_chains = head;
          bitmap_clear_bit (&open_chains_set, head->id);
 
          nregs = head->nregs;
          while (nregs-- > 0)
-           CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
+           {
+             CLEAR_HARD_REG_BIT (live_in_chains, head->regno + nregs);
+             if (subset && !superset
+                 && (head->regno + nregs < this_regno
+                     || head->regno + nregs >= this_regno + this_nregs))
+               SET_HARD_REG_BIT (live_hard_regs, head->regno + nregs);
+           }
 
          *p = next;
          if (dump_file)
            fprintf (dump_file,
-                    "Closing chain %s (%d) at insn %d (%s)\n",
+                    "Closing chain %s (%d) at insn %d (%s%s)\n",
                     reg_names[head->regno], head->id, INSN_UID (insn),
-                    scan_actions_name[(int) action]);
+                    scan_actions_name[(int) action],
+                    superset ? ", superset" : subset ? ", subset" : "");
        }
       else if (action == terminate_dead || action == terminate_write)
        {