calls.c (expand_call): Disallow sibcalls to noreturn functions.

* calls.c (expand_call): Disallow sibcalls to noreturn functions.
        * flow.c (make_edges): Revert last change.

        * config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test
        TREE_THIS_VOLATILE.
        * config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise.

From-SVN: r36781
This commit is contained in:
Richard Henderson 2000-10-07 13:53:21 -07:00 committed by Richard Henderson
parent 9ab916b8ed
commit 9a1ba437e8
5 changed files with 15 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2000-10-07 Richard Henderson <rth@cygnus.com>
* calls.c (expand_call): Disallow sibcalls to noreturn functions.
* flow.c (make_edges): Revert last change.
* config/alpha/alpha.h (FUNCTION_OK_FOR_SIBCALL): Don't test
TREE_THIS_VOLATILE.
* config/pa/pa.h (FUNCTION_OK_FOR_SIBCALL): Likewise.
2000-10-06 David O'Brien <obrien@dragon.nuxi.com>
* config/alpha/elf.h: Standardize the formatting.

View File

@ -2463,6 +2463,7 @@ expand_call (exp, target, ignore)
before the sibcall_epilogue. */
|| fndecl == NULL_TREE
|| (flags & (ECF_RETURNS_TWICE | ECF_LONGJMP))
|| TREE_THIS_VOLATILE (fndecl)
|| !FUNCTION_OK_FOR_SIBCALL (fndecl)
/* If this function requires more stack slots than the current
function, we cannot change it into a sibling call. */

View File

@ -1187,8 +1187,7 @@ extern int alpha_memory_latency;
#define FUNCTION_OK_FOR_SIBCALL(DECL) \
(DECL \
&& ((TREE_ASM_WRITTEN (DECL) && !flag_pic) \
|| ! TREE_PUBLIC (DECL) \
|| (0 && TREE_THIS_VOLATILE (DECL))))
|| ! TREE_PUBLIC (DECL)))
/* Try to output insns to set TARGET equal to the constant C if it can be
done in less than N insns. Do all computations in MODE. Returns the place

View File

@ -2014,8 +2014,7 @@ while (0)
#define FUNCTION_OK_FOR_SIBCALL(DECL) \
(DECL \
&& ! TARGET_64BIT \
&& (! TREE_PUBLIC (DECL) \
|| TREE_THIS_VOLATILE (DECL)))
&& ! TREE_PUBLIC (DECL))
#define PREDICATE_CODES \
{"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \

View File

@ -1152,12 +1152,8 @@ make_edges (label_value_list)
wouldn't have created the sibling call in the first place. */
if (code == CALL_INSN && SIBLING_CALL_P (insn))
{
if (! find_reg_note (insn, REG_NORETURN, NULL_RTX))
make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
}
else
make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
/* If this is a CALL_INSN, then mark it as reaching the active EH
handler for this CALL_INSN. If we're handling asynchronous
@ -1165,7 +1161,7 @@ make_edges (label_value_list)
Also mark the CALL_INSN as reaching any nonlocal goto handler. */
if (code == CALL_INSN || asynchronous_exceptions)
else if (code == CALL_INSN || asynchronous_exceptions)
{
/* Add any appropriate EH edges. We do this unconditionally
since there may be a REG_EH_REGION or REG_EH_RETHROW note