aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2000-02-28 12:55:43 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2000-02-28 11:55:43 +0000
commit4e217aed3db141e5ad2195bd93d9459125202dbc (patch)
treeea6dbb8319ab6543e1633fcc2f65ec0b8ab63e0a /gcc
parent035a6890e978b3ba9e23b8c202c2dbf997f2b673 (diff)
downloadgcc-4e217aed3db141e5ad2195bd93d9459125202dbc.zip
gcc-4e217aed3db141e5ad2195bd93d9459125202dbc.tar.gz
gcc-4e217aed3db141e5ad2195bd93d9459125202dbc.tar.bz2
calls.c (expand_call): Attempt to combine stack adjustments with pending stack adjustments.
Thu Feb 24 17:17:29 MET 2000 Jan Hubicka <jh@suse.cz> * calls.c (expand_call): Attempt to combine stack adjustments with pending stack adjustments. From-SVN: r32230
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/calls.c18
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