diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/calls.c | 18 |
2 files changed, 21 insertions, 2 deletions
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 <jh@suse.cz> + + * calls.c (expand_call): Attempt to combine stack adjustments with + pending stack adjustments. + Mon Feb 28 11:34:43 2000 J"orn Rennecke <amylaar@cygnus.co.uk> * 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 |
