public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Andrew MacLeod <amacleod@redhat.com>
Cc: GCC <gcc@gcc.gnu.org>, Jeff Law <law@redhat.com>,
	Aldy Hernandez <aldyh@redhat.com>
Subject: Re: On-Demand range technology [6/5] - Integration
Date: Tue, 11 Jun 2019 12:33:00 -0000	[thread overview]
Message-ID: <CAFiYyc3oQBzbf9xuWi_-F-Oq+thb_bj8jaLaKUzsz78EXrHzSA@mail.gmail.com> (raw)
In-Reply-To: <9653b14e-6dd0-3931-0965-0069a11afac1@redhat.com>

On Fri, Jun 7, 2019 at 4:54 PM Andrew MacLeod <amacleod@redhat.com> wrote:
>
> On 6/7/19 8:25 AM, Richard Biener wrote:
> > On Wed, Jun 5, 2019 at 10:56 PM Andrew MacLeod <amacleod@redhat.com> wrote:
> >> After the various discussions, I've evaluated how I think everything can
> >> fit together, so this is my proposal for integration with trunk.
> >>
> >>
> >> The complete Ranger prototype consists of 5 major  components, one of
> >> which is missing/un-implemented as yet :-)
> >>
> >> 1 - irange -      This is the non-symbolic range implementation we've
> >> been using which represents ranges as groups of ordered sub-ranges.
> >> 2 - range-ops -  This is the component which extracts ranges from
> >> statements, and so performs the functionality of extract_range_from_*,
> >> except it operates on the irange API and also allows for solving of
> >> operands other than just the LHS of the expression.
> >> 3 - GORI-computes -  This is the component which utilizes range-ops to
> >> compute a range on an outgoing edge for any ssa-name in the definition
> >> chain of the branch
> >>         a_3 = b_6 * 2
> >>         d_8 = a_3 - 20
> >>        if (d_8 < 30)
> >>      the GORI-compute component can generate ranges for d_8, a_3 and b_6.
> >> 4 - GORI-Cache and the Ranger.  Working together, this provides the
> >> on-demand range functionality to resolve ranges
> >> 5 - relational/equivalency tracker - This is the sketched out but
> >> unimplemented bit which tracks the symbolic relationships, and remove
> >> the need for ranges to support symbolics. ( <,<=, >, >=, ==, != and none).
> >>
> >> The consensus appears to be that range-ops and gori-computes are good
> >> candidates to replace aspects of vr-values and assert generation.
> >>
> >> A)
> >> Until I get to (5) (relational tracker), using (1) (irange) is a
> >> non-starter since it doesn't handle symbolics.
> >>
> >> To eliminate the range issue from the equation,  Aldy is currently
> >> working on unifying the irange and value_range APIs.   This will allow
> >> the rest of the ranger code base to use the value_range implementation
> >> transparently.   We can talk about irange or some alternate
> >> implementation of ranges at some later point, but there'll be an API
> >> that works for all clients.
> >>
> >> The existing value_range API gets a few tweaks/cleanups, but mostly
> >> there is an additional set of calls to query sub-ranges which the ranger
> >> and range-ops require. These routines basically translate the various
> >> value ranges formats into discrete sub-ranges.  Thru these rotuines,
> >> ANTI_RANGE will appear as 2 sub-ranges, VARYING as a [MIN, MAX] range,
> >> and UNDEFINED as an empty range [].  These additions should allow
> >> value_range to function as the range implementation for both the ranger
> >> and VRP.
> >>
> >> I suspect he will have patches coming shortly that will help to unify
> >> the 2 range implementations, we can discuss details over those patches..
> >>
> >> B)
> >> A Unified range API then allows us to work on integrating the range-ops
> >> and GORI-computes component into the code base.   Range ops would
> >> replace the various extract_range_from_*_ routines in vr_values for
> >> statement level ranges.  GORI-computes would then replace the assert
> >> building code for calculating outgoing ranges on edges.  In theory EVRP
> >> then simply calls range_on_edge() from gori_compute instead of
> >> register_edge_assert() .
> >>
> >> The range ops code is designed to perform all evaluations assuming an
> >> arbitrary number of sub-ranges.  Aldy spent a lot of time last year
> >> unifying the VRP code and the range-ops code to get the identical
> >> results, and they frequently share a common base. He  has gone thru
> >> excruciating care to ensure the calculations are identical and verifies
> >> it by calculating everything using both code bases, comparing them, and
> >> aborting if the results ever get diverge.
> >>
> >> We will need to adjust the range-ops code to work with symbolics in
> >> certain place. This means PLUS, MINUS, all the relations (<,>, etc), and
> >> copy. Probably something else as it is encountered. This is un-sized as
> >> yet, but I'm hoping won't be too bad assuming we can utilize some of the
> >> existing code for those bits..  More details when we actually start
> >> doing this and find the lurking dragons.
> >>
> >> we'll worry about bitmasks and equivalencies when we get closer to
> >> functioning, but I don't foresee too much problem since value_range_base
> >> is still being used.
> >>
> >>
> >> C)  That will keep us busy for a while, and should result in the core
> >> integration.   Meanwhile, we'll try to figure out the relational code
> >> design. I'll go back to my original design, adjust that, then we can
> >> figure out how best to proceed to address the various needs.
> >>
> >> D) Finally, the GORI-cache and on-demand ranger are blocked until the
> >> above work is finished.
> >>
> >>
> >> One additional thing I would like to do eventually is tweak EVRP
> >> slightly to align with the ranger model.
> >>
> >> The ranger API is basically just 5 entry points which the ranger uses to
> >> determine ranges.
> >>       range_of_expr  - range of a use on a statement
> >>       range_of_stmt  - range of the result of the statement, (calculated
> >> by range-ops).
> >>       range_on_edge - range on an edge - (provided by gori_computes)
> >>       range_on_entry - range on entry to a block (provided by gori-cache)
> >>       range_on_exit - range after the last statement in a block
> >>
> >> Abstracted and simplified, I believe EVRP functions more or less like
> >> this? :
> >>
> >> - EVRP  starts a block with it's "current range" vector initialized to
> >> the range on entry values. (provided as you step into the block),
> >> - It then walks the IL for the block, evaluating each statement,
> >> possibly simplifying,  and updating this current range vector.
> >> - when it reaches the bottom of the block, it calculates outgoing ranges
> >> on each edge and updates those  to provide a current range at the start
> >> each successor block.
> > Actually EVRP computes range on entry when starting a block
> > from "current range" vector plus the ranges derived from a
> > controlling expression on a single predecessor edge.
> > It does not push any ranges for outgoing edges.  This is because
> > it uses the simple DOM-walk stack to push/pop conditional info.
>
> ah, ok. so it just pulls the range from an incoming edge rather than
> pushing on outgoing edges.
>
> It should not be too difficult to pull aditional incoming ranges when
> they are available then.
> >
> >>
> >>
> >> Does this seem reasonable?
> > I think that's a reasonable plan.  You may be aware that we added a
> > very "simple" (implementation-wise) on-demand query to VRP
> > called determine_value_range () that computes a range for a
> > GENERIC expression rather than an SSA name.  On the bottom
> > it relies on SSA name range info in the IL instead of walking
> > use-def chains and controlling conditions there (but I even had a
> > patch to add that ability at some point).
> >
> > Ranger probably lacks the parsing of GENERIC expressions
> > at the moment?
> >
> no such facility right now...  but I would expect it to be mostly driven
> by calls into the range-ops code.   Who is the consumer of that?

IIRC some warning code at expansion time, niter analysis and
IVOPTs (by being fed analysis results from scalar evolution analysis).

Richard.

>

      reply	other threads:[~2019-06-11 12:33 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-05 20:56 Andrew MacLeod
2019-06-07 12:25 ` Richard Biener
2019-06-07 12:46   ` Aldy Hernandez
2019-06-07 14:54   ` Andrew MacLeod
2019-06-11 12:33     ` Richard Biener [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAFiYyc3oQBzbf9xuWi_-F-Oq+thb_bj8jaLaKUzsz78EXrHzSA@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=aldyh@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=gcc@gcc.gnu.org \
    --cc=law@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).