OSDN Git Service

2008-06-30 Joey Ye <joey.ye@intel.com>
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Jun 2008 17:51:49 +0000 (17:51 +0000)
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Jun 2008 17:51:49 +0000 (17:51 +0000)
    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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137275 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/global.c
gcc/reload1.c

index db3b7f1..95753ff 100644 (file)
@@ -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.
index 8ccad6b..9c22e91 100644 (file)
@@ -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 ();
 
index b1e9088..297acbf 100644 (file)
@@ -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