From e245d3af6fd6a1362cc83eff738b2a59a3c636cc Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 20 Mar 2000 14:40:50 -0800 Subject: [PATCH] calls.c (expand_call): Don't bother generating tail call sequences if there are pending cleanups. * calls.c (expand_call): Don't bother generating tail call sequences if there are pending cleanups. Use expand_start_target_temps/expand_end_target_temps to elide cleanups created during sibcall expansion. From-SVN: r32653 --- gcc/ChangeLog | 7 +++++++ gcc/calls.c | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d98fbf16e23..dcb99bc0f34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-03-20 Richard Henderson + + * calls.c (expand_call): Don't bother generating tail call + sequences if there are pending cleanups. Use + expand_start_target_temps/expand_end_target_temps to elide + cleanups created during sibcall expansion. + 2000-03-20 Geoff Keating * configure.in: Set $IFS to a value if it doesn't already have one diff --git a/gcc/calls.c b/gcc/calls.c index 21feeed39ac..104cc0753f4 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2020,7 +2020,8 @@ expand_call (exp, target, ignore) safe_for_reeval = 0; if (optimize >= 2 && currently_expanding_call == 1 - && stmt_loop_nest_empty ()) + && stmt_loop_nest_empty () + && ! any_pending_cleanups (1)) { /* Verify that each argument is safe for re-evaluation. */ for (p = actparms; p; p = TREE_CHAIN (p)) @@ -2152,6 +2153,12 @@ expand_call (exp, target, ignore) || ! FUNCTION_OK_FOR_SIBCALL (fndecl)) continue; + /* We know at this point that there are not currently any + pending cleanups. If, however, in the process of evaluating + the arguments we were to create some, we'll need to be + able to get rid of them. */ + expand_start_target_temps (); + /* State variables we need to save and restore between iterations. */ save_pending_stack_adjust = pending_stack_adjust; @@ -2925,6 +2932,14 @@ expand_call (exp, target, ignore) if (args[i].aligned_regs) free (args[i].aligned_regs); + if (pass == 0) + { + /* Undo the fake expand_start_target_temps we did earlier. If + there had been any cleanups created, we've already set + sibcall_failure. */ + expand_end_target_temps (); + } + insns = get_insns (); end_sequence (); -- 2.30.2