diff mbox

Delay RTL initialization until it is really needed

Message ID 20140620075143.GA27603@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka June 20, 2014, 7:51 a.m. UTC
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.

Comments

Jeff Law June 24, 2014, 7:20 p.m. UTC | #1
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
Jan Hubicka June 25, 2014, 7:09 a.m. UTC | #2
> 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
Jeff Law June 25, 2014, 8:57 p.m. UTC | #3
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
diff mbox

Patch

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;