diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2017-12-20 14:48:34 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2017-12-20 14:48:34 +0000 |
commit | 67a8d7199fe4e474f7bd565161fa2f27d59969fc (patch) | |
tree | 6093bd1b061517b897df00a25e329bbff6c51b48 /gcc/var-tracking.c | |
parent | 8a91d5455313fb3c4fc07935d848921012cb297f (diff) | |
download | gcc-67a8d7199fe4e474f7bd565161fa2f27d59969fc.zip gcc-67a8d7199fe4e474f7bd565161fa2f27d59969fc.tar.gz gcc-67a8d7199fe4e474f7bd565161fa2f27d59969fc.tar.bz2 |
[SFN] debug markers before labels no more
Make sure that gimple and RTL IRs don't have debug markers before
labels. When we build the CFG, we move labels before any markers
appearing before them. Then, make sure we don't mistakenly
reintroduce them.
This reverts some of the complexity that had been brought about by the
initial SFN patches.
for gcc/ChangeLog
PR bootstrap/83396
* cfgexpand.c (label_rtx_for_bb): Revert SFN changes that
allowed debug stmts before labels.
(expand_gimple_basic_block): Likewise.
* gimple-iterator.c (gimple_find_edge_insert_loc): Likewise.
* gimple-iterator.h (gsi_after_labels): Likewise.
* tree-cfgcleanup (remove_forwarder_block): Likewise, but
rename reused variable, and simplify using gsi_move_before.
* tree-ssa-tail-merge.c (find_duplicate): Likewise.
* tree-cfg.c (make_edges, cleanup_dead_labels): Likewise.
(gimple_can_merge_blocks_p, verify_gimple_in_cfg): Likewise.
(gimple_verify_flow_info, gimple_block_label): Likewise.
(make_blocks): Move debug markers after adjacent labels.
* cfgrtl.c (skip_insns_after_block): Revert SFN changes that
allowed debug insns outside blocks.
* df-scan.c (df_insn_delete): Likewise.
* lra-constraints.c (update_ebb_live_info): Likewise.
* var-tracking.c (get_first_insn, vt_emit_notes): Likewise.
(vt_initialize, delete_vta_debug_insns): Likewise.
(reemit_marker_as_note): Drop BB parm. Adjust callers.
From-SVN: r255895
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 65 |
1 files changed, 6 insertions, 59 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index c158759..77281fb 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -9511,24 +9511,6 @@ emit_notes_in_bb (basic_block bb, dataflow_set *set) } } -/* Return BB's head, unless BB is the block that succeeds ENTRY_BLOCK, - in which case it searches back from BB's head for the very first - insn. Use [get_first_insn (bb), BB_HEAD (bb->next_bb)[ as a range - to iterate over all insns of a function while iterating over its - BBs. */ - -static rtx_insn * -get_first_insn (basic_block bb) -{ - rtx_insn *insn = BB_HEAD (bb); - - if (bb->prev_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)) - while (rtx_insn *prev = PREV_INSN (insn)) - insn = prev; - - return insn; -} - /* Emit notes for the whole function. */ static void @@ -9557,8 +9539,7 @@ vt_emit_notes (void) { /* Emit the notes for changes of variable locations between two subsequent basic blocks. */ - emit_notes_for_differences (get_first_insn (bb), - &cur, &VTI (bb)->in); + emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in); if (MAY_HAVE_DEBUG_BIND_INSNS) local_get_addr_cache = new hash_map<rtx, rtx>; @@ -9966,7 +9947,7 @@ vt_init_cfa_base (void) /* Reemit INSN, a MARKER_DEBUG_INSN, as a note. */ static rtx_insn * -reemit_marker_as_note (rtx_insn *insn, basic_block *bb) +reemit_marker_as_note (rtx_insn *insn) { gcc_checking_assert (DEBUG_MARKER_INSN_P (insn)); @@ -9981,8 +9962,6 @@ reemit_marker_as_note (rtx_insn *insn, basic_block *bb) { note = emit_note_before (kind, insn); NOTE_MARKER_LOCATION (note) = INSN_LOCATION (insn); - if (bb) - BLOCK_FOR_INSN (note) = *bb; } delete_insn (insn); return note; @@ -10190,39 +10169,11 @@ vt_initialize (void) HOST_WIDE_INT offset = VTI (bb)->out.stack_adjust; VTI (bb)->out.stack_adjust = VTI (bb)->in.stack_adjust; - /* If we are walking the first basic block, walk any HEADER - insns that might be before it too. Unfortunately, - BB_HEADER and BB_FOOTER are not set while we run this - pass. */ rtx_insn *next; - bool outside_bb = true; - for (insn = get_first_insn (bb); insn != BB_HEAD (bb->next_bb); - insn = next) + FOR_BB_INSNS_SAFE (bb, insn, next) { - if (insn == BB_HEAD (bb)) - outside_bb = false; - else if (insn == NEXT_INSN (BB_END (bb))) - outside_bb = true; - next = NEXT_INSN (insn); if (INSN_P (insn)) { - if (outside_bb) - { - /* Ignore non-debug insns outside of basic blocks. */ - if (!DEBUG_INSN_P (insn)) - continue; - /* Debug binds shouldn't appear outside of bbs. */ - gcc_assert (!DEBUG_BIND_INSN_P (insn)); - } - basic_block save_bb = BLOCK_FOR_INSN (insn); - if (!BLOCK_FOR_INSN (insn)) - { - gcc_assert (outside_bb); - BLOCK_FOR_INSN (insn) = bb; - } - else - gcc_assert (BLOCK_FOR_INSN (insn) == bb); - if (!frame_pointer_needed) { insn_stack_adjust_offset_pre_post (insn, &pre, &post); @@ -10244,7 +10195,7 @@ vt_initialize (void) adjust_insn (bb, insn); if (DEBUG_MARKER_INSN_P (insn)) { - insn = reemit_marker_as_note (insn, &save_bb); + reemit_marker_as_note (insn); continue; } @@ -10296,7 +10247,6 @@ vt_initialize (void) } } } - BLOCK_FOR_INSN (insn) = save_bb; } } gcc_assert (offset == VTI (bb)->out.stack_adjust); @@ -10338,15 +10288,12 @@ delete_vta_debug_insns (void) FOR_EACH_BB_FN (bb, cfun) { - for (insn = get_first_insn (bb); - insn != BB_HEAD (bb->next_bb) - ? next = NEXT_INSN (insn), true : false; - insn = next) + FOR_BB_INSNS_SAFE (bb, insn, next) if (DEBUG_INSN_P (insn)) { if (DEBUG_MARKER_INSN_P (insn)) { - insn = reemit_marker_as_note (insn, NULL); + reemit_marker_as_note (insn); continue; } |