On Mon, Oct 10, 2016 at 1:42 PM, Yuri Rumyantsev <ysrum...@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.guent...@gmail.com>: >> On Wed, Oct 5, 2016 at 3:22 PM, Yuri Rumyantsev <ysrum...@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 <ysrum...@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.