Fix sched REG_DEAD note handling bug found by post-reload-flow pass.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Oct 1998 19:06:48 +0000 (19:06 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Oct 1998 19:06:48 +0000 (19:06 +0000)
* sched.c (update_flow_info): Add code to ! found_orig_dest case to
handle deleted no-op moves of hard registers.
* haifa-sched.c (update_flow_info): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23431 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/haifa-sched.c
gcc/sched.c

index b67825d..22c38bc 100644 (file)
@@ -1,3 +1,9 @@
+Thu Oct 29 19:05:17 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * sched.c (update_flow_info): Add code to ! found_orig_dest case to
+       handle deleted no-op moves of hard registers.
+       * haifa-sched.c (update_flow_info): Likewise.
+
 Thu Oct 29 18:07:47 1998  Jeffrey A Law  (law@cygnus.com)
 
        * mips.md (reload_{in,out}{si,di}): Emit a USE of HILO at the end
index 806bb39..ea04390 100644 (file)
@@ -8340,8 +8340,28 @@ update_flow_info (notes, first, last, orig_insn)
        }
       else if (!found_orig_dest)
        {
-         /* This should never happen.  */
-         abort ();
+         int i, regno;
+
+         /* Should never reach here for a pseudo reg.  */
+         if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER)
+           abort ();
+
+         /* This can happen for a hard register, if the splitter
+            does not bother to emit instructions which would be no-ops.
+            We try to verify that this is the case by checking to see if
+            the original instruction uses all of the registers that it
+            set.  This case is OK, because deleting a no-op can not affect
+            REG_DEAD notes on other insns.  If this is not the case, then
+            abort.  */
+         
+         regno = REGNO (orig_dest);
+         for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1;
+              i >= 0; i--)
+           if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn,
+                                    NULL_PTR))
+             break;
+         if (i >= 0)
+           abort ();
        }
     }
 
index 1d81407..e27f70e 100644 (file)
@@ -4174,8 +4174,28 @@ update_flow_info (notes, first, last, orig_insn)
        }
       else if (! found_orig_dest)
        {
-         /* This should never happen.  */
-         abort ();
+         int i, regno;
+
+         /* Should never reach here for a pseudo reg.  */
+         if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER)
+           abort ();
+
+         /* This can happen for a hard register, if the splitter
+            does not bother to emit instructions which would be no-ops.
+            We try to verify that this is the case by checking to see if
+            the original instruction uses all of the registers that it
+            set.  This case is OK, because deleting a no-op can not affect
+            REG_DEAD notes on other insns.  If this is not the case, then
+            abort.  */
+         
+         regno = REGNO (orig_dest);
+         for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1;
+              i >= 0; i--)
+           if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn,
+                                    NULL_PTR))
+             break;
+         if (i >= 0)
+           abort ();
        }
     }