https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116850
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Version|unknown |15.0 CC| |matz at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Target Milestone|--- |12.5 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- It's basically a checking issue - we're computing post-dominators on demand but with checking each time we do this we verify them. But our CFG manipulations do not update post-dominators which is what it trips on. I've tried the following but post-dom updating isn't easy if the new block is the successor. We should pretend the old block was new and re-associate existing post-dom info with the new block. diff --git a/gcc/gimple-ssa-isolate-paths.cc b/gcc/gimple-ssa-isolate-paths.cc index fae18db0c1d..c0d4451384a 100644 --- a/gcc/gimple-ssa-isolate-paths.cc +++ b/gcc/gimple-ssa-isolate-paths.cc @@ -104,14 +104,27 @@ insert_trap (gimple_stmt_iterator *si_p, tree op) gsi_insert_after (si_p, seq, GSI_NEW_STMT); if (stmt_ends_bb_p (stmt)) { - split_block (gimple_bb (stmt), stmt); + edge e = split_block (gimple_bb (stmt), stmt); + if (dom_info_available_p (CDI_POST_DOMINATORS)) + /* FIXME */; return; } } else gsi_insert_before (si_p, seq, GSI_NEW_STMT); - split_block (gimple_bb (new_stmt), new_stmt); + edge e = split_block (gimple_bb (new_stmt), new_stmt); + if (dom_info_available_p (CDI_POST_DOMINATORS)) + { + e->dest->dom[1] + = e->src->dom[1]; + e->src->dom[1] = NULL; + add_to_dominance_info (CDI_POST_DOMINATORS, e->src); + set_immediate_dominator (CDI_POST_DOMINATORS, e->src, + e->dest); + redirect_immediate_dominators (CDI_POST_DOMINATORS, e->dest, + e->src); + } *si_p = gsi_for_stmt (stmt); } That said, it would be best to remove the requirement on post-dominators. I think we can end up running into the broken post-dom info and we don't want to re-compute it all the time. diff --git a/gcc/gimple-ssa-isolate-paths.cc b/gcc/gimple-ssa-isolate-paths.cc index fae18db0c1d..401f99789f3 100644 --- a/gcc/gimple-ssa-isolate-paths.cc +++ b/gcc/gimple-ssa-isolate-paths.cc @@ -803,7 +818,8 @@ warn_return_addr_local (basic_block bb, greturn *return_stmt) return; /* We only need it for this particular case. */ - calculate_dominance_info (CDI_POST_DOMINATORS); + if (!dom_info_available_p (CDI_POST_DOMINATORS)) + calculate_dominance_info (CDI_POST_DOMINATORS); const args_loc_t *argsloc = locmap.get (return_stmt); gcc_assert (argsloc); fixes the ICE but as said above leaves us to possibly refer to broken / non-existent DOM info and crash.