This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Delay RTL initialization until it is really needed


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]