public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Yuri Rumyantsev <ysrumyan@gmail.com>
To: Richard Biener <richard.guenther@gmail.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: Compile-time improvement for if conversion.
Date: Mon, 10 Oct 2016 14:17:00 -0000	[thread overview]
Message-ID: <CAEoMCqS3L5LNkg3pHqB7RxLEDtRHtbjOwkKtOyMoL_9vVhCvdA@mail.gmail.com> (raw)
In-Reply-To: <CAFiYyc2btM5gS-PQaR_uQ=BvBW8hRfuH=9ptSDOj66hYSEXKkQ@mail.gmail.com>

Richard,

If "fake" exit or entry block is created in dominance how we can
determine what is its the only  predecessor or successor without using
a notion of loop?

2016-10-10 15:00 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
> On Mon, Oct 10, 2016 at 1:42 PM, Yuri Rumyantsev <ysrumyan@gmail.com> wrote:
>> Thanks Richard for your comments.
>> I'd like to answer on your last comment regarding use split_edge()
>> instead of creating fake post-header. I started with this splitting
>> but it requires to fix-up closed ssa form by creating additional phi
>> nodes, so I decided to use only cfg change without updating ssa form.
>> Other changes look reasonable and will fix them.
>
> Ah.  In this case can you investigate what it takes to make the entry/exit
> edges rather than BBs?  That is, introduce those "fakes" only internally
> in dominance.c?
>
>> 2016-10-10 12:52 GMT+03:00 Richard Biener <richard.guenther@gmail.com>:
>>> On Wed, Oct 5, 2016 at 3:22 PM, Yuri Rumyantsev <ysrumyan@gmail.com> wrote:
>>>> Hi All,
>>>>
>>>> Here is implementation of Richard proposal:
>>>>
>>>> < For general infrastructure it would be nice to expose a (post-)dominator
>>>> < compute for MESE (post-dominators) / SEME (dominators) regions.  I believe
>>>> < what makes if-conversion expensive is the post-dom compute which happens
>>>> < for each loop for the whole function.  It shouldn't be very difficult
>>>> < to write this,
>>>> < sharing as much as possible code with the current DOM code might need
>>>> < quite some refactoring though.
>>>>
>>>> I implemented this proposal by adding calculation of dominance info
>>>> for SESE regions and incorporate this change to if conversion pass.
>>>> SESE region is built by adding loop pre-header and possibly fake
>>>> post-header blocks to loop body. Fake post-header is deleted after
>>>> predication completion.
>>>>
>>>> Bootstrapping and regression testing did not show any new failures.
>>>>
>>>> Is it OK for trunk?
>>>
>>> It's mostly reasonable but I have a few comments.  First, re-using
>>> bb->dom[] for the dominator info is somewhat fragile but indeed
>>> a requirement to make the patch reasonably small.  Please,
>>> in calculate_dominance_info_for_region, make sure that
>>> !dom_info_available_p (dir).
>>>
>>> You pass loop * everywhere but require ->aux to be set up as
>>> an array of BBs forming the region with special BBs at array ends.
>>>
>>> Please instead pass in a vec<basic_block> which avoids using ->aux
>>> and also allows other non-loop-based SESE regions to be used
>>> (I couldn't spot anything that relies on this being a loop).
>>>
>>> Adding a convenience wrapper for loop  * would be of course nice,
>>> to cover the special pre/post-header code in tree-if-conv.c.
>>>
>>> In theory a SESE region is fully specified by its entry end exit _edge_,
>>> so you might want to see if it's possible to use such a pair of edges
>>> to guard the dfs/idom walks to avoid the need to create fake blocks.
>>>
>>> Btw, instead of using create_empty_bb, unchecked_make_edge, etc.
>>> please use split_edge() of the entry/exit edges.
>>>
>>> Richard.
>>>
>>>> ChangeLog:
>>>> 2016-10-05  Yuri Rumyantsev  <ysrumyan@gmail.com>
>>>>
>>>> * dominance.c : Include cfgloop.h for loop recognition.
>>>> (dom_info): Add new functions and add boolean argument to recognize
>>>> computation for loop region.
>>>> (dom_info::dom_info): New function.
>>>> (dom_info::calc_dfs_tree): Add boolean argument IN_REGION to not
>>>> handle unvisited blocks.
>>>> (dom_info::calc_idoms): Likewise.
>>>> (compute_dom_fast_query_in_region): New function.
>>>> (calculate_dominance_info): Invoke calc_dfs_tree and calc_idoms with
>>>> false argument.
>>>> (calculate_dominance_info_for_region): New function.
>>>> (free_dominance_info_for_region): Likewise.
>>>> (verify_dominators): Invoke calc_dfs_tree and calc_idoms with false
>>>> argument.
>>>> * dominance.h: Add prototype for introduced functions
>>>> calculate_dominance_info_for_region and
>>>> free_dominance_info_for_region.
>>>> tree-if-conv.c: Add to local variables ifc_sese_bbs & fake_postheader.
>>>> (build_sese_region): New function.
>>>> (if_convertible_loop_p_1): Invoke local version of post-dominators
>>>> calculation, free it after basic block predication and delete created
>>>> fake post-header block if any.
>>>> (tree_if_conversion): Delete call of free_dominance_info for
>>>> post-dominators, free ifc_sese_bbs which represents SESE region.
>>>> (pass_if_conversion::execute): Delete detection of infinite loops
>>>> and fake edges to exit block since post-dominator calculation is
>>>> performed per if-converted loop only.

  reply	other threads:[~2016-10-10 14:17 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-05 13:22 Yuri Rumyantsev
2016-10-10  9:52 ` Richard Biener
2016-10-10 11:42   ` Yuri Rumyantsev
2016-10-10 12:00     ` Richard Biener
2016-10-10 14:17       ` Yuri Rumyantsev [this message]
2016-10-11 10:33         ` Richard Biener
2016-10-11 13:23           ` Yuri Rumyantsev
2016-10-11 13:48             ` Richard Biener
2016-10-12 13:37               ` Yuri Rumyantsev
2016-10-13 10:15                 ` Richard Biener
2016-10-14 12:07                   ` Yuri Rumyantsev
2016-10-17 11:53                     ` 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=CAEoMCqS3L5LNkg3pHqB7RxLEDtRHtbjOwkKtOyMoL_9vVhCvdA@mail.gmail.com \
    --to=ysrumyan@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=richard.guenther@gmail.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).