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
This commit is contained in:
Richard Henderson 2000-03-20 14:40:50 -08:00 committed by Richard Henderson
parent e139e81e89
commit e245d3af6f
2 changed files with 23 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2000-03-20 Richard Henderson <rth@cygnus.com>
* 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 <geoffk@cygnus.com>
* configure.in: Set $IFS to a value if it doesn't already have one

View File

@ -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 ();