This makes sure to fall into the delete_unreachable_blocks_update_callgraph handling to remove blocks becoming unreachable when removing EH edges by open-coding gimple_purge_dead_eh_edges.
This fixes an ICE seen with gfortran.dg/gomp/pr88933.f90 when enhancing DSE. Bootstrap & regtest running on x86_64-unknown-linux-gnu. Ok for trunk and branch(es)? 2021-04-28 Richard Biener <rguent...@suse.de> PR ipa/100308 * ipa-prop.c (ipcp_modif_dom_walker::before_dom_children): Open-code gimple_purge_dead_eh_edges, only removing the edge. --- gcc/ipa-prop.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 010c43f33e8..1f55eb5e247 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see #include "options.h" #include "symtab-clones.h" #include "attr-fnspec.h" +#include "cfghooks.h" /* Function summary where the parameter infos are actually stored. */ ipa_node_params_t *ipa_node_params_sum = NULL; @@ -5616,9 +5617,22 @@ ipcp_modif_dom_walker::before_dom_children (basic_block bb) } *m_something_changed = true; - if (maybe_clean_eh_stmt (stmt) - && gimple_purge_dead_eh_edges (gimple_bb (stmt))) - *m_cfg_changed = true; + if (maybe_clean_eh_stmt (stmt)) + { + /* Open-code gimple_purge_dead_eh_edges to not remove + dominated blocks here which wouldn't correctly update + the callgraph (PR100308). */ + edge_iterator ei; + edge e; + for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei));) + if (e->flags & EDGE_EH) + { + remove_edge (e); + *m_cfg_changed = true; + } + else + ei_next (&ei); + } } return NULL; } -- 2.26.2