diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-01-06 14:15:20 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-01-06 14:15:20 +0000 |
commit | bad86e8d42c6572dbcf89814597551823aca2e8d (patch) | |
tree | 82963fd6d4852b957b28e06ecf430bb561544a6e | |
parent | 5406184ce77c6362c5cd513b1c4f1c05b5046a6d (diff) | |
download | gcc-bad86e8d42c6572dbcf89814597551823aca2e8d.zip gcc-bad86e8d42c6572dbcf89814597551823aca2e8d.tar.gz gcc-bad86e8d42c6572dbcf89814597551823aca2e8d.tar.bz2 |
passes.c: split out pass-skipping logic into subroutines
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.
From-SVN: r244160
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/passes.c | 97 |
2 files changed, 70 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d34d41..4911025 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-01-06 David Malcolm <dmalcolm@redhat.com> + + * 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. + 2017-01-06 Nathan Sidwell <nathan@acm.org> * ipa-visibility.c (function_and_variable_visibility): Reformat 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. */ |