regrename.c (scan_rtx_reg): Terminate the chain rather than abort on mark_read with...
authorRichard Henderson <rth@redhat.com>
Wed, 22 Nov 2000 03:19:34 +0000 (19:19 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 22 Nov 2000 03:19:34 +0000 (19:19 -0800)
        * regrename.c (scan_rtx_reg): Terminate the chain rather than
        abort on mark_read with NO_REGS.

From-SVN: r37644

gcc/ChangeLog
gcc/regrename.c

index a925bacc9f24573f9fb724c6d7ce4fee52b06f7f..2cbd967234fbe7a5c7b2d32107af543e77262002 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-21  Richard Henderson  <rth@redhat.com>
+
+       * regrename.c (scan_rtx_reg): Terminate the chain rather than
+       abort on mark_read with NO_REGS.
+
 2000-11-21  Mike Stump  <mrs@wrs.com>
 
        * fixinc/fixtests.c (TEST_FOR_FIX_PROC_HEAD): Fix to allow
index c444af8326e1e5fcbf295620acddf906ac930bcf..19cc9e865cca036ee118c0f708a43d3f3a7727b2 100644 (file)
@@ -325,26 +325,36 @@ scan_rtx_reg (insn, loc, class, action, type)
 
          if (regno + nregs <= this_regno
              || this_regno + this_nregs <= regno)
-           p = &this->next_chain;
-         else if (action == mark_read)
+           {
+             p = &this->next_chain;
+             continue;
+           }
+
+         if (action == mark_read)
            {
              if (! exact_match)
                abort ();
-             if (class == NO_REGS)
-               abort ();
 
-             this = (struct du_chain *)
-               obstack_alloc (&rename_obstack, sizeof (struct du_chain));
-             this->next_use = *p;
-             this->next_chain = (*p)->next_chain;
-             this->loc = loc;
-             this->insn = insn;
-             this->class = class;
-             this->need_caller_save_reg = 0;
-             *p = this;
-             return;
+             /* ??? Class NO_REGS can happen if the md file makes use of 
+                EXTRA_CONSTRAINTS to match registers.  Which is arguably
+                wrong, but there we are.  Since we know not what this may
+                be replaced with, terminate the chain.  */
+             if (class != NO_REGS)
+               {
+                 this = (struct du_chain *)
+                   obstack_alloc (&rename_obstack, sizeof (struct du_chain));
+                 this->next_use = *p;
+                 this->next_chain = (*p)->next_chain;
+                 this->loc = loc;
+                 this->insn = insn;
+                 this->class = class;
+                 this->need_caller_save_reg = 0;
+                 *p = this;
+                 return;
+               }
            }
-         else if (action != terminate_overlapping_read || ! exact_match)
+
+         if (action != terminate_overlapping_read || ! exact_match)
            {
              struct du_chain *next = this->next_chain;