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? ChangeLog: 2016-10-05 Yuri Rumyantsev * 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.