aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2003-03-21 23:18:18 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2003-03-21 22:18:18 +0000
commitd7394366f2888097b0cb0cc38fc865d78e35b848 (patch)
tree055347473418fd6b6e176a45131ccee31a64b344 /gcc
parent5dc96d60e1bd5a9bb3f4f100c94d2a2db71b915d (diff)
downloadgcc-d7394366f2888097b0cb0cc38fc865d78e35b848.zip
gcc-d7394366f2888097b0cb0cc38fc865d78e35b848.tar.gz
gcc-d7394366f2888097b0cb0cc38fc865d78e35b848.tar.bz2
i386.c (ix86_compute_frame_layout): Recompute fast prologues only when amount of saved regs changed.
* i386.c (ix86_compute_frame_layout): Recompute fast prologues only when amount of saved regs changed. (ix86_init_machine_status): Initialize use_fast_prologue_epilgoue_nregs. * i386.h (machine_function): New fields use_fast_prologue_epilgoue_nregs. From-SVN: r64682
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.c13
-rw-r--r--gcc/config/i386/i386.h3
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e8045ca..29d1c3c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Fri Mar 21 23:12:33 CET 2003 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (ix86_compute_frame_layout): Recompute fast prologues
+ only when amount of saved regs changed.
+ (ix86_init_machine_status): Initialize use_fast_prologue_epilgoue_nregs.
+ * i386.h (machine_function): New fields use_fast_prologue_epilgoue_nregs.
+
Fri Mar 21 22:44:33 CET 2003 Jan Hubicka <jh@suse.cz>
PR inline-asm/7916
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 5959a91..8097c61 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4914,10 +4914,16 @@ ix86_compute_frame_layout (frame)
frame->nregs = ix86_nsaved_regs ();
total_size = size;
- if (!optimize_size && !reload_completed)
+ /* During reload iteration the amount of registers saved can change.
+ Recompute the value as needed. Do not recompute when amount of registers
+ didn't change as reload does mutiple calls to the function and does not
+ expect the decision to change within single iteration. */
+ if (!optimize_size
+ && cfun->machine->use_fast_prologue_epilogue_nregs != frame->nregs)
{
int count = frame->nregs;
+ cfun->machine->use_fast_prologue_epilogue_nregs = count;
/* The fast prologue uses move instead of push to save registers. This
is significantly longer, but also executes faster as modern hardware
can execute the moves in parallel, but can't do that for push/pop.
@@ -11784,7 +11790,10 @@ ix86_expand_call (retval, fnaddr, callarg1, callarg2, pop, sibcall)
static struct machine_function *
ix86_init_machine_status ()
{
- return ggc_alloc_cleared (sizeof (struct machine_function));
+ struct machine_function *f;
+
+ f = ggc_alloc_cleared (sizeof (struct machine_function));
+ f->use_fast_prologue_epilogue_nregs = -1;
}
/* Return a MEM corresponding to a stack slot with mode MODE.
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index ce66622..8677875 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -3223,6 +3223,9 @@ struct machine_function GTY(())
/* Set by ix86_compute_frame_layout and used by prologue/epilogue expander to
determine the style used. */
int use_fast_prologue_epilogue;
+ /* Number of saved registers USE_FAST_PROLOGUE_EPILOGUE has been computed
+ for. */
+ int use_fast_prologue_epilogue_nregs;
};
#define ix86_stack_locals (cfun->machine->stack_locals)