* 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
+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.
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. */
#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
#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}}, \
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
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