diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cfgexpand.c | 9 | ||||
-rw-r--r-- | gcc/tree-inline.c | 14 | ||||
-rw-r--r-- | gcc/tree-ssa-live.c | 34 |
3 files changed, 43 insertions, 14 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index f7b4091..2cbcbc8 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -5956,14 +5956,7 @@ expand_gimple_basic_block (basic_block bb, bool disable_tail_calls) else if (gimple_debug_begin_stmt_p (stmt)) val = GEN_RTX_DEBUG_MARKER_BEGIN_STMT_PAT (); else if (gimple_debug_inline_entry_p (stmt)) - { - tree block = gimple_block (stmt); - - if (block) - val = GEN_RTX_DEBUG_MARKER_INLINE_ENTRY_PAT (); - else - goto delink_debug_stmt; - } + val = GEN_RTX_DEBUG_MARKER_INLINE_ENTRY_PAT (); else gcc_unreachable (); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index d9814bd..360b85f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1819,12 +1819,11 @@ remap_gimple_stmt (gimple *stmt, copy_body_data *id) /* If the inlined function has too many debug markers, don't copy them. */ if (id->src_cfun->debug_marker_count - > param_max_debug_marker_count) + > param_max_debug_marker_count + || id->reset_location) return stmts; gdebug *copy = as_a <gdebug *> (gimple_copy (stmt)); - if (id->reset_location) - gimple_set_location (copy, input_location); id->debug_stmts.safe_push (copy); gimple_seq_add_stmt (&stmts, copy); return stmts; @@ -3169,7 +3168,14 @@ copy_debug_stmt (gdebug *stmt, copy_body_data *id) } if (gimple_debug_nonbind_marker_p (stmt)) - return; + { + if (id->call_stmt && !gimple_block (stmt)) + { + gimple_stmt_iterator gsi = gsi_for_stmt (stmt); + gsi_remove (&gsi, true); + } + return; + } /* Remap all the operands in COPY. */ memset (&wi, 0, sizeof (wi)); diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index 21a9ee4..4cad6fa 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -623,13 +623,43 @@ clear_unused_block_pointer (void) { unsigned i; tree b; - gimple *stmt = gsi_stmt (gsi); + gimple *stmt; + next: + stmt = gsi_stmt (gsi); if (!is_gimple_debug (stmt) && !gimple_clobber_p (stmt)) continue; b = gimple_block (stmt); if (b && !TREE_USED (b)) - gimple_set_block (stmt, NULL); + { + /* Elide debug marker stmts that have an associated BLOCK from an + inline instance removed with also the outermost scope BLOCK of + said inline instance removed. If the outermost scope BLOCK of + said inline instance is preserved use that in place of the + removed BLOCK. That keeps the marker associated to the correct + inline instance (or no inline instance in case it was not from + an inline instance). */ + if (gimple_debug_nonbind_marker_p (stmt) + && BLOCK_ABSTRACT_ORIGIN (b)) + { + while (TREE_CODE (b) == BLOCK + && !inlined_function_outer_scope_p (b)) + b = BLOCK_SUPERCONTEXT (b); + if (TREE_CODE (b) == BLOCK) + { + if (TREE_USED (b)) + { + gimple_set_block (stmt, b); + continue; + } + gsi_remove (&gsi, true); + if (gsi_end_p (gsi)) + break; + goto next; + } + } + gimple_set_block (stmt, NULL); + } for (i = 0; i < gimple_num_ops (stmt); i++) walk_tree (gimple_op_ptr (stmt, i), clear_unused_block_pointer_1, NULL, NULL); |