From 38aa4d08b72826276844708d538e5e610d65f0b2 Mon Sep 17 00:00:00 2001 From: Joey Ye Date: Mon, 30 Jun 2008 17:51:49 +0000 Subject: [PATCH] global.c (compute_regsets): Set frame_pointer_needed here. 2008-06-30 Joey Ye H.J. Lu * 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 From-SVN: r137275 --- gcc/ChangeLog | 8 ++++++++ gcc/global.c | 12 +++++++++++- gcc/reload1.c | 17 +++-------------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db3b7f13dd6..95753ff9ce7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-06-30 Joey Ye + H.J. Lu + + * 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 * doc/install.texi (specific): Expand Windows build notes. diff --git a/gcc/global.c b/gcc/global.c index 8ccad6b093a..9c22e91f857 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 b1e90884712..297acbf8aa5 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 -- 2.30.2