(fill_simple_delay_slots): For the epilogue case...
authorJim Wilson <wilson@gcc.gnu.org>
Thu, 29 Dec 1994 02:39:10 +0000 (18:39 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Thu, 29 Dec 1994 02:39:10 +0000 (18:39 -0800)
(fill_simple_delay_slots): For the epilogue case, set needed
to include frame pointer and stack pointer, don't include all of
end_of_function_needs. Reject insn if it sets a previously set
resource.

From-SVN: r8698

gcc/reorg.c

index cd7d6528f24bfd1f186a3baa3f0b1041935824a0..e4058d7e4142330f9c16908acbfbfc9f54dcf232 100644 (file)
@@ -3146,9 +3146,27 @@ fill_simple_delay_slots (first, non_jumps_p)
     return;
 
   slots_filled = 0;
-  needed = end_of_function_needs;
   CLEAR_RESOURCE (&set);
 
+  /* The frame pointer and stack pointer are needed at the beginning of
+     the epilogue, so instructions setting them can not be put in the
+     epilogue delay slot.  However, everything else needed at function
+     end is safe, so we don't want to use end_of_function_needs here.  */
+  CLEAR_RESOURCE (&needed);
+  if (frame_pointer_needed)
+    {
+      SET_HARD_REG_BIT (needed.regs, FRAME_POINTER_REGNUM);
+#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
+      SET_HARD_REG_BIT (needed.regs, HARD_FRAME_POINTER_REGNUM);
+#endif
+#ifdef EXIT_IGNORE_STACK
+      if (! EXIT_IGNORE_STACK)
+#endif
+       SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
+    }
+  else
+    SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
+
   for (trial = get_last_insn (); ! stop_search_p (trial, 1);
        trial = PREV_INSN (trial))
     {
@@ -3160,6 +3178,7 @@ fill_simple_delay_slots (first, non_jumps_p)
 
       if (! insn_references_resource_p (trial, &set, 1)
          && ! insn_sets_resource_p (trial, &needed, 1)
+         && ! insn_sets_resource_p (trial, &set, 1)
 #ifdef HAVE_cc0
          /* Don't want to mess with cc0 here.  */
          && ! reg_mentioned_p (cc0_rtx, pat)