diff options
author | Roger Sayle <roger@eyesopen.com> | 2004-09-14 22:52:41 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2004-09-14 22:52:41 +0000 |
commit | f6ae6c51dfff2dc6fd23a2a09c8fe831e8cdcbba (patch) | |
tree | 3e3217eda3fa7c4321a9da7e4e8d44dc4b9d370c /gcc/regclass.c | |
parent | 1810f6edaad290e6c4b8003deac8a2be1dd0fb68 (diff) | |
download | gcc-f6ae6c51dfff2dc6fd23a2a09c8fe831e8cdcbba.zip gcc-f6ae6c51dfff2dc6fd23a2a09c8fe831e8cdcbba.tar.gz gcc-f6ae6c51dfff2dc6fd23a2a09c8fe831e8cdcbba.tar.bz2 |
re PR rtl-optimization/9771 ([x86] wrong ebp optimisation)
PR rtl-optimization/9771
* regclass.c (CALL_REALLY_USED_REGNO_P): New macro to eliminate
conditional compilation in init_reg_sets_1.
(init_reg_sets_1): Let global_regs[i] take priority over the frame
(but not stack) pointer exceptions to regs_invalidated_by_call.
(globalize_reg): Globalizing a fixed register may need to update
regs_invalidated_by_call.
* gcc.dg/pr9771-1.c: New test case.
From-SVN: r87516
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r-- | gcc/regclass.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c index a73d886..3d5a5f8 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -104,6 +104,13 @@ static const char initial_call_used_regs[] = CALL_USED_REGISTERS; char call_really_used_regs[] = CALL_REALLY_USED_REGISTERS; #endif +#ifdef CALL_REALLY_USED_REGISTERS +#define CALL_REALLY_USED_REGNO_P(X) call_really_used_regs[X] +#else +#define CALL_REALLY_USED_REGNO_P(X) call_used_regs[X] +#endif + + /* Indexed by hard register number, contains 1 for registers that are fixed use or call used registers that cannot hold quantities across calls even if we are willing to save and restore them. call fixed @@ -454,7 +461,11 @@ init_reg_sets_1 (void) If we are generating PIC code, the PIC offset table register is preserved across calls, though the target can override that. */ - if (i == STACK_POINTER_REGNUM || i == FRAME_POINTER_REGNUM) + if (i == STACK_POINTER_REGNUM) + ; + else if (global_regs[i]) + SET_HARD_REG_BIT (regs_invalidated_by_call, i); + else if (i == FRAME_POINTER_REGNUM) ; #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM else if (i == HARD_FRAME_POINTER_REGNUM) @@ -468,13 +479,7 @@ init_reg_sets_1 (void) else if (i == (unsigned) PIC_OFFSET_TABLE_REGNUM && fixed_regs[i]) ; #endif - else if (0 -#ifdef CALL_REALLY_USED_REGISTERS - || call_really_used_regs[i] -#else - || call_used_regs[i] -#endif - || global_regs[i]) + else if (CALL_REALLY_USED_REGNO_P (i)) SET_HARD_REG_BIT (regs_invalidated_by_call, i); } @@ -800,6 +805,12 @@ globalize_reg (int i) global_regs[i] = 1; + /* If we're globalizing the frame pointer, we need to set the + appropriate regs_invalidated_by_call bit, even if it's already + set in fixed_regs. */ + if (i != STACK_POINTER_REGNUM) + SET_HARD_REG_BIT (regs_invalidated_by_call, i); + /* If already fixed, nothing else to do. */ if (fixed_regs[i]) return; @@ -813,7 +824,6 @@ globalize_reg (int i) SET_HARD_REG_BIT (fixed_reg_set, i); SET_HARD_REG_BIT (call_used_reg_set, i); SET_HARD_REG_BIT (call_fixed_reg_set, i); - SET_HARD_REG_BIT (regs_invalidated_by_call, i); } /* Now the data and code for the `regclass' pass, which happens |