diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a925bacc9f24573f9fb724c6d7ce4fee52b06f7f..2cbd967234fbe7a5c7b2d32107af543e77262002 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/regrename.c b/gcc/regrename.c
index c444af8326e1e5fcbf295620acddf906ac930bcf..19cc9e865cca036ee118c0f708a43d3f3a7727b2 100644
--- a/gcc/regrename.c
+++ b/gcc/regrename.c
@@ -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;