From: Richard Biener <richard.guenther@gmail.com>
To: Yuri Rumyantsev <ysrumyan@gmail.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: Compile-time improvement for if conversion.
Date: Mon, 10 Oct 2016 09:52:00 -0000 [thread overview]
Message-ID: <CAFiYyc0Ca_r0WLDMvV3_kRRgOAbcsY5MkJF01BZ-K28ak_2v7w@mail.gmail.com> (raw)
In-Reply-To: <CAEoMCqQTEPJYd_Ta0LLAwuwTP-v8CMSvOkf80LFwvi3uXguGjw@mail.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.
next prev parent reply other threads:[~2016-10-10 9:52 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 [this message]
2016-10-10 11:42 ` Yuri Rumyantsev
2016-10-10 12:00 ` Richard Biener
2016-10-10 14:17 ` Yuri Rumyantsev
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=CAFiYyc0Ca_r0WLDMvV3_kRRgOAbcsY5MkJF01BZ-K28ak_2v7w@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=ysrumyan@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).