From 4e217aed3db141e5ad2195bd93d9459125202dbc Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Mon, 28 Feb 2000 12:55:43 +0100 Subject: calls.c (expand_call): Attempt to combine stack adjustments with pending stack adjustments. Thu Feb 24 17:17:29 MET 2000 Jan Hubicka * calls.c (expand_call): Attempt to combine stack adjustments with pending stack adjustments. From-SVN: r32230 --- gcc/ChangeLog | 5 +++++ gcc/calls.c | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c064d94..9d36cce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Mon Feb 28 12:53:57 MET 2000 Jan Hubicka + + * calls.c (expand_call): Attempt to combine stack adjustments with + pending stack adjustments. + Mon Feb 28 11:34:43 2000 J"orn Rennecke * loop.c (reg_in_basic_block_p): Don't abort when falling through diff --git a/gcc/calls.c b/gcc/calls.c index 07f4c48..dfa52e0 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2276,8 +2276,22 @@ expand_call (exp, target, ignore) #ifdef PREFERRED_STACK_BOUNDARY /* If we push args individually in reverse order, perform stack alignment before the first push (the last arg). */ - if (argblock == 0) - anti_adjust_stack (GEN_INT (args_size.constant - unadjusted_args_size)); + if (args_size.constant != unadjusted_args_size) + { + /* When the stack adjustment is pending, + we get better code by combining the adjustments. */ + if (pending_stack_adjust && !is_const) + { + args_size.constant = (unadjusted_args_size + + ((pending_stack_adjust + args_size.constant + - unadjusted_args_size) + % (preferred_stack_boundary / BITS_PER_UNIT))); + pending_stack_adjust -= args_size.constant - unadjusted_args_size; + do_pending_stack_adjust (); + } + else if (argblock == 0) + anti_adjust_stack (GEN_INT (args_size.constant - unadjusted_args_size)); + } #endif #endif -- cgit v1.1