diff options
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 27d985e..349d109 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -873,7 +873,20 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scal gcc_assert (lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt) != 0); - if (tree_could_throw_p (stmt)) + if (tree_could_throw_p (stmt) + /* When we are cloning for inlining, we are supposed to + construct a clone that calls precisely the same functions + as original. However IPA optimizers might've proved + earlier some function calls as non-trapping that might + render some basic blocks dead that might become + unreachable. + + We can't update SSA with unreachable blocks in CFG and thus + we prevent the scenario by preserving even the "dead" eh + edges until the point they are later removed by + fixup_cfg pass. */ + || (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES + && lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt) > 0)) { int region = lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt); /* Add an entry for the copied tree in the EH hashtable. |