aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoey Ye <joey.ye@intel.com>2008-06-30 17:51:49 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2008-06-30 10:51:49 -0700
commit38aa4d08b72826276844708d538e5e610d65f0b2 (patch)
tree59bec96239e410f2d7ce10e12f5364626f97553d /gcc
parentaad416fbb58e079606dc7b8f1bce83efce2f3117 (diff)
downloadgcc-38aa4d08b72826276844708d538e5e610d65f0b2.zip
gcc-38aa4d08b72826276844708d538e5e610d65f0b2.tar.gz
gcc-38aa4d08b72826276844708d538e5e610d65f0b2.tar.bz2
global.c (compute_regsets): Set frame_pointer_needed here.
2008-06-30 Joey Ye <joey.ye@intel.com> H.J. Lu <hongjiu.lu@intel.com> * global.c (compute_regsets): Set frame_pointer_needed here. * reload1.c (init_elim_table): Don't set frame_pointer_needed here. Co-Authored-By: H.J. Lu <hongjiu.lu@intel.com> From-SVN: r137275
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/global.c12
-rw-r--r--gcc/reload1.c17
3 files changed, 22 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index db3b7f1..95753ff 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2008-06-30 Joey Ye <joey.ye@intel.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ * global.c (compute_regsets): Set frame_pointer_needed here.
+
+ * reload1.c (init_elim_table): Don't set frame_pointer_needed
+ here.
+
2008-06-30 Aaron W. LaFramboise <aaronavay62@aaronwl.com>
* doc/install.texi (specific): Expand Windows build notes.
diff --git a/gcc/global.c b/gcc/global.c
index 8ccad6b..9c22e91 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -206,7 +206,9 @@ static void build_insn_chain (void);
This will normally be called with ELIM_SET as the file static
variable eliminable_regset, and NO_GLOBAL_SET as the file static
- variable NO_GLOBAL_ALLOC_REGS. */
+ variable NO_GLOBAL_ALLOC_REGS.
+
+ It also initializes global flag frame_pointer_needed. */
static void
compute_regsets (HARD_REG_SET *elim_set,
@@ -222,11 +224,19 @@ compute_regsets (HARD_REG_SET *elim_set,
static const struct {const int from, to; } eliminables[] = ELIMINABLE_REGS;
size_t i;
#endif
+
+ /* FIXME: If EXIT_IGNORE_STACK is set, we will not save and restore
+ sp for alloca. So we can't eliminate the frame pointer in that
+ case. At some point, we should improve this by emitting the
+ sp-adjusting insns for this case. */
int need_fp
= (! flag_omit_frame_pointer
|| (cfun->calls_alloca && EXIT_IGNORE_STACK)
+ || crtl->accesses_prior_frames
|| FRAME_POINTER_REQUIRED);
+ frame_pointer_needed = need_fp;
+
max_regno = max_reg_num ();
compact_blocks ();
diff --git a/gcc/reload1.c b/gcc/reload1.c
index b1e9088..297acbf 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -3695,7 +3695,9 @@ elimination_target_reg_p (rtx x)
return false;
}
-/* Initialize the table of registers to eliminate. */
+/* Initialize the table of registers to eliminate.
+ Pre-condition: global flag frame_pointer_needed has been set before
+ calling this function. */
static void
init_elim_table (void)
@@ -3708,19 +3710,6 @@ init_elim_table (void)
if (!reg_eliminate)
reg_eliminate = XCNEWVEC (struct elim_table, NUM_ELIMINABLE_REGS);
- /* Does this function require a frame pointer? */
-
- frame_pointer_needed = (! flag_omit_frame_pointer
- /* ?? If EXIT_IGNORE_STACK is set, we will not save
- and restore sp for alloca. So we can't eliminate
- the frame pointer in that case. At some point,
- we should improve this by emitting the
- sp-adjusting insns for this case. */
- || (cfun->calls_alloca
- && EXIT_IGNORE_STACK)
- || crtl->accesses_prior_frames
- || FRAME_POINTER_REQUIRED);
-
num_eliminable = 0;
#ifdef ELIMINABLE_REGS