Message ID | 20140620075143.GA27603@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
On 06/20/14 01:51, Jan Hubicka wrote: > 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) > @@ -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. */ > @@ -1784,8 +1805,15 @@ target_reinit (void) > regno_reg_rtx = NULL; > } > > - /* Reinitialize RTL backend. */ > - backend_init_target (); > + this_target_rtl->lang_dependent_initialized = false; Do you want to reset target_specific_initialized here as well? Jeff
> On 06/20/14 01:51, Jan Hubicka wrote: > >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) > >@@ -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. */ > >@@ -1784,8 +1805,15 @@ target_reinit (void) > > regno_reg_rtx = NULL; > > } > > > >- /* Reinitialize RTL backend. */ > >- backend_init_target (); > >+ this_target_rtl->lang_dependent_initialized = false; > Do you want to reset target_specific_initialized here as well? Actually I meant to only resert target_specific_initialized. lang_dependent_initialized is reset few lines later by call to lang_dependent_init_target. I am re-testing with this change. OK? Honza > > > > Jeff
On 06/25/14 01:09, Jan Hubicka wrote: >> On 06/20/14 01:51, Jan Hubicka wrote: >>> 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) >>> @@ -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. */ >>> @@ -1784,8 +1805,15 @@ target_reinit (void) >>> regno_reg_rtx = NULL; >>> } >>> >>> - /* Reinitialize RTL backend. */ >>> - backend_init_target (); >>> + this_target_rtl->lang_dependent_initialized = false; >> Do you want to reset target_specific_initialized here as well? > > Actually I meant to only resert target_specific_initialized. > lang_dependent_initialized is reset few lines later by call > to lang_dependent_init_target. > > I am re-testing with this change. OK? Yes. jeff
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 (); } /* Initialize excess precision settings. */ @@ -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. */ @@ -1784,8 +1805,15 @@ target_reinit (void) regno_reg_rtx = NULL; } - /* Reinitialize RTL backend. */ - backend_init_target (); + this_target_rtl->lang_dependent_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 (); Index: toplev.h =================================================================== --- toplev.h (revision 211837) +++ toplev.h (working copy) @@ -77,4 +77,6 @@ extern bool set_src_pwd (const c extern HOST_WIDE_INT get_random_seed (bool); extern const char *set_random_seed (const char *); +extern void initialize_rtl (void); + #endif /* ! GCC_TOPLEV_H */ Index: function.c =================================================================== --- function.c (revision 211837) +++ function.c (working copy) @@ -64,6 +64,7 @@ along with GCC; see the file COPYING3. #include "params.h" #include "bb-reorder.h" #include "shrink-wrap.h" +#include "toplev.h" /* So we can assign to cfun in this file. */ #undef cfun @@ -4630,6 +4631,10 @@ init_function_start (tree subr) set_cfun (DECL_STRUCT_FUNCTION (subr)); else allocate_struct_function (subr, false); + + /* Initialize backend, if needed. */ + initialize_rtl (); + prepare_function_start (); decide_function_section (subr); Index: rtl.h =================================================================== --- rtl.h (revision 211837) +++ rtl.h (working copy) @@ -2514,6 +2514,10 @@ struct GTY(()) target_rtl { /* The default memory attributes for each mode. */ struct mem_attrs *x_mode_mem_attrs[(int) MAX_MACHINE_MODE]; + + /* Track if RTL has been initialized. */ + bool target_specific_initialized; + bool lang_dependent_initialized; }; extern GTY(()) struct target_rtl default_target_rtl;