function.c (expand_function_end): Do not emit a jump to the "naked" return label for fall-through returns.

* function.c (expand_function_end): Do not emit a jump to the "naked"
	return label for fall-through returns.
	* except.c (sjlj_emit_function_exit): Always place the call to the
	unregister function at the location installed by expand_function_end.

From-SVN: r146570
This commit is contained in:
Ulrich Weigand 2009-04-22 11:31:56 +00:00 committed by Ulrich Weigand
parent 9925bce0b8
commit 4c33221ccd
3 changed files with 14 additions and 29 deletions

View File

@ -1,3 +1,10 @@
2009-04-22 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* function.c (expand_function_end): Do not emit a jump to the "naked"
return label for fall-through returns.
* except.c (sjlj_emit_function_exit): Always place the call to the
unregister function at the location installed by expand_function_end.
2009-04-22 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39845

View File

@ -1968,9 +1968,7 @@ sjlj_emit_function_exit_after (rtx after)
static void
sjlj_emit_function_exit (void)
{
rtx seq;
edge e;
edge_iterator ei;
rtx seq, insn;
start_sequence ();
@ -1984,31 +1982,11 @@ sjlj_emit_function_exit (void)
post-dominates all can_throw_internal instructions. This is
the last possible moment. */
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
if (e->flags & EDGE_FALLTHRU)
break;
if (e)
{
rtx insn;
insn = crtl->eh.sjlj_exit_after;
if (LABEL_P (insn))
insn = NEXT_INSN (insn);
/* Figure out whether the place we are supposed to insert libcall
is inside the last basic block or after it. In the other case
we need to emit to edge. */
gcc_assert (e->src->next_bb == EXIT_BLOCK_PTR);
for (insn = BB_HEAD (e->src); ; insn = NEXT_INSN (insn))
{
if (insn == crtl->eh.sjlj_exit_after)
{
if (LABEL_P (insn))
insn = NEXT_INSN (insn);
emit_insn_after (seq, insn);
return;
}
if (insn == BB_END (e->src))
break;
}
insert_insn_on_edge (seq, e);
}
emit_insn_after (seq, insn);
}
static void

View File

@ -4804,7 +4804,6 @@ expand_function_end (void)
start_sequence ();
clobber_return_register ();
expand_naked_return ();
seq = get_insns ();
end_sequence ();
@ -4812,7 +4811,8 @@ expand_function_end (void)
}
/* Output the label for the naked return from the function. */
emit_label (naked_return_label);
if (naked_return_label)
emit_label (naked_return_label);
/* @@@ This is a kludge. We want to ensure that instructions that
may trap are not moved into the epilogue by scheduling, because