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


On Thu, Jul 24, 2014 at 8:57 AM, Richard Sandiford
<rdsandiford@googlemail.com> wrote:
> Ping.  Originaly message was here:
>
>   https://gcc.gnu.org/ml/gcc-patches/2014-07/msg01113.html

Ok.

Thanks,
Richard.

> Richard Sandiford <rdsandiford@googlemail.com> writes:
>> Richard Sandiford <rdsandiford@googlemail.com> writes:
>>> Jan Hubicka <hubicka@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 (reinit_regs): Only call ira_init and recog_init if
>>>      they have already been initialized.
>>>
>>> Index: gcc/reginfo.c
>>> ===================================================================
>>> --- gcc/reginfo.c    2014-07-16 07:59:00.039669668 +0100
>>> +++ gcc/reginfo.c    2014-07-16 07:59:00.397672987 +0100
>>> @@ -533,8 +533,11 @@ reinit_regs (void)
>>>    init_regs ();
>>>    /* caller_save needs to be re-initialized.  */
>>>    caller_save_initialized_p = false;
>>> -  ira_init ();
>>> -  recog_init ();
>>> +  if (this_target_rtl->target_specific_initialized)
>>> +    {
>>> +      ira_init ();
>>> +      recog_init ();
>>> +    }
>>>  }
>>>
>>>  /* Initialize some fake stack-frame MEM references for use in
>>>
>>>
>>> gcc/
>>>      * rtl.h (target_rtl): Remove lang_dependent_initialized.
>>>      * toplev.c (initialize_rtl): Don't use it.  Move previously
>>>      "language-dependent" calls to...
>>>      (backend_init): ...here.
>>>      (lang_dependent_init_target): Don't set lang_dependent_initialized.
>>>      Assert that RTL initialization hasn't happend yet.
>>>
>>> Index: gcc/rtl.h
>>> ===================================================================
>>> --- gcc/rtl.h        2014-07-11 11:55:14.265158363 +0100
>>> +++ gcc/rtl.h        2014-07-16 08:16:23.245370141 +0100
>>> @@ -2517,7 +2517,6 @@ struct GTY(()) target_rtl {
>>>
>>>    /* Track if RTL has been initialized.  */
>>>    bool target_specific_initialized;
>>> -  bool lang_dependent_initialized;
>>>  };
>>>
>>>  extern GTY(()) struct target_rtl default_target_rtl;
>>> Index: gcc/toplev.c
>>> ===================================================================
>>> --- gcc/toplev.c     2014-07-11 11:54:41.604838961 +0100
>>> +++ gcc/toplev.c     2014-07-16 08:22:36.226034738 +0100
>>> @@ -1604,6 +1604,10 @@ backend_init_target (void)
>>>       on a mode change.  */
>>>    init_expmed ();
>>>    init_lower_subreg ();
>>> +  init_set_costs ();
>>> +
>>> +  init_expr_target ();
>>> +  ira_init ();
>>>
>>>    /* We may need to recompute regno_save_code[] and regno_restore_code[]
>>>       after a mode change as well.  */
>>> @@ -1682,7 +1686,8 @@ 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;
>>> +
>>> +  gcc_assert (!this_target_rtl->target_specific_initialized);
>>>  }
>>>
>>>  /* Perform initializations that are lang-dependent or target-dependent.
>>> @@ -1701,26 +1706,10 @@ initialize_rtl (void)
>>>
>>>    /* 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.  */
>>> -  init_dummy_function_start ();
>>> -
>>> -  /* Do the target-specific parts of expr initialization.  */
>>> -  init_expr_target ();
>>> -
>>> -  /* Although the actions of these functions are language-independent,
>>> -     they use optabs, so we cannot call them from backend_init.  */
>>> -  init_set_costs ();
>>> -  ira_init ();
>>> -
>>> -  expand_dummy_function_end ();
>>> +    {
>>> +      backend_init_target ();
>>> +      this_target_rtl->target_specific_initialized = true;
>>> +    }
>>>  }
>>>
>>>  /* Language-dependent initialization.  Returns nonzero on success.  */


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