re PR rtl-optimization/16294 (Missed delay slot scheduling opportunity)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Sat, 17 Jul 2004 18:12:37 +0000 (20:12 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 17 Jul 2004 18:12:37 +0000 (18:12 +0000)
PR rtl-optimization/16294
* resource.c (return_insn_p): New predicate.
(mark_target_live_regs): Use it.  Special-case return insns.
(init_resource_info): Use it.  Don't scan the epilogue past
a return.

From-SVN: r84874

gcc/ChangeLog
gcc/resource.c

index c86cd8e7a5ee4a068006616e90882e02abbf3bb3..7d4756cc4c4311406f0762ea2adb05debb904f21 100644 (file)
@@ -1,3 +1,11 @@
+2004-07-17  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR rtl-optimization/16294
+       * resource.c (return_insn_p): New predicate.
+       (mark_target_live_regs): Use it.  Special-case return insns.
+       (init_resource_info): Use it.  Don't scan the epilogue past
+       a return.
+
 2004-07-17  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
 
        * loop-init.c (loop_optimizer_init, loop_optimizer_finalize): Do not
index a60e96296f33a50e824ceef239a24b5504c8b298..a536dd905a7f688aaf0dbbbe44402e3bf6052c4f 100644 (file)
@@ -836,6 +836,20 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
       }
 }
 \f
+/* Return TRUE if INSN is a return, possibly with a filled delay slot.  */
+
+static bool
+return_insn_p (rtx insn)
+{
+  if (GET_CODE (insn) == JUMP_INSN && GET_CODE (PATTERN (insn)) == RETURN)
+    return true;
+
+  if (GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
+    return return_insn_p (XVECEXP (PATTERN (insn), 0, 0));
+
+  return false;
+}
+
 /* Set the resources that are live at TARGET.
 
    If TARGET is zero, we refer to the end of the current function and can
@@ -894,6 +908,14 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
       return;
     }
 
+  /* Handle return insn.  */
+  else if (return_insn_p (target))
+    {
+      *res = end_of_function_needs;
+      mark_referenced_resources (target, res, 0);
+      return;
+    }
+
   /* We have to assume memory is needed, but the CC isn't.  */
   res->memory = 1;
   res->volatil = res->unch_memory = 0;
@@ -1204,8 +1226,12 @@ init_resource_info (rtx epilogue_insn)
   start_of_epilogue_needs = end_of_function_needs;
 
   while ((epilogue_insn = next_nonnote_insn (epilogue_insn)))
-    mark_set_resources (epilogue_insn, &end_of_function_needs, 0,
-                       MARK_SRC_DEST_CALL);
+    {
+      mark_set_resources (epilogue_insn, &end_of_function_needs, 0,
+                         MARK_SRC_DEST_CALL);
+      if (return_insn_p (epilogue_insn))
+       break;
+    }
 
   /* Allocate and initialize the tables used by mark_target_live_regs.  */
   target_hash_table = xcalloc (TARGET_HASH_PRIME, sizeof (struct target_info *));