Ping: PR61629 (was Re: Delay RTL initialization until it is really needed)
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)
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)
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