diff options
author | Richard Henderson <rth@cygnus.com> | 2000-08-08 01:28:00 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-08-08 01:28:00 -0700 |
commit | 2a3e384f15e6f10fc62b27c6671d899b083fed97 (patch) | |
tree | bef654b1dd4f2327e04b2250df973c7f458204ae /gcc | |
parent | 43d1e05928a16e48e017625e8dad6aeca2a31282 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 6 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.h | 7 | ||||
-rw-r--r-- | gcc/flow.c | 20 | ||||
-rw-r--r-- | gcc/reload1.c | 10 |
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; @@ -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. |