From: Eric Botcazou Date: Sat, 17 Jul 2004 18:12:37 +0000 (+0200) Subject: re PR rtl-optimization/16294 (Missed delay slot scheduling opportunity) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6e456a105496a5058ccfdef441678f15de78b893;p=gcc.git re PR rtl-optimization/16294 (Missed delay slot scheduling opportunity) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c86cd8e7a5e..7d4756cc4c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-07-17 Eric Botcazou + + 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 * loop-init.c (loop_optimizer_init, loop_optimizer_finalize): Do not diff --git a/gcc/resource.c b/gcc/resource.c index a60e96296f3..a536dd905a7 100644 --- a/gcc/resource.c +++ b/gcc/resource.c @@ -836,6 +836,20 @@ mark_set_resources (rtx x, struct resources *res, int in_dest, } } +/* 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 *));