diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fea8809b5a4..b4a53e9388d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2000-10-07 Richard Henderson + + * 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 * config/alpha/elf.h: Standardize the formatting. diff --git a/gcc/calls.c b/gcc/calls.c index 2163e51ebda..775d03d0bde 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -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. */ diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 74b98e4f6c2..21d23bbffe4 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -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 diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index feb531bf7df..3d26e044f32 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -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}}, \ diff --git a/gcc/flow.c b/gcc/flow.c index 52eed8d179c..0cb8428215b 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -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