diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2017-05-10 10:16:54 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2017-05-10 10:16:54 +0000 |
commit | e1ad2926a08a65efae413d84673e11ba695f2bd4 (patch) | |
tree | 97c8067510e1da022eb7b05fa24ef82a66880abf /gcc/tree-inline.c | |
parent | f00b411f5437114d7ee7107be1d150b7d893dfc7 (diff) | |
download | gcc-e1ad2926a08a65efae413d84673e11ba695f2bd4.zip gcc-e1ad2926a08a65efae413d84673e11ba695f2bd4.tar.gz gcc-e1ad2926a08a65efae413d84673e11ba695f2bd4.tar.bz2 |
avoid remove&reinsert of call when splitting block for inlining
We used to split the inlined-into block at (= after) the call, and then
remove the call from the first block to insert it in the second.
The removal may cause unnecessary and unrecoverable resetting of debug
insns: we do not generate debug temps for calls.
Avoid the remove-and-reinsert dance by splitting the block before the
call.
for gcc/ChangeLog
* tree-inline.c (expand_call_inline): Split block at stmt
before the call.
for gcc/testsuite/ChangeLog
* gcc.dg/guality/inline-params-2.c: New.
From-SVN: r247830
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index bfaaede..db3e08f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -4542,33 +4542,20 @@ expand_call_inline (basic_block bb, gimple *stmt, copy_body_data *id) DECL_FUNCTION_PERSONALITY (cg_edge->caller->decl) = DECL_FUNCTION_PERSONALITY (cg_edge->callee->decl); - /* Split the block holding the GIMPLE_CALL. */ - e = split_block (bb, stmt); + /* Split the block before the GIMPLE_CALL. */ + stmt_gsi = gsi_for_stmt (stmt); + gsi_prev (&stmt_gsi); + e = split_block (bb, gsi_end_p (stmt_gsi) ? NULL : gsi_stmt (stmt_gsi)); bb = e->src; return_block = e->dest; remove_edge (e); - /* split_block splits after the statement; work around this by - moving the call into the second block manually. Not pretty, - but seems easier than doing the CFG manipulation by hand - when the GIMPLE_CALL is in the last statement of BB. */ - stmt_gsi = gsi_last_bb (bb); - gsi_remove (&stmt_gsi, false); - /* If the GIMPLE_CALL was in the last statement of BB, it may have been the source of abnormal edges. In this case, schedule the removal of dead abnormal edges. */ gsi = gsi_start_bb (return_block); - if (gsi_end_p (gsi)) - { - gsi_insert_after (&gsi, stmt, GSI_NEW_STMT); - purge_dead_abnormal_edges = true; - } - else - { - gsi_insert_before (&gsi, stmt, GSI_NEW_STMT); - purge_dead_abnormal_edges = false; - } + gsi_next (&gsi); + purge_dead_abnormal_edges = gsi_end_p (gsi); stmt_gsi = gsi_start_bb (return_block); |