Commit f5e846c8 by Mark Mitchell Committed by Mark Mitchell

calls.c (expand_call): Handle cleanups in tail-recursion arguments analagously…

calls.c (expand_call): Handle cleanups in tail-recursion arguments analagously to cleanups in sibling...

	* calls.c (expand_call): Handle cleanups in tail-recursion
	arguments analagously to cleanups in sibling calls.

From-SVN: r34143
parent 0d0cd441
2000-05-24 Mark Mitchell <mark@codesourcery.com>
* calls.c (expand_call): Handle cleanups in tail-recursion
arguments analagously to cleanups in sibling calls.
2000-05-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* simplify-rtx.c: Rename macro SIGN_EXTEND to HWI_SIGN_EXTEND.
......@@ -2400,7 +2400,7 @@ expand_call (exp, target, ignore)
break;
case 1: /* Mildly unsafe. */
args[i].tree_value = unsave_expr (args[i].tree_value);
args[i].tree_value = unsave_expr (args[i].tree_value);
break;
case 2: /* Wildly unsafe. */
......@@ -2444,9 +2444,20 @@ expand_call (exp, target, ignore)
made until after RTL generation for the entire function is
complete. */
start_sequence ();
/* If expanding any of the arguments creates cleanups, we can't
do a tailcall. So, we'll need to pop the pending cleanups
list. If, however, all goes well, and there are no cleanups
then the call to expand_start_target_temps will have no
effect. */
expand_start_target_temps ();
if (optimize_tail_recursion (actparms, get_last_insn ()))
tail_recursion_insns = get_insns ();
{
if (any_pending_cleanups (1))
try_tail_call = try_tail_recursion = 0;
else
tail_recursion_insns = get_insns ();
}
expand_end_target_temps ();
end_sequence ();
/* Restore the original pending stack adjustment for the sibling and
......
// Build don't link:
// Origin: Nathan Sidwell <nathan@codesourcery.com>
// Special g++ Options: -O2
struct A
{
A (int) { }
~A () { }
int get () const { return 0; }
};
void f (const A &s) {
f (s.get ());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment