* sched-deps.c (sched_analyze): Make a call read the frame pointer.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Jan 2002 18:07:44 +0000 (18:07 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Jan 2002 18:07:44 +0000 (18:07 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49341 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/sched-deps.c

index 6598e92..dc3476a 100644 (file)
@@ -1,3 +1,7 @@
+2002-01-30  Richard Henderson  <rth@redhat.com>
+
+       * sched-deps.c (sched_analyze): Make a call read the frame pointer.
+
 2002-01-30  Zack Weinberg  <zack@codesourcery.com>
 
        * expmed.c (emit_store_flag): Call protect_from_queue on op0 and op1.
index 384bab7..9f20aad 100644 (file)
@@ -1267,21 +1267,30 @@ sched_analyze (deps, head, tail)
            }
          else
            {
-             /* A call may read and modify global register variables.
-                Other call-clobbered hard regs may be clobbered.  We
-                don't know what set of fixed registers might be used
-                by the function.  It is certain that the stack pointer
-                is among them, but be conservative.  */
              for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+               /* A call may read and modify global register variables.  */
                if (global_regs[i])
                  {
                    SET_REGNO_REG_SET (reg_pending_sets, i);
                    SET_REGNO_REG_SET (reg_pending_uses, i);
                  }
+               /* Other call-clobbered hard regs may be clobbered.  */
                else if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
                  SET_REGNO_REG_SET (reg_pending_clobbers, i);
+               /* We don't know what set of fixed registers might be used
+                  by the function, but it is certain that the stack pointer
+                  is among them, but be conservative.  */
                else if (fixed_regs[i])
                  SET_REGNO_REG_SET (reg_pending_uses, i);
+               /* The frame pointer is normally not used by the function
+                  itself, but by the debugger.  */
+               /* ??? MIPS o32 is an exception.  It uses the frame pointer
+                  in the macro expansion of jal but does not represent this
+                  fact in the call_insn rtl.  */
+               else if (i == FRAME_POINTER_REGNUM
+                        || (i == HARD_FRAME_POINTER_REGNUM
+                            && (! reload_completed || frame_pointer_needed)))
+                 SET_REGNO_REG_SET (reg_pending_uses, i);
            }
 
          /* For each insn which shouldn't cross a call, add a dependence