OSDN Git Service

* tm.texi (LOCAL_REGNO): Document.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Aug 2000 08:28:00 +0000 (08:28 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Aug 2000 08:28:00 +0000 (08:28 +0000)
        * flow.c (LOCAL_REGNO, EPILOGUE_USES): Provide default.
        (mark_regs_live_at_end): Don't mark LOCAL_REGNO registers.
        * reload1.c (reload): Likewise when considering nonlocal labels.

        * config/ia64/ia64.h (LOCAL_REGNO): New.
        * config/sparc/sparc.h (LOCAL_REGNO): New.

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

gcc/ChangeLog
gcc/config/ia64/ia64.h
gcc/config/sparc/sparc.h
gcc/flow.c
gcc/reload1.c

index 97453f0..8b6db10 100644 (file)
@@ -1,3 +1,13 @@
+2000-08-08  Richard Henderson  <rth@cygnus.com>
+
+       * tm.texi (LOCAL_REGNO): Document.
+       * flow.c (LOCAL_REGNO, EPILOGUE_USES): Provide default.
+       (mark_regs_live_at_end): Don't mark LOCAL_REGNO registers.
+       * reload1.c (reload): Likewise when considering nonlocal labels.
+
+       * config/ia64/ia64.h (LOCAL_REGNO): New.
+       * config/sparc/sparc.h (LOCAL_REGNO): New.
+
 2000-08-08  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * c-lex.c (yylex): Don't allow integer suffixes 'LUL', 'Ll', 'lL'.
index ab298f4..1b274f0 100644 (file)
@@ -686,6 +686,12 @@ while (0)
 #define OUTGOING_REGNO(IN) \
   ((unsigned) ((IN) - IN_REG (0)) < 8 ? OUT_REG ((IN) - IN_REG (0)) : (IN))
 
+/* Define this macro if the target machine has register windows.  This
+   C expression returns true if the register is call-saved but is in the
+   register window.  */
+
+#define LOCAL_REGNO(REGNO) \
+  (IN_REGNO_P (REGNO) || LOC_REGNO_P (REGNO))
 \f
 /* Order of allocation of registers */
 
index a05c599..43790d9 100644 (file)
@@ -1711,6 +1711,13 @@ extern char leaf_reg_remap[];
 #define OUTGOING_REGNO(IN) \
  ((TARGET_FLAT || (IN) < 24 || (IN) > 31) ? (IN) : (IN) - 16)
 
+/* Define this macro if the target machine has register windows.  This
+   C expression returns true if the register is call-saved but is in the
+   register window.  */
+
+#define LOCAL_REGNO(REGNO) \
+  (TARGET_FLAT ? 0 : (REGNO) >= 16 && (REGNO) <= 31)
+
 /* Define how to find the value returned by a function.
    VALTYPE is the data type of the value (as a tree).
    If the precise function being called is known, FUNC is its FUNCTION_DECL;
index a5a7f9e..c1a8db8 100644 (file)
@@ -163,6 +163,13 @@ Boston, MA 02111-1307, USA.  */
 #define HAVE_sibcall_epilogue 0
 #endif
 
+#ifndef LOCAL_REGNO
+#define LOCAL_REGNO(REGNO)  0
+#endif
+#ifndef EPILOGUE_USES
+#define EPILOGUE_USES(REGNO)  0
+#endif
+
 /* The contents of the current function definition are allocated
    in this obstack, and all are freed at the end of the function.
    For top-level functions, this is temporary_obstack.
@@ -3051,8 +3058,9 @@ mark_regs_live_at_end (set)
     {
       SET_REGNO_REG_SET (set, FRAME_POINTER_REGNUM);
 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
-      /* If they are different, also mark the hard frame pointer as live */
-      SET_REGNO_REG_SET (set, HARD_FRAME_POINTER_REGNUM);
+      /* If they are different, also mark the hard frame pointer as live.  */
+      if (! LOCAL_REGNO (HARD_FRAME_POINTER_REGNUM))
+        SET_REGNO_REG_SET (set, HARD_FRAME_POINTER_REGNUM);
 #endif      
     }
 
@@ -3070,18 +3078,14 @@ mark_regs_live_at_end (set)
      as being live at the end of the function since they may be
      referenced by our caller.  */
   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    if (global_regs[i]
-#ifdef EPILOGUE_USES
-       || EPILOGUE_USES (i)
-#endif
-       )
+    if (global_regs[i] || EPILOGUE_USES (i))
       SET_REGNO_REG_SET (set, i);
 
   /* Mark all call-saved registers that we actaully used.  */
   if (HAVE_epilogue && reload_completed)
     {
       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-       if (! call_used_regs[i] && regs_ever_live[i])
+       if (regs_ever_live[i] && ! call_used_regs[i] && ! LOCAL_REGNO (i))
          SET_REGNO_REG_SET (set, i);
     }
 
index d77d08e..fb7d2f5 100644 (file)
@@ -85,6 +85,10 @@ Boston, MA 02111-1307, USA.  */
 #ifndef REGISTER_MOVE_COST
 #define REGISTER_MOVE_COST(x, y) 2
 #endif
+
+#ifndef LOCAL_REGNO
+#define LOCAL_REGNO(REGNO)  0
+#endif
 \f
 /* During reload_as_needed, element N contains a REG rtx for the hard reg
    into which reg N has been reloaded (perhaps for a previous insn).  */
@@ -654,10 +658,8 @@ reload (first, global, dumpfile)
      registers.  */
   if (current_function_has_nonlocal_label)
     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-      {
-       if (! call_used_regs[i] && ! fixed_regs[i])
-         regs_ever_live[i] = 1;
-      }
+      if (! call_used_regs[i] && ! fixed_regs[i] && ! LOCAL_REGNO (i))
+       regs_ever_live[i] = 1;
 
   /* Find all the pseudo registers that didn't get hard regs
      but do have known equivalent constants or memory slots.