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.
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.