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 ();
 }
 
 /* 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;

Reply via email to