Index: resource.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/resource.c,v retrieving revision 1.71 diff -u -p -r1.71 resource.c --- resource.c 9 Jul 2004 03:29:34 -0000 1.71 +++ resource.c 11 Jul 2004 09:05:07 -0000 @@ -836,6 +836,20 @@ mark_set_resources (rtx x, struct resour } } +/* 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 ta 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; @@ -1203,7 +1225,8 @@ init_resource_info (rtx epilogue_insn) start_of_epilogue_needs = end_of_function_needs; - while ((epilogue_insn = next_nonnote_insn (epilogue_insn))) + while ((epilogue_insn = next_nonnote_insn (epilogue_insn)) != NULL_RTX + && ! return_insn_p (epilogue_insn)) mark_set_resources (epilogue_insn, &end_of_function_needs, 0, MARK_SRC_DEST_CALL);