public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Biener <richard.guenther@gmail.com>
To: Andrew MacLeod <amacleod@redhat.com>
Cc: Di Zhao <dizhao@os.amperecomputing.com>,
	 "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>,
	Aldy Hernandez <aldyh@redhat.com>
Subject: Re: [PATCH] tree-optimization/101186 - extend FRE with "equivalence map" for condition prediction
Date: Fri, 25 Jun 2021 09:38:09 +0200	[thread overview]
Message-ID: <CAFiYyc3UQ6JZy_-V_MBmTqi_S4sLGRn1Rh+rnh0NgAD4R2+h+g@mail.gmail.com> (raw)
In-Reply-To: <df8fbb5c-303e-7a13-4da6-5556c5f69593@redhat.com>

On Thu, Jun 24, 2021 at 5:01 PM Andrew MacLeod <amacleod@redhat.com> wrote:
>
> On 6/24/21 9:25 AM, Andrew MacLeod wrote:
> > On 6/24/21 8:29 AM, Richard Biener wrote:
> >
> >
> > THe original function in EVRP currently looks like:
> >
> >  =========== BB 2 ============
> >     <bb 2> :
> >     if (a_5(D) == b_6(D))
> >       goto <bb 8>; [INV]
> >     else
> >       goto <bb 7>; [INV]
> >
> > =========== BB 8 ============
> > Equivalence set : [a_5(D), b_6(D)]                 edge 2->8 provides
> > a_5 and b_6 as equivalences
> >     <bb 8> :
> >     goto <bb 6>; [100.00%]
> >
> > =========== BB 6 ============
> >     <bb 6> :
> >     # i_1 = PHI <0(8), i_10(5)>
> >     if (i_1 < a_5(D))
> >       goto <bb 3>; [INV]
> >     else
> >       goto <bb 7>; [INV]
> >
> > =========== BB 3 ============
> > Relational : (i_1 < a_5(D))                         edge 6->3 provides
> > this relation
> >     <bb 3> :
> >     if (i_1 == b_6(D))
> >       goto <bb 4>; [INV]
> >     else
> >       goto <bb 5>; [INV]
> >
> >
> > So It knows that a_5 and b_6 are equivalence, and it knows that i_1 <
> > a_5 in BB3 as well..
> >
> > so we should be able to indicate that  i_1 == b_6 as [0,0]..  we
> > currently aren't.   I think I had turned on equivalence mapping during
> > relational processing, so should be able to tag that without
> > transitive relations...  I'll have a look at why.
> >
> > And once we get a bit further along, you will be able to access this
> > without ranger.. if one wants to simply register the relations directly.
> >
> > Anyway, I'll get back to you why its currently being missed.
> >
> > Andrew
> >
> >
> >
> As promised.  There was a typo in the equivalency comparisons... so it
> was getting missed.  With the fix, the oracle identifies the relation
> and evrp will now fold that expression away and the IL becomes:
>
>    <bb 2> :
>    if (a_5(D) == b_6(D))
>      goto <bb 4>; [INV]
>    else
>      goto <bb 5>; [INV]
>
>    <bb 3> :
>    i_10 = i_1 + 1;
>
>    <bb 4> :
>    # i_1 = PHI <0(2), i_10(3)>
>    if (i_1 < a_5(D))
>      goto <bb 3>; [INV]
>    else
>      goto <bb 5>; [INV]
>
>    <bb 5> :
>    return;
>
> for the other cases you quote, there are no predictions such that if a
> != 0 then this equivalency exists...
>
> +  if (a != 0)
> +    {
> +      c = b;
> +    }
>
> but the oracle would register that in the TRUE block,  c and b are
> equivalent... so some other pass that was interested in tracking
> conditions that make a block relevant would be able to compare relations...

I guess to fully leverage optimizations for cases like

  if (a != 0)
    c = b;
  ...
  if (a != 0)
    {
        if (c == b)
...
    }

one would need to consider the "optimally jump threaded path" to the
program point where the to be optimized stmt resides, making all
originally conditional but on the jump threaded path unconditional
relations and equivalences available.

For VN that could be done by unwinding to the CFG merge after
the first if (a != 0), treating only one of the predecessor edges
as executable and registering the appropriate a != 0 result and
continue VN up to the desired point, committing to the result
until before the CFG merge after the second if (a != 0).  And then
unwinding again for the "else" path.  Sounds like a possible
explosion in complexity as well if second-order opportunities
arise.

That is, we'd do simplifications exposed by jump threading but
without actually doing the jump threading (which will of course
not allow all possible simplifications w/o inserting extra PHIs
for computations we might want to re-use).

Richard.

> Andrew
>
>

  reply	other threads:[~2021-06-25  7:38 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-24  9:54 Di Zhao
2021-06-24 12:29 ` Richard Biener
2021-06-24 13:25   ` Andrew MacLeod
2021-06-24 15:01     ` Andrew MacLeod
2021-06-25  7:38       ` Richard Biener [this message]
2021-06-27 15:46         ` Aldy Hernandez
2021-06-28  8:12           ` Richard Biener
2021-06-28 13:15           ` Andrew MacLeod
2021-06-29 10:54             ` Richard Biener
2021-07-18 19:25   ` Di Zhao OS
2021-07-28  9:38     ` Richard Biener

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=CAFiYyc3UQ6JZy_-V_MBmTqi_S4sLGRn1Rh+rnh0NgAD4R2+h+g@mail.gmail.com \
    --to=richard.guenther@gmail.com \
    --cc=aldyh@redhat.com \
    --cc=amacleod@redhat.com \
    --cc=dizhao@os.amperecomputing.com \
    --cc=gcc-patches@gcc.gnu.org \
    /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).