Ping: PR61629 (was Re: Delay RTL initialization until it is really needed)

2014-07-24 Thread Richard Sandiford
Ping.  Originaly message was here:

  https://gcc.gnu.org/ml/gcc-patches/2014-07/msg01113.html

Richard Sandiford rdsandif...@googlemail.com writes:
 Richard Sandiford rdsandif...@googlemail.com writes:
 Jan Hubicka hubi...@ucw.cz writes:
 Hi,

 IRA initialization shows high in profiles even when building lto
 objects.  This patch simply delays RTL backend initialization until we
 really decide to output a function.  In some cases this avoids the
 initialization completely (like in the case of LTO but also user
 target attributes) and there is some hope for better cache locality.

 Basic idea is to have two flags saying whether lang and target
 dependent bits needs initialization and check it when starting
 function codegen.

 Bootstrapped/regtested x86_64-linux, testing also at AIX. Ok if it passes?

 Honza

 * toplev.c (backend_init_target): Move init_emit_regs and init_regs 
 to...
 (backend_init) ... here; skip ira_init_once and backend_init_target.
 (target_reinit) ... and here; clear 
 this_target_rtl-lang_dependent_initialized.
 (lang_dependent_init_target): Clear 
 this_target_rtl-lang_dependent_initialized;
 break out rtl initialization to ...
 (initialize_rtl): ... here; call also backend_init_target and 
 ira_init_once.
 * toplev.h (initialize_rtl): New function.
 * function.c: Include toplev.h
 (init_function_start): Call initialize_rtl.
 * rtl.h (target_rtl): Add target_specific_initialized,
 lang_dependent_initialized.
 Index: toplev.c
 ===
 --- toplev.c(revision 211837)
 +++ toplev.c(working copy)
 @@ -1583,14 +1583,6 @@ backend_init_target (void)
/* Initialize alignment variables.  */
init_alignments ();
  
 -  /* This reinitializes hard_frame_pointer, and calls 
 init_reg_modes_target()
 - to initialize reg_raw_mode[].  */
 -  init_emit_regs ();
 -
 -  /* This invokes target hooks to set fixed_reg[] etc, which is
 - mode-dependent.  */
 -  init_regs ();
 -
/* This depends on stack_pointer_rtx.  */
init_fake_stack_mems ();
  
 @@ -1632,9 +1624,13 @@ backend_init (void)
init_varasm_once ();
save_register_info ();
  
 -  /* Initialize the target-specific back end pieces.  */
 -  ira_init_once ();
 -  backend_init_target ();
 +  /* Middle end needs this initialization for default mem attributes
 + used by early calls to make_decl_rtl.  */
 +  init_emit_regs ();
 +
 +  /* Middle end needs this initialization for mode tables used to assign
 + modes to vector variables.  */
 +  init_regs ();

 This causes a segfault on gcc.target/mips/umips-store16-1.c.  The register
 asm:

 register unsigned int global asm ($16);

 causes us to globalise $16 and call reinit_regs.  reinit_regs in turn
 calls ira_init, but IRA hasn't been initialised at this point and
 prerequisites like init_fake_stack_mems haven't yet been called.

 Does the patch below look OK?

 @@ -1686,6 +1682,31 @@ lang_dependent_init_target (void)
   front end is initialized.  It also depends on the HAVE_xxx macros
   generated from the target machine description.  */
init_optabs ();
 +  this_target_rtl-lang_dependent_initialized = false;
 +}
 +
 +/* Perform initializations that are lang-dependent or target-dependent.
 +   but matters only for late optimizations and RTL generation.  */
 +
 +void
 +initialize_rtl (void)
 +{
 +  static int initialized_once;
 +
 +  /* Initialization done just once per compilation, but delayed
 + till code generation.  */
 +  if (!initialized_once)
 +ira_init_once ();
 +  initialized_once = true;
 +
 +  /* Target specific RTL backend initialization.  */
 +  if (!this_target_rtl-target_specific_initialized)
 +backend_init_target ();
 +  this_target_rtl-target_specific_initialized = true;
 +
 +  if (this_target_rtl-lang_dependent_initialized)
 +return;
 +  this_target_rtl-lang_dependent_initialized = true;
  
/* The following initialization functions need to generate rtl, so
   provide a dummy function context for them.  */

 Why do you need both these flags?  We only call this function once
 the language has been initialised, so we should always be initialising
 both sets of information (backend_init_target and the stuff after
 the comment above, from the old lang_dependent_init_target).

 How about the second patch below, still under testing?  The new assert
 is OK for target_reinit because it has:

   this_target_rtl-target_specific_initialized = false;

   /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
  to initialize reg_raw_mode[].  */
   init_emit_regs ();

   /* This invokes target hooks to set fixed_reg[] etc, which is
  mode-dependent.  */
   init_regs ();

   /* Reinitialize lang-dependent parts.  */
   lang_dependent_init_target ();

 i.e. it sets the flag to say that the RTL stuff hasn't been initialised
 and then goes on to initialise everything that needs to be 

Re: Ping: PR61629 (was Re: Delay RTL initialization until it is really needed)

2014-07-24 Thread Richard Biener
On Thu, Jul 24, 2014 at 8:57 AM, Richard Sandiford
rdsandif...@googlemail.com wrote:
 Ping.  Originaly message was here:

   https://gcc.gnu.org/ml/gcc-patches/2014-07/msg01113.html

Ok.

Thanks,
Richard.

 Richard Sandiford rdsandif...@googlemail.com writes:
 Richard Sandiford rdsandif...@googlemail.com writes:
 Jan Hubicka hubi...@ucw.cz writes:
 Hi,

 IRA initialization shows high in profiles even when building lto
 objects.  This patch simply delays RTL backend initialization until we
 really decide to output a function.  In some cases this avoids the
 initialization completely (like in the case of LTO but also user
 target attributes) and there is some hope for better cache locality.

 Basic idea is to have two flags saying whether lang and target
 dependent bits needs initialization and check it when starting
 function codegen.

 Bootstrapped/regtested x86_64-linux, testing also at AIX. Ok if it passes?

 Honza

 * toplev.c (backend_init_target): Move init_emit_regs and init_regs 
 to...
 (backend_init) ... here; skip ira_init_once and backend_init_target.
 (target_reinit) ... and here; clear 
 this_target_rtl-lang_dependent_initialized.
 (lang_dependent_init_target): Clear 
 this_target_rtl-lang_dependent_initialized;
 break out rtl initialization to ...
 (initialize_rtl): ... here; call also backend_init_target and 
 ira_init_once.
 * toplev.h (initialize_rtl): New function.
 * function.c: Include toplev.h
 (init_function_start): Call initialize_rtl.
 * rtl.h (target_rtl): Add target_specific_initialized,
 lang_dependent_initialized.
 Index: toplev.c
 ===
 --- toplev.c(revision 211837)
 +++ toplev.c(working copy)
 @@ -1583,14 +1583,6 @@ backend_init_target (void)
/* Initialize alignment variables.  */
init_alignments ();

 -  /* This reinitializes hard_frame_pointer, and calls 
 init_reg_modes_target()
 - to initialize reg_raw_mode[].  */
 -  init_emit_regs ();
 -
 -  /* This invokes target hooks to set fixed_reg[] etc, which is
 - mode-dependent.  */
 -  init_regs ();
 -
/* This depends on stack_pointer_rtx.  */
init_fake_stack_mems ();

 @@ -1632,9 +1624,13 @@ backend_init (void)
init_varasm_once ();
save_register_info ();

 -  /* Initialize the target-specific back end pieces.  */
 -  ira_init_once ();
 -  backend_init_target ();
 +  /* Middle end needs this initialization for default mem attributes
 + used by early calls to make_decl_rtl.  */
 +  init_emit_regs ();
 +
 +  /* Middle end needs this initialization for mode tables used to assign
 + modes to vector variables.  */
 +  init_regs ();

 This causes a segfault on gcc.target/mips/umips-store16-1.c.  The register
 asm:

 register unsigned int global asm ($16);

 causes us to globalise $16 and call reinit_regs.  reinit_regs in turn
 calls ira_init, but IRA hasn't been initialised at this point and
 prerequisites like init_fake_stack_mems haven't yet been called.

 Does the patch below look OK?

 @@ -1686,6 +1682,31 @@ lang_dependent_init_target (void)
   front end is initialized.  It also depends on the HAVE_xxx macros
   generated from the target machine description.  */
init_optabs ();
 +  this_target_rtl-lang_dependent_initialized = false;
 +}
 +
 +/* Perform initializations that are lang-dependent or target-dependent.
 +   but matters only for late optimizations and RTL generation.  */
 +
 +void
 +initialize_rtl (void)
 +{
 +  static int initialized_once;
 +
 +  /* Initialization done just once per compilation, but delayed
 + till code generation.  */
 +  if (!initialized_once)
 +ira_init_once ();
 +  initialized_once = true;
 +
 +  /* Target specific RTL backend initialization.  */
 +  if (!this_target_rtl-target_specific_initialized)
 +backend_init_target ();
 +  this_target_rtl-target_specific_initialized = true;
 +
 +  if (this_target_rtl-lang_dependent_initialized)
 +return;
 +  this_target_rtl-lang_dependent_initialized = true;

/* The following initialization functions need to generate rtl, so
   provide a dummy function context for them.  */

 Why do you need both these flags?  We only call this function once
 the language has been initialised, so we should always be initialising
 both sets of information (backend_init_target and the stuff after
 the comment above, from the old lang_dependent_init_target).

 How about the second patch below, still under testing?  The new assert
 is OK for target_reinit because it has:

   this_target_rtl-target_specific_initialized = false;

   /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
  to initialize reg_raw_mode[].  */
   init_emit_regs ();

   /* This invokes target hooks to set fixed_reg[] etc, which is
  mode-dependent.  */
   init_regs ();

   /* Reinitialize lang-dependent parts.  */
   lang_dependent_init_target ();

 i.e. it sets the flag to say that 

PR61629 (was Re: Delay RTL initialization until it is really needed)

2014-07-17 Thread Richard Sandiford
Richard Sandiford rdsandif...@googlemail.com writes:
 Jan Hubicka hubi...@ucw.cz writes:
 Hi,

 IRA initialization shows high in profiles even when building lto
 objects.  This patch simply delays RTL backend initialization until we
 really decide to output a function.  In some cases this avoids the
 initialization completely (like in the case of LTO but also user
 target attributes) and there is some hope for better cache locality.

 Basic idea is to have two flags saying whether lang and target
 dependent bits needs initialization and check it when starting
 function codegen.

 Bootstrapped/regtested x86_64-linux, testing also at AIX. Ok if it passes?

 Honza

  * toplev.c (backend_init_target): Move init_emit_regs and init_regs 
 to...
  (backend_init) ... here; skip ira_init_once and backend_init_target.
  (target_reinit) ... and here; clear 
 this_target_rtl-lang_dependent_initialized.
  (lang_dependent_init_target): Clear 
 this_target_rtl-lang_dependent_initialized;
  break out rtl initialization to ...
  (initialize_rtl): ... here; call also backend_init_target and 
 ira_init_once.
  * toplev.h (initialize_rtl): New function.
  * function.c: Include toplev.h
  (init_function_start): Call initialize_rtl.
  * rtl.h (target_rtl): Add target_specific_initialized,
  lang_dependent_initialized.
 Index: toplev.c
 ===
 --- toplev.c (revision 211837)
 +++ toplev.c (working copy)
 @@ -1583,14 +1583,6 @@ backend_init_target (void)
/* Initialize alignment variables.  */
init_alignments ();
  
 -  /* This reinitializes hard_frame_pointer, and calls 
 init_reg_modes_target()
 - to initialize reg_raw_mode[].  */
 -  init_emit_regs ();
 -
 -  /* This invokes target hooks to set fixed_reg[] etc, which is
 - mode-dependent.  */
 -  init_regs ();
 -
/* This depends on stack_pointer_rtx.  */
init_fake_stack_mems ();
  
 @@ -1632,9 +1624,13 @@ backend_init (void)
init_varasm_once ();
save_register_info ();
  
 -  /* Initialize the target-specific back end pieces.  */
 -  ira_init_once ();
 -  backend_init_target ();
 +  /* Middle end needs this initialization for default mem attributes
 + used by early calls to make_decl_rtl.  */
 +  init_emit_regs ();
 +
 +  /* Middle end needs this initialization for mode tables used to assign
 + modes to vector variables.  */
 +  init_regs ();

 This causes a segfault on gcc.target/mips/umips-store16-1.c.  The register
 asm:

 register unsigned int global asm ($16);

 causes us to globalise $16 and call reinit_regs.  reinit_regs in turn
 calls ira_init, but IRA hasn't been initialised at this point and
 prerequisites like init_fake_stack_mems haven't yet been called.

 Does the patch below look OK?

 @@ -1686,6 +1682,31 @@ lang_dependent_init_target (void)
   front end is initialized.  It also depends on the HAVE_xxx macros
   generated from the target machine description.  */
init_optabs ();
 +  this_target_rtl-lang_dependent_initialized = false;
 +}
 +
 +/* Perform initializations that are lang-dependent or target-dependent.
 +   but matters only for late optimizations and RTL generation.  */
 +
 +void
 +initialize_rtl (void)
 +{
 +  static int initialized_once;
 +
 +  /* Initialization done just once per compilation, but delayed
 + till code generation.  */
 +  if (!initialized_once)
 +ira_init_once ();
 +  initialized_once = true;
 +
 +  /* Target specific RTL backend initialization.  */
 +  if (!this_target_rtl-target_specific_initialized)
 +backend_init_target ();
 +  this_target_rtl-target_specific_initialized = true;
 +
 +  if (this_target_rtl-lang_dependent_initialized)
 +return;
 +  this_target_rtl-lang_dependent_initialized = true;
  
/* The following initialization functions need to generate rtl, so
   provide a dummy function context for them.  */

 Why do you need both these flags?  We only call this function once
 the language has been initialised, so we should always be initialising
 both sets of information (backend_init_target and the stuff after
 the comment above, from the old lang_dependent_init_target).

 How about the second patch below, still under testing?  The new assert
 is OK for target_reinit because it has:

   this_target_rtl-target_specific_initialized = false;

   /* This initializes hard_frame_pointer, and calls init_reg_modes_target()
  to initialize reg_raw_mode[].  */
   init_emit_regs ();

   /* This invokes target hooks to set fixed_reg[] etc, which is
  mode-dependent.  */
   init_regs ();

   /* Reinitialize lang-dependent parts.  */
   lang_dependent_init_target ();

 i.e. it sets the flag to say that the RTL stuff hasn't been initialised
 and then goes on to initialise everything that needs to be deferred.

Now tested on mips64-linux-gnu.  OK for both patches?

 Thanks,
 Richard


 gcc/
   PR rtl-optimization/61629
   * reginfo.c