diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-06-29 16:01:31 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-06-29 16:01:31 -0400 |
commit | daf55ac69a0ab8a559d68d9b0b0b1fc2b120de26 (patch) | |
tree | ca5947c577a6f8e4a5a65698e32477a2fd63954c /gcc | |
parent | 245d26eb97c0a61329f0d3be2b7cc9357ef4bde3 (diff) | |
download | gcc-daf55ac69a0ab8a559d68d9b0b0b1fc2b120de26.zip gcc-daf55ac69a0ab8a559d68d9b0b0b1fc2b120de26.tar.gz gcc-daf55ac69a0ab8a559d68d9b0b0b1fc2b120de26.tar.bz2 |
(global_alloc): Make a more accurate attempt to see if the frame pointer will be used.
(global_alloc): Make a more accurate attempt to see if the frame pointer will
be used.
If it is, show HARD_FRAME_POINTER_REGNUM used if its not the same as
FRAME_POINTER_REGNUM.
From-SVN: r7604
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/global.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/gcc/global.c b/gcc/global.c index c3dc749..297e930 100644 --- a/gcc/global.c +++ b/gcc/global.c @@ -246,7 +246,7 @@ static struct { int allocno1, allocno2;} static rtx *regs_set; static int n_regs_set; -/* All register that can be eliminated. */ +/* All registers that can be eliminated. */ static HARD_REG_SET eliminable_regset; @@ -279,6 +279,13 @@ global_alloc (file) #ifdef ELIMINABLE_REGS static struct {int from, to; } eliminables[] = ELIMINABLE_REGS; #endif + int need_fp + = (! flag_omit_frame_pointer +#ifdef EXIT_IGNORE_STACK + || (current_function_calls_alloca && EXIT_IGNORE_STACK) +#endif + || FRAME_POINTER_REQUIRED); + register int i; rtx x; @@ -302,20 +309,18 @@ global_alloc (file) SET_HARD_REG_BIT (eliminable_regset, eliminables[i].from); if (! CAN_ELIMINATE (eliminables[i].from, eliminables[i].to) - || (eliminables[i].from == HARD_FRAME_POINTER_REGNUM - && (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED))) + || (eliminables[i].to == STACK_POINTER_REGNUM && need_fp)) SET_HARD_REG_BIT (no_global_alloc_regs, eliminables[i].from); } #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM - if (!flag_omit_frame_pointer || FRAME_POINTER_REQUIRED) + SET_HARD_REG_BIT (eliminable_regset, HARD_FRAME_POINTER_REGNUM); + if (need_fp) SET_HARD_REG_BIT (no_global_alloc_regs, HARD_FRAME_POINTER_REGNUM); #endif + #else SET_HARD_REG_BIT (eliminable_regset, FRAME_POINTER_REGNUM); - - /* If we know we will definitely not be eliminating the frame pointer, - don't allocate it. */ - if (! flag_omit_frame_pointer || FRAME_POINTER_REQUIRED) + if (need_fp) SET_HARD_REG_BIT (no_global_alloc_regs, FRAME_POINTER_REGNUM); #endif |