From: Richard Henderson Date: Tue, 8 Aug 2000 08:28:00 +0000 (-0700) Subject: tm.texi (LOCAL_REGNO): Document. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2a3e384f15e6f10fc62b27c6671d899b083fed97;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97453f04c05..8b6db106efd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2000-08-08 Richard Henderson + + * 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 * 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 ab298f40d2b..1b274f09327 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 a05c599c6d8..43790d9b206 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 a5a7f9ef3f5..c1a8db82aff 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 d77d08eb7ac..fb7d2f5b863 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.