[PATCH 9e] Update "startwith" logic for pass-skipping to handle __RTL functions

Richard Biener richard.guenther@gmail.com
Tue Jan 17 09:28:00 GMT 2017


On Mon, Jan 16, 2017 at 10:42 PM, Jeff Law <law@redhat.com> wrote:
> On 01/09/2017 07:38 PM, David Malcolm wrote:
>>
>> gcc/ChangeLog:
>>         * passes.c: Include "insn-addr.h".
>>         (should_skip_pass_p): Add logging.  Update logic for running
>>         "expand" to be compatible with both __GIMPLE and __RTL.  Guard
>>         property-provider override so it is only done for gimple passes.
>>         Don't skip dfinit.
>>         (skip_pass): New function.
>>         (execute_one_pass): Call skip_pass when skipping passes.
>> ---
>>  gcc/passes.c | 65
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
>>  1 file changed, 58 insertions(+), 7 deletions(-)
>>
>> diff --git a/gcc/passes.c b/gcc/passes.c
>> index 31262ed..6954d1e 100644
>> --- a/gcc/passes.c
>> +++ b/gcc/passes.c
>> @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3.  If not see
>>  #include "cfgrtl.h"
>>  #include "tree-ssa-live.h"  /* For remove_unused_locals.  */
>>  #include "tree-cfgcleanup.h"
>> +#include "insn-addr.h" /* for INSN_ADDRESSES_ALLOC.  */
>
> insn-addr?  Yuk.
>
>
>>
>>  using namespace gcc;
>>
>> @@ -2315,26 +2316,73 @@ should_skip_pass_p (opt_pass *pass)
>>    if (!cfun->pass_startwith)
>>      return false;
>>
>> -  /* We can't skip the lowering phase yet -- ideally we'd
>> -     drive that phase fully via properties.  */
>> -  if (!(cfun->curr_properties & PROP_ssa))
>> -    return false;
>> + /* For __GIMPLE functions, we have to at least start when we leave
>> +     SSA.  */
>> +  if (pass->properties_destroyed & PROP_ssa)
>> +    {
>> +      if (!quiet_flag)
>> +       fprintf (stderr, "starting anyway when leaving SSA: %s\n",
>> pass->name);
>> +      cfun->pass_startwith = NULL;
>> +      return false;
>> +    }
>
> This seems to need a comment -- it's not obvious how destroying the SSA
> property maps to a pass that can not be skipped.
>>
>>
>>
>> -  /* And also run any property provider.  */
>> -  if (pass->properties_provided != 0)
>> +  /* Run any property provider.  */
>> +  if (pass->type == GIMPLE_PASS
>> +      && pass->properties_provided != 0)
>>      return false;
>
> So comment needed here too.  I read this as "if a gimple pass provides a
> property then it should not be skipped.  Which means that an RTL pass that
> provides a property can?
>
>
>>
>> +  /* Don't skip df init; later RTL passes need it.  */
>> +  if (strstr (pass->name, "dfinit") != NULL)
>> +    return false;
>
> Which seems like a failing in RTL passes saying they need DF init.
>
>
>
>> +/* Skip the given pass, for handling passes before "startwith"
>> +   in __GIMPLE and__RTL-marked functions.
>> +   In theory, this ought to be a no-op, but some of the RTL passes
>> +   need additional processing here.  */
>> +
>> +static void
>> +skip_pass (opt_pass *pass)
>
> ...
> This all feels like a failing in how we handle state in the RTL world. And I
> suspect it's prone to error.  Imagine if I'm hacking on something in the RTL
> world and my code depends on something else being set up.   I really ought
> to have a way within my pass to indicate what I depend on. Having it hidden
> away in passes.c makes it easy to miss/forget.
>
>
>> +{
>> +  /* Pass "reload" sets the global "reload_completed", and many
>> +     things depend on this (e.g. instructions in .md files).  */
>> +  if (strcmp (pass->name, "reload") == 0)
>> +    reload_completed = 1;
>
> Seems like this ought to be a property provided by LRA/reload.
>
>
>> +
>> +  /* The INSN_ADDRESSES vec is normally set up by
>> +     shorten_branches; set it up for the benefit of passes that
>> +     run after this.  */
>> +  if (strcmp (pass->name, "shorten") == 0)
>> +    INSN_ADDRESSES_ALLOC (get_max_uid ());
>
> Similarly ought to be provided by shorten-branches
>
>> +
>> +  /* Update the cfg hooks as appropriate.  */
>> +  if (strcmp (pass->name, "into_cfglayout") == 0)
>> +    {
>> +      cfg_layout_rtl_register_cfg_hooks ();
>> +      cfun->curr_properties |= PROP_cfglayout;
>> +    }
>> +  if (strcmp (pass->name, "outof_cfglayout") == 0)
>> +    {
>> +      rtl_register_cfg_hooks ();
>> +      cfun->curr_properties &= ~PROP_cfglayout;
>> +    }
>> +}
>
> This feels somewhat different, but still a hack.
>
> I don't have strong suggestions on how to approach this, but what we've got
> here feels like a hack and one prone to bitrot.

All the above needs a bit of cleanup in the way we use (or not use) PROP_xxx.
For example right now you can't startwith a __GIMPLE with a pass inside the
loop pipeline because those passes expect loops to be initialized and be in
loop-closed SSA.  And with the hack above for the property providers you'll
always run pass_crited (that's a bad user of a PROP_).

Ideally we'd figure out required properties from the startwith pass
(but there's not
an easy way to compute it w/o actually "executing" the passes) and then enable
enough passes on the way to it providing those properties.

Or finally restructure things in a way that the pass manager automatically runs
property provider passes before passes requiring properties that are
not yet available...

Instead of those pass->name comparisions we could invent a new flag in the
pass structure whether a pass should always be run for __GIMPLE or ___RTL
but that's a bit noisy right now.

So I'm fine with the (localized) "hacks" for the moment.

Richard.

> jeff



More information about the Gcc-patches mailing list