This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, gimplefe] passes.c: split out pass-skipping logic into subroutines
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org,David Malcolm <dmalcolm at redhat dot com>
- Date: Fri, 06 Jan 2017 11:09:40 +0100
- Subject: Re: [PATCH, gimplefe] passes.c: split out pass-skipping logic into subroutines
- Authentication-results: sourceware.org; auth=none
- References: <1483667869-29632-1-git-send-email-dmalcolm@redhat.com>
On January 6, 2017 2:57:49 AM GMT+01:00, David Malcolm <dmalcolm@redhat.com> wrote:
>The GIMPLE frontend's pass-skipping logic in execute_one_pass is
>somewhat
>awkward. This patch splits it out into two subroutines to simplify
>things.
>
>No functional change intended (and this may make it easier to
>update the logic so that it can be shared with the RTL frontend).
>
>Successfully bootstrapped®rtested on x86_64-pc-linux-gnu.
>
>OK for trunk?
OK.
Richard.
>gcc/ChangeLog:
> * passes.c (execute_one_pass): Split out pass-skipping logic
> into...
> (determine_pass_name_match): ...this new function and...
> (should_skip_pass_p): ...this new function.
>---
>gcc/passes.c | 97
>+++++++++++++++++++++++++++++++++++++++---------------------
> 1 file changed, 63 insertions(+), 34 deletions(-)
>
>diff --git a/gcc/passes.c b/gcc/passes.c
>index 32d964b..31262ed 100644
>--- a/gcc/passes.c
>+++ b/gcc/passes.c
>@@ -2273,6 +2273,67 @@ override_gate_status (opt_pass *pass, tree func,
>bool gate_status)
> return gate_status;
> }
>
>+/* Determine if PASS_NAME matches CRITERION.
>+ Not a pure predicate, since it can update CRITERION, to support
>+ matching the Nth invocation of a pass.
>+ Subroutine of should_skip_pass_p. */
>+
>+static bool
>+determine_pass_name_match (const char *pass_name, char *criterion)
>+{
>+ size_t namelen = strlen (pass_name);
>+ if (! strncmp (pass_name, criterion, namelen))
>+ {
>+ /* The following supports starting with the Nth invocation
>+ of a pass (where N does not necessarily is equal to the
>+ dump file suffix). */
>+ if (criterion[namelen] == '\0'
>+ || (criterion[namelen] == '1'
>+ && criterion[namelen + 1] == '\0'))
>+ return true;
>+ else
>+ {
>+ if (criterion[namelen + 1] == '\0')
>+ --criterion[namelen];
>+ return false;
>+ }
>+ }
>+ else
>+ return false;
>+}
>+
>+/* For skipping passes until "startwith" pass.
>+ Return true iff PASS should be skipped.
>+ Clear cfun->pass_startwith when encountering the "startwith" pass,
>+ so that all subsequent passes are run. */
>+
>+static bool
>+should_skip_pass_p (opt_pass *pass)
>+{
>+ if (!cfun)
>+ return false;
>+ 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;
>+
>+ if (determine_pass_name_match (pass->name, cfun->pass_startwith))
>+ {
>+ cfun->pass_startwith = NULL;
>+ return false;
>+ }
>+
>+ /* And also run any property provider. */
>+ if (pass->properties_provided != 0)
>+ return false;
>+
>+ /* If we get here, then we have a "startwith" that we haven't seen
>yet;
>+ skip the pass. */
>+ return true;
>+}
>
> /* Execute PASS. */
>
>@@ -2313,40 +2374,8 @@ execute_one_pass (opt_pass *pass)
> return false;
> }
>
>- /* For skipping passes until startwith pass */
>- if (cfun
>- && cfun->pass_startwith
>- /* But we can't skip the lowering phase yet -- ideally we'd
>- drive that phase fully via properties. */
>- && (cfun->curr_properties & PROP_ssa))
>- {
>- size_t namelen = strlen (pass->name);
>- /* We have to at least start when we leave SSA. */
>- if (pass->properties_destroyed & PROP_ssa)
>- cfun->pass_startwith = NULL;
>- else if (! strncmp (pass->name, cfun->pass_startwith, namelen))
>- {
>- /* The following supports starting with the Nth invocation
>- of a pass (where N does not necessarily is equal to the
>- dump file suffix). */
>- if (cfun->pass_startwith[namelen] == '\0'
>- || (cfun->pass_startwith[namelen] == '1'
>- && cfun->pass_startwith[namelen + 1] == '\0'))
>- cfun->pass_startwith = NULL;
>- else
>- {
>- if (cfun->pass_startwith[namelen + 1] != '\0')
>- return true;
>- --cfun->pass_startwith[namelen];
>- return true;
>- }
>- }
>- /* And also run any property provider. */
>- else if (pass->properties_provided != 0)
>- ;
>- else
>- return true;
>- }
>+ if (should_skip_pass_p (pass))
>+ return true;
>
> /* Pass execution event trigger: useful to identify passes being
> executed. */