I am currently testing the following patch to fix PR69378 (another fallout of the PR69117 fix).
Bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2016-01-20 Richard Biener <rguent...@suse.de> PR tree-optimization/69378 * tree-ssa-sccvn.c (dominated_by_p_w_unex): New function. (set_ssa_val_to): Use it for dominance checks taking into account not executable edges. Index: gcc/tree-ssa-sccvn.c =================================================================== *** gcc/tree-ssa-sccvn.c (revision 232603) --- gcc/tree-ssa-sccvn.c (working copy) *************** print_scc (FILE *out, vec<tree> scc) *** 2969,2974 **** --- 2969,3055 ---- fprintf (out, "\n"); } + /* Return true if BB1 is dominated by BB2 taking into account edges + that are not executable. */ + + static bool + dominated_by_p_w_unex (basic_block bb1, basic_block bb2) + { + edge_iterator ei; + edge e; + + if (dominated_by_p (CDI_DOMINATORS, bb1, bb2)) + return true; + + /* Before iterating we'd like to know if there exists a + (executable) path from bb2 to bb1 at all, if not we can + directly return false. For now simply iterate once. */ + + /* Iterate to the single executable bb1 predecessor. */ + if (EDGE_COUNT (bb1->preds) > 1) + { + edge prede = NULL; + FOR_EACH_EDGE (e, ei, bb1->preds) + if (e->flags & EDGE_EXECUTABLE) + { + if (prede) + { + prede = NULL; + break; + } + prede = e; + } + if (prede) + { + bb1 = prede->src; + + /* Re-do the dominance check with changed bb1. */ + if (dominated_by_p (CDI_DOMINATORS, bb1, bb2)) + return true; + } + } + + /* Iterate to the single executable bb2 successor. */ + edge succe = NULL; + FOR_EACH_EDGE (e, ei, bb2->succs) + if (e->flags & EDGE_EXECUTABLE) + { + if (succe) + { + succe = NULL; + break; + } + succe = e; + } + if (succe) + { + /* Verify the reached block is only reached through succe. + If there is only one edge we can spare us the dominator + check and iterate directly. */ + if (EDGE_COUNT (succe->dest->preds) > 1) + { + FOR_EACH_EDGE (e, ei, succe->dest->preds) + if (e != succe + && (e->flags & EDGE_EXECUTABLE)) + { + succe = NULL; + break; + } + } + if (succe) + { + bb2 = succe->dest; + + /* Re-do the dominance check with changed bb2. */ + if (dominated_by_p (CDI_DOMINATORS, bb1, bb2)) + return true; + } + } + + /* We could now iterate updating bb1 / bb2. */ + return false; + } + /* Set the value number of FROM to TO, return true if it has changed as a result. */ *************** set_ssa_val_to (tree from, tree to) *** 3046,3060 **** && SSA_NAME_RANGE_INFO (to)) { if (SSA_NAME_IS_DEFAULT_DEF (to) ! || dominated_by_p (CDI_DOMINATORS, ! gimple_bb (SSA_NAME_DEF_STMT (from)), ! gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; else if (SSA_NAME_IS_DEFAULT_DEF (from) ! || dominated_by_p (CDI_DOMINATORS, ! gimple_bb (SSA_NAME_DEF_STMT (to)), ! gimple_bb (SSA_NAME_DEF_STMT (from)))) { /* Save old info. */ if (! VN_INFO (to)->info.range_info) --- 3127,3141 ---- && SSA_NAME_RANGE_INFO (to)) { if (SSA_NAME_IS_DEFAULT_DEF (to) ! || dominated_by_p_w_unex ! (gimple_bb (SSA_NAME_DEF_STMT (from)), ! gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; else if (SSA_NAME_IS_DEFAULT_DEF (from) ! || dominated_by_p_w_unex ! (gimple_bb (SSA_NAME_DEF_STMT (to)), ! gimple_bb (SSA_NAME_DEF_STMT (from)))) { /* Save old info. */ if (! VN_INFO (to)->info.range_info) *************** set_ssa_val_to (tree from, tree to) *** 3076,3090 **** && SSA_NAME_PTR_INFO (to)) { if (SSA_NAME_IS_DEFAULT_DEF (to) ! || dominated_by_p (CDI_DOMINATORS, ! gimple_bb (SSA_NAME_DEF_STMT (from)), ! gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; else if (SSA_NAME_IS_DEFAULT_DEF (from) ! || dominated_by_p (CDI_DOMINATORS, ! gimple_bb (SSA_NAME_DEF_STMT (to)), ! gimple_bb (SSA_NAME_DEF_STMT (from)))) { /* Save old info. */ if (! VN_INFO (to)->info.ptr_info) --- 3157,3171 ---- && SSA_NAME_PTR_INFO (to)) { if (SSA_NAME_IS_DEFAULT_DEF (to) ! || dominated_by_p_w_unex ! (gimple_bb (SSA_NAME_DEF_STMT (from)), ! gimple_bb (SSA_NAME_DEF_STMT (to)))) /* Keep the info from the dominator. */ ; else if (SSA_NAME_IS_DEFAULT_DEF (from) ! || dominated_by_p_w_unex ! (gimple_bb (SSA_NAME_DEF_STMT (to)), ! gimple_bb (SSA_NAME_DEF_STMT (from)))) { /* Save old info. */ if (! VN_INFO (to)->info.ptr_info)