diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-01-05 21:45:08 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-01-05 21:45:08 +0000 |
commit | d8a5b68899bb4013ddc0e62e73dbc97aedef0067 (patch) | |
tree | 332cf62cb06a61bcde73d0b785c00583c95a8315 /gcc/tree-inline.c | |
parent | b9df73536614fac1bbd4f15e1313c895e4bddaea (diff) | |
download | gcc-d8a5b68899bb4013ddc0e62e73dbc97aedef0067.tar.gz |
PR tree-optimization/64465
* tree-inline.c (redirect_all_calls): During inlining
clean up EH stmts and EH edges if redirect_call_stmt_to_callee
changed the stmt to a non-throwing call.
* gcc.dg/pr64465.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219200 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index e573def60f5..902eb955d39 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -2582,13 +2582,19 @@ void redirect_all_calls (copy_body_data * id, basic_block bb) { gimple_stmt_iterator si; + gimple last = last_stmt (bb); for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) { - if (is_gimple_call (gsi_stmt (si))) + gimple stmt = gsi_stmt (si); + if (is_gimple_call (stmt)) { - struct cgraph_edge *edge = id->dst_node->get_edge (gsi_stmt (si)); + struct cgraph_edge *edge = id->dst_node->get_edge (stmt); if (edge) - edge->redirect_call_stmt_to_callee (); + { + edge->redirect_call_stmt_to_callee (); + if (stmt == last && id->call_stmt && maybe_clean_eh_stmt (stmt)) + gimple_purge_dead_eh_edges (bb); + } } } } |