summaryrefslogtreecommitdiff
path: root/gcc/regclass.c
diff options
context:
space:
mode:
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-14 22:52:41 +0000
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-14 22:52:41 +0000
commit1fbc37fff53b543aa7f76ce0f658c40bdb49d531 (patch)
tree3e3217eda3fa7c4321a9da7e4e8d44dc4b9d370c /gcc/regclass.c
parentc46ca7e9261278e49cafe1affb164e8bcfa0bd41 (diff)
downloadgcc-1fbc37fff53b543aa7f76ce0f658c40bdb49d531.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87516 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r--gcc/regclass.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c
index a73d8865bac..3d5a5f8dddd 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