From aeb9f7cf3ce55e65fb9f435702e20c7c3f37d7e5 Mon Sep 17 00:00:00 2001 From: Steven Bosscher Date: Wed, 5 Dec 2012 23:16:52 +0000 Subject: [PATCH] tm.texi.in (TARGET_CLASS_LIKELY_SPILLED_P): Update documentation. * doc/tm.texi.in (TARGET_CLASS_LIKELY_SPILLED_P): Update documentation. * doc/tm.texi: Regenerate. * regs.h (REG_LIVE_LENGTH): Update comments to not refer to no longer existing files global.c and local-alloc.c. * regmove.c (copy_src_to_dest): Likewise. * function.h (struct rtl_data): Likewise. * ira-color.c (allocno_priority_compare_func): Likewise. * regstat.c (regstat_compute_ri): Likewise. * config/epiphany/epiphany.h, config/vax/vax.h, config/cris/cris.h, config/h8300/h8300.h, config/alpha/alpha.h, config/sparc/sparc.h, config/rs6000/rs6000.h, config/pdp11/pdp11.h, config/pa/pa.h, config/v850/v850.h, config/mn10300/mn10300.h, config/m32r/m32r.h, config/i386/i386.h, config/mcore/mcore.h, config/sh/sh.h, config/arm/arm.h (REGNO_OK_FOR_BASE_P): Likewise. From-SVN: r194229 --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/config/alpha/alpha.h | 3 ++- gcc/config/arm/arm.h | 3 ++- gcc/config/cris/cris.h | 3 ++- gcc/config/epiphany/epiphany.h | 3 ++- gcc/config/h8300/h8300.h | 3 ++- gcc/config/i386/i386.h | 3 ++- gcc/config/m32r/m32r.h | 3 ++- gcc/config/mcore/mcore.h | 3 ++- gcc/config/mn10300/mn10300.h | 3 ++- gcc/config/pa/pa.h | 3 ++- gcc/config/pdp11/pdp11.h | 3 ++- gcc/config/rs6000/rs6000.h | 3 ++- gcc/config/sh/sh.h | 3 ++- gcc/config/sparc/sparc.h | 3 ++- gcc/config/v850/v850.h | 3 ++- gcc/config/vax/vax.h | 3 ++- gcc/doc/tm.texi | 16 +++++++--------- gcc/doc/tm.texi.in | 16 +++++++--------- gcc/function.h | 3 ++- gcc/ira-color.c | 3 +-- gcc/regmove.c | 8 ++++---- gcc/regs.h | 24 ++++++++++-------------- gcc/regstat.c | 2 +- 24 files changed, 81 insertions(+), 56 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 652c05f75f5..efeafd3c73b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2012-12-05 Steven Bosscher + + * doc/tm.texi.in (TARGET_CLASS_LIKELY_SPILLED_P): Update documentation. + * doc/tm.texi: Regenerate. + * regs.h (REG_LIVE_LENGTH): Update comments to not refer to no longer + existing files global.c and local-alloc.c. + * regmove.c (copy_src_to_dest): Likewise. + * function.h (struct rtl_data): Likewise. + * ira-color.c (allocno_priority_compare_func): Likewise. + * regstat.c (regstat_compute_ri): Likewise. + * config/epiphany/epiphany.h, config/vax/vax.h, config/cris/cris.h, + config/h8300/h8300.h, config/alpha/alpha.h, config/sparc/sparc.h, + config/rs6000/rs6000.h, config/pdp11/pdp11.h, config/pa/pa.h, + config/v850/v850.h, config/mn10300/mn10300.h, config/m32r/m32r.h, + config/i386/i386.h, config/mcore/mcore.h, config/sh/sh.h, + config/arm/arm.h (REGNO_OK_FOR_BASE_P): Likewise. + 2012-12-05 Aldy Hernandez PR target/54160 diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index cdb7c49b007..bc14d84055b 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -778,7 +778,8 @@ extern int alpha_memory_latency; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(REGNO) 0 #define REGNO_OK_FOR_BASE_P(REGNO) \ diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index f520cc717aa..d0f351d861e 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -1730,7 +1730,8 @@ enum arm_auto_incmodes They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define TEST_REGNO(R, TEST, VALUE) \ ((R TEST VALUE) || ((unsigned) reg_renumber[R] TEST VALUE)) diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index 646ba90b4b9..80fb8f3ad86 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -577,7 +577,8 @@ enum reg_class #define INDEX_REG_CLASS GENERAL_REGS /* Since it uses reg_renumber, it is safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ ((REGNO) <= CRIS_LAST_GENERAL_REGISTER \ || (REGNO) == ARG_POINTER_REGNUM \ diff --git a/gcc/config/epiphany/epiphany.h b/gcc/config/epiphany/epiphany.h index c18aaa41941..534f513132b 100644 --- a/gcc/config/epiphany/epiphany.h +++ b/gcc/config/epiphany/epiphany.h @@ -407,7 +407,8 @@ extern enum reg_class epiphany_regno_reg_class[FIRST_PSEUDO_REGISTER]; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ ((REGNO) < FIRST_PSEUDO_REGISTER || (unsigned) reg_renumber[REGNO] < FIRST_PSEUDO_REGISTER) #define REGNO_OK_FOR_INDEX_P(REGNO) \ diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index 61e0dd2f846..b98f6169112 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -498,7 +498,8 @@ struct cum_arg They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(regno) 0 diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 443d92eadce..3ac345172c8 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1614,7 +1614,8 @@ typedef struct ix86_args { They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(REGNO) \ ((REGNO) < STACK_POINTER_REGNUM \ diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index 0072b2f0da3..e871328af7b 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -501,7 +501,8 @@ extern enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER]; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ ((REGNO) < FIRST_PSEUDO_REGISTER \ ? GPR_P (REGNO) || (REGNO) == ARG_POINTER_REGNUM \ diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h index 398dcedfe22..a64e4460fa1 100644 --- a/gcc/config/mcore/mcore.h +++ b/gcc/config/mcore/mcore.h @@ -516,7 +516,8 @@ extern const enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER]; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ ((REGNO) < AP_REG || (unsigned) reg_renumber[(REGNO)] < AP_REG) diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h index eb4f2f9f42f..4dea839873b 100644 --- a/gcc/config/mn10300/mn10300.h +++ b/gcc/config/mn10300/mn10300.h @@ -347,7 +347,8 @@ enum reg_class They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #ifndef REG_OK_STRICT # define REG_STRICT 0 diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 89665c1cddc..29dbea01256 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -750,7 +750,8 @@ extern int may_call_alloca; They give nonzero only if X is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(X) \ ((X) && ((X) < 32 \ diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h index 6efbf49a074..76925b1683f 100644 --- a/gcc/config/pdp11/pdp11.h +++ b/gcc/config/pdp11/pdp11.h @@ -400,7 +400,8 @@ extern int may_call_alloca; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ ((REGNO) <= PC_REGNUM || (unsigned) reg_renumber[REGNO] <= PC_REGNUM || \ diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index f7b0be27776..2e23f6e523d 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1729,7 +1729,8 @@ typedef struct rs6000_args They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(REGNO) \ ((REGNO) < FIRST_PSEUDO_REGISTER \ diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index fdd06a067c0..212b97d9c10 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -1618,7 +1618,8 @@ struct sh_args { They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(REGNO) \ (GENERAL_OR_AP_REGISTER_P (REGNO) \ diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index 57c5eaccdbf..99c6a039328 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1379,7 +1379,8 @@ do { \ They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(REGNO) \ (SPARC_INT_REG_P (REGNO) || SPARC_INT_REG_P (reg_renumber[REGNO]) \ diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index e6458bcbaec..2e3e55a18fa 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -354,7 +354,8 @@ enum reg_class They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_BASE_P(regno) \ (((regno) < FIRST_PSEUDO_REGISTER \ diff --git a/gcc/config/vax/vax.h b/gcc/config/vax/vax.h index 35b8f8ea93a..513ac6102db 100644 --- a/gcc/config/vax/vax.h +++ b/gcc/config/vax/vax.h @@ -385,7 +385,8 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES }; They give nonzero only if REGNO is a hard reg of the suitable class or a pseudo reg currently allocated to a suitable hard reg. Since they use reg_renumber, they are safe only once reg_renumber - has been allocated, which happens in local-alloc.c. */ + has been allocated, which happens in reginfo.c during register + allocation. */ #define REGNO_OK_FOR_INDEX_P(regno) \ ((regno) < FIRST_PSEUDO_REGISTER || reg_renumber[regno] >= 0) diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index f98196434f8..3ab99871c3b 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -2834,15 +2834,13 @@ registers of @var{rclass} are needed for spill registers. The default version of this target hook returns @code{true} if @var{rclass} has exactly one register and @code{false} otherwise. On most machines, this -default should be used. Only use this target hook to some other expression -if pseudos allocated by @file{local-alloc.c} end up in memory because their -hard registers were needed for spill registers. If this target hook returns -@code{false} for those classes, those pseudos will only be allocated by -@file{global.c}, which knows how to reallocate the pseudo to another -register. If there would not be another register available for reallocation, -you should not change the implementation of this target hook since -the only effect of such implementation would be to slow down register -allocation. +default should be used. For generally register-starved machines, such as +i386, or machines with right register constraints, such as SH, this hook +can be used to avoid excessive spilling. + +This hook is also used by some of the global intra-procedural code +transformations to throtle code motion, to avoid increasing register +pressure. @end deftypefn @deftypefn {Target Hook} {unsigned char} TARGET_CLASS_MAX_NREGS (reg_class_t @var{rclass}, enum machine_mode @var{mode}) diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 7a93f21073c..6d48fe48b75 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -2810,15 +2810,13 @@ registers of @var{rclass} are needed for spill registers. The default version of this target hook returns @code{true} if @var{rclass} has exactly one register and @code{false} otherwise. On most machines, this -default should be used. Only use this target hook to some other expression -if pseudos allocated by @file{local-alloc.c} end up in memory because their -hard registers were needed for spill registers. If this target hook returns -@code{false} for those classes, those pseudos will only be allocated by -@file{global.c}, which knows how to reallocate the pseudo to another -register. If there would not be another register available for reallocation, -you should not change the implementation of this target hook since -the only effect of such implementation would be to slow down register -allocation. +default should be used. For generally register-starved machines, such as +i386, or machines with right register constraints, such as SH, this hook +can be used to avoid excessive spilling. + +This hook is also used by some of the global intra-procedural code +transformations to throtle code motion, to avoid increasing register +pressure. @end deftypefn @hook TARGET_CLASS_MAX_NREGS diff --git a/gcc/function.h b/gcc/function.h index dd7f099e8a5..65a7c48aa08 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -389,7 +389,8 @@ struct GTY(()) rtl_data { bool arg_pointer_save_area_init; /* Nonzero if current function must be given a frame pointer. - Set in global.c if anything is allocated on the stack there. */ + Set in reload1.c or lra-eliminations.c if anything is allocated + on the stack there. */ bool frame_pointer_needed; /* When set, expand should optimize for speed. */ diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 33f9d24b00b..3b9319ca7c5 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -2516,8 +2516,7 @@ improve_allocation (void) } } -/* Sort allocnos according to their priorities which are calculated - analogous to ones in file `global.c'. */ +/* Sort allocnos according to their priorities. */ static int allocno_priority_compare_func (const void *v1p, const void *v2p) { diff --git a/gcc/regmove.c b/gcc/regmove.c index 29f6e6546b6..8dc2d54a674 100644 --- a/gcc/regmove.c +++ b/gcc/regmove.c @@ -616,10 +616,10 @@ copy_src_to_dest (rtx insn, rtx src, rtx dest) int src_regno; int dest_regno; - /* A REG_LIVE_LENGTH of -1 indicates the register is equivalent to a constant - or memory location and is used infrequently; a REG_LIVE_LENGTH of -2 is - parameter when there is no frame pointer that is not allocated a register. - For now, we just reject them, rather than incrementing the live length. */ + /* A REG_LIVE_LENGTH of -1 indicates the register must not go into + a hard register, e.g. because it crosses as setjmp. See the + comment in regstat.c:regstat_bb_compute_ri. Don't try to apply + any transformations to such regs. */ if (REG_P (src) && REG_LIVE_LENGTH (REGNO (src)) > 0 diff --git a/gcc/regs.h b/gcc/regs.h index 4c9d7a6ce42..adc9384b62e 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -176,21 +176,17 @@ extern size_t reg_info_p_size; #define REG_N_THROWING_CALLS_CROSSED(N) (reg_info_p[N].throw_calls_crossed) -/* Total number of instructions at which (REG n) is live. The larger - this is, the less priority (REG n) gets for allocation in a hard - register (in global-alloc). This is set in df-problems.c whenever - register info is requested and remains valid for the rest of the - compilation of the function; it is used to control register - allocation. +/* Total number of instructions at which (REG n) is live. + + This is set in regstat.c whenever register info is requested and + remains valid for the rest of the compilation of the function; it is + used to control register allocation. The larger this is, the less + priority (REG n) gets for allocation in a hard register (in IRA in + priority-coloring mode). - local-alloc.c may alter this number to change the priority. - - Negative values are special. - -1 is used to mark a pseudo reg which has a constant or memory equivalent - and is used infrequently enough that it should not get a hard register. - -2 is used to mark a pseudo reg for a parameter, when a frame pointer - is not required. global.c makes an allocno for this but does - not try to assign a hard register to it. */ + Negative values are special: -1 is used to mark a pseudo reg that + should not be allocated to a hard register, because it crosses a + setjmp call. */ #define REG_LIVE_LENGTH(N) (reg_info_p[N].live_length) diff --git a/gcc/regstat.c b/gcc/regstat.c index ddfb404fbf2..34eb7ad67bf 100644 --- a/gcc/regstat.c +++ b/gcc/regstat.c @@ -389,7 +389,7 @@ regstat_compute_ri (void) BITMAP_FREE (local_processed); free (local_live_last_luid); - /* See the setjmp comment in regstat_ri_bb_compute. */ + /* See the setjmp comment in regstat_bb_compute_ri. */ EXECUTE_IF_SET_IN_BITMAP (setjmp_crosses, FIRST_PSEUDO_REGISTER, regno, bi) { REG_BASIC_BLOCK (regno) = REG_BLOCK_UNKNOWN;