On Mon, Apr 26, 2021 at 9:06 PM Andrew MacLeod via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> With the opening of stage 1, It seems like an appropriate time to talk
> about our vision for Ranger in GCC 12.
>
> First, we have a queued up a list of
> improvements/fixes/adjustments/performance to the existing code which
> we'll check in first. We'll cover each of those in the patches as we
> submit them.
>
> Second: We've been busy since last November working on the missing
> pieces. A high level overview of the changes:
>
>  1. There is now a Relation Oracle which can indicate whether there is a
>     relationship between 2 ssa-names. It is contextual and dominance
>     based, and a totally separate component. It also contains an
>     equivalency tracker which can indicate what ssa-names are equivalent
>     to other names.
>  2. Equivalencies/relations are integrated into range-query, range-ops
>     and gori, and can be used to assist with improving ranges.
>  3. A new common API interface accessed via cfun has been created. This
>     will make it transparent whether the source of range information is
>     global ranges, or a ranger invoked at the request of the pass.
>     Clients will no longer be required to manage an instance on their own.
>  4. A new threader has been developed which also utilizes some of the
>     dependency properties of GORI and achieves 45% more thread-able paths.
>  5. With all these additions, ranger/gori has also been reorganized a
>     bit to:
>       * Better integrate the new components,
>       * Exposing non-range-ops stmts to the same generalized interface
>         for folding and outgoing edge calculations,
>       * Expose relations to all stmt kind evaluations (including builtin
>         functions).
>
> Over the next few weeks we'll start introducing patch sets to bring all
> these changes to trunk.   There will be more details in each of those
> patch sets, and we'll space them out a bit to help identify any
> immediate issues.  I'll also address any performance impact with each
> patch-set as they are introduced.
>
> Third: Current status vs EVRP/VRP.
>
>  1. We constantly run builds against a hybrid benchmark of "new gets" to
>     ensure we aren't losing opportunities. When either pass in hybrid
>     mode produces a constant value the other doesn't, its tagged in the
>     listing.   Running at -O2 over 396 pre-processed gcc source files,
>     Ranger picks up 4800+ more constants/stmt folds than EVRP does, and
>     evrp currently finds 6 constants that ranger does not get.  We are
>     still working on those :-)
>  2. With all the additional work, Ranger is approaching a place where I
>     would consider it a viable replacement for EVRP.  Once all the
>     outstanding patch sets have been applied and allowed to settle for a
>     bit, I would propose we change the default evrp-mode from the
>     current hybrid mode to "ranger-only" .   I would also suggest leave
>     the hybrid ability in place for a while to allow back checking and
>     as a fail-safe.  Then we can look at trimming out code we don't need
>     any more later in stage 1.
>  3. Aldy has been doing some comparisons against original VRP recently
>     and we think ranger is becoming a pretty solid replacement.   We'll
>     bring this up again later in the summer when all the ranger changes
>     are stable and re-evaluate.   VRP is trickier to compare against
>     thanks to the ASSERT_EXPRS, but running another ranger pass
>     immediately before VRP1 & VRP2 and comparing conditions that are
>     folded away we see  VRP1: 5482 folds vs Ranger: 6338 folds, and
>     VRP2: 376 fold vs Ranger: 467 Folds.    VRP1 currently folds 77
>     branches Ranger misses, and likewise VRP2 folds 199 that Ranger
>     misses.  We'll eventually get to investigating what those are and
>     resolving them.  In summary Ranger currently folds 15% & 24% more
>     branches, but also misses some.
>
> Fourth: Plans for this GCC 12/stage 1
>
> I have a very long laundry list of things, the challenge is determining
> what we can get into this release. :-)
>
> We have a few high level goals for this release. Ideally, we'd like to
>
>   * Run EVRP in ranger only mode.
>   * Remove VRP and replace it with an identical EVRP ranger-only pass.
>   * Remove any other compiler references to symbolics in value_range.
>   * Move irange back to a wide-int only implementation once we no longer
>     need to support legacy compatibility. This should also result in a
>     noticeable speed increase.
>
> Additional focus during this release will be for
>
>   * ease of use .. ensuring the interface for all passes is easy to use
>     and performs well.
>   * performance improvements.
>   * resolve as many of the ~29 or so outstanding PRs as possible.
>
> The longer laundry list of outstanding projects consists of:
>
>   * Expand the cfun interface such that there is a persistent global
>     cache when a ranger isn't active and all passes use the new
>     range_query interface rather than the current SSA_NAME_RANGE_INFO()
>     or get_range_info() mechanism.
>   * Add stmt side effects to register ranges that are produced against
>     operands that are not a result.  This will also replace the current
>     immediate-use tracking non-null processing code, as well as non-zero
>     after divides, etc.
>   * Allow injection of new ranges when a pass can determine something
>     outside rangers abilities.
>   * Additional enhancement to the basic relation processing. We are
>     currently missing various transitive relationships that would be
>     handy, among others.
>   * The basic ability to use relations on fold/op1_range/op2_range
>     calculations is there, but not fully realized. there are numerous
>     instances to be fleshed out.
>   * Furthermore, also flesh out the ability to use relations with all
>     the other kinds of stmts, not just range-ops, but also builtins etc.
>   * Revamp the on-entry range cache to be more dominance based - purely
>     performance.
>   * Bit tracking support.
>   * vrange support..  A new general base class allowing us to implement
>     ranges for floating point, native pointers, complex int, etc using
>     the same general framework.
>   * Remove legacy code once it is no longer needed.
>
> I further anticipate additional uses of ranger in other passes, like the
> new threading pass Aldy plans to introduce.
>
> The final thing I plan to incorporate is some documentation of ranger
> technology.  There are a lot of features and data available in the
> Ranger ecosystem that could be useful elsewhere.  No one really knows
> about them, and rather than trying to write everything up at once, I
> propose to write a *[ranger tech] *post once a week. I'd send it to this
> gcc list introducing some Ranger component and how it works. Small
> pieces like this make it more likely someone will read and identify
> something useful to them. And perhaps we can find ways to make them more
> generally applicable to other uses. These will then be incorporated into
> a wiki-page for documentation purposes, and over time should form a good
> basis of documentation without overwhelming anyone (including myself :-)
> with a huge doc drop all at once.
>
> Its been a busy 6 months, and it appears to also be a very busy stage 1.
> Please, feel free to offer comments on this plan or on individual
> components as we introduce them.

I'd really prefer to keep a simple lattice-style value range analysis pass
so we have sth we can run at -O1 over those large machine generated
codes where ranger blows up on.  EVRP was supposed to be that - I know
you're somewhat obsessed to turn everything into "ranger" - and for
the core value-range primitives I agree that we only want "one", but then
there are advantages to lattice-style operation.

So - can you please re-consider on your EVRP plans?  I have no objection
to ditching the SSA propagator VRP pass and ASSERT_EXPRs or to using
ranger from where "on-demand" makes more sense.

Richard.

> Andrew & Aldy
>
>

Reply via email to