aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-08-08 01:28:00 -0700
committerRichard Henderson <rth@gcc.gnu.org>2000-08-08 01:28:00 -0700
commit2a3e384f15e6f10fc62b27c6671d899b083fed97 (patch)
treebef654b1dd4f2327e04b2250df973c7f458204ae
parent43d1e05928a16e48e017625e8dad6aeca2a31282 (diff)
downloadgcc-2a3e384f15e6f10fc62b27c6671d899b083fed97.zip
gcc-2a3e384f15e6f10fc62b27c6671d899b083fed97.tar.gz
gcc-2a3e384f15e6f10fc62b27c6671d899b083fed97.tar.bz2
tm.texi (LOCAL_REGNO): Document.
* 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. From-SVN: r35564
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/ia64/ia64.h6
-rw-r--r--gcc/config/sparc/sparc.h7
-rw-r--r--gcc/flow.c20
-rw-r--r--gcc/reload1.c10
5 files changed, 41 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 97453f0..8b6db10 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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'.
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index ab298f4..1b274f0 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -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))
/* Order of allocation of registers */
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index a05c599..43790d9 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -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;
diff --git a/gcc/flow.c b/gcc/flow.c
index a5a7f9e..c1a8db8 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -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);
}
diff --git a/gcc/reload1.c b/gcc/reload1.c
index d77d08e..fb7d2f5 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -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
/* 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.