Commit a7b87f73 by Zdenek Dvorak Committed by Zdenek Dvorak

haifa-sched.c (restore_bb_notes): Clear bb field of the notes emited outside of basic block.

	* haifa-sched.c (restore_bb_notes): Clear bb field of the notes
	emited outside of basic block.
	* cfgbuild.c (find_bb_boundaries): Clear bb field for insns between
	the created blocks.
	* rtl.h (delete_insn_chain): Declaration changed.
	* cfgrtl.c (delete_insn_chain): Add option to clear bb field for
	non-removed insns.
	(rtl_delete_block, rtl_merge_blocks): Pass true to delete_insn_chain.
	(delete_insn_chain_and_edges, try_redirect_by_replacing_jump,
	rtl_tidy_fallthru_edge, cfg_layout_merge_blocks): Pass false 
	to delete_insn_chain.
	(rtl_verify_flow_info_1): Verify that the insns in header and footer
	do not have bb field set.
	(rtl_verify_flow_info): Verify that insns between basic blocks do not
	have bb field set.
	* recog.c (peephole2_optimize): Add argument to delete_insn_chain call.
	* cfgcleanup.c (try_optimize_cfg): Ditto.

From-SVN: r125492
parent 45222d4a
2007-06-06 Zdenek Dvorak <dvorakz@suse.cz>
* haifa-sched.c (restore_bb_notes): Clear bb field of the notes
emited outside of basic block.
* cfgbuild.c (find_bb_boundaries): Clear bb field for insns between
the created blocks.
* rtl.h (delete_insn_chain): Declaration changed.
* cfgrtl.c (delete_insn_chain): Add option to clear bb field for
non-removed insns.
(rtl_delete_block, rtl_merge_blocks): Pass true to delete_insn_chain.
(delete_insn_chain_and_edges, try_redirect_by_replacing_jump,
rtl_tidy_fallthru_edge, cfg_layout_merge_blocks): Pass false
to delete_insn_chain.
(rtl_verify_flow_info_1): Verify that the insns in header and footer
do not have bb field set.
(rtl_verify_flow_info): Verify that insns between basic blocks do not
have bb field set.
* recog.c (peephole2_optimize): Add argument to delete_insn_chain call.
* cfgcleanup.c (try_optimize_cfg): Ditto.
2007-06-06 Thomas Neumann <tneumann@users.sourceforge.net> 2007-06-06 Thomas Neumann <tneumann@users.sourceforge.net>
* lambda-code.c (struct lambda_lattice_s): Add a name to the struct. * lambda-code.c (struct lambda_lattice_s): Add a name to the struct.
......
...@@ -630,7 +630,7 @@ find_bb_boundaries (basic_block bb) ...@@ -630,7 +630,7 @@ find_bb_boundaries (basic_block bb)
{ {
basic_block orig_bb = bb; basic_block orig_bb = bb;
rtx insn = BB_HEAD (bb); rtx insn = BB_HEAD (bb);
rtx end = BB_END (bb); rtx end = BB_END (bb), x;
rtx table; rtx table;
rtx flow_transfer_insn = NULL_RTX; rtx flow_transfer_insn = NULL_RTX;
edge fallthru = NULL; edge fallthru = NULL;
...@@ -651,7 +651,16 @@ find_bb_boundaries (basic_block bb) ...@@ -651,7 +651,16 @@ find_bb_boundaries (basic_block bb)
{ {
fallthru = split_block (bb, PREV_INSN (insn)); fallthru = split_block (bb, PREV_INSN (insn));
if (flow_transfer_insn) if (flow_transfer_insn)
BB_END (bb) = flow_transfer_insn; {
BB_END (bb) = flow_transfer_insn;
/* Clean up the bb field for the insns between the blocks. */
for (x = NEXT_INSN (flow_transfer_insn);
x != BB_HEAD (fallthru->dest);
x = NEXT_INSN (x))
if (!BARRIER_P (x))
set_block_for_insn (x, NULL);
}
bb = fallthru->dest; bb = fallthru->dest;
remove_edge (fallthru); remove_edge (fallthru);
...@@ -666,6 +675,14 @@ find_bb_boundaries (basic_block bb) ...@@ -666,6 +675,14 @@ find_bb_boundaries (basic_block bb)
{ {
fallthru = split_block (bb, PREV_INSN (insn)); fallthru = split_block (bb, PREV_INSN (insn));
BB_END (bb) = flow_transfer_insn; BB_END (bb) = flow_transfer_insn;
/* Clean up the bb field for the insns between the blocks. */
for (x = NEXT_INSN (flow_transfer_insn);
x != BB_HEAD (fallthru->dest);
x = NEXT_INSN (x))
if (!BARRIER_P (x))
set_block_for_insn (x, NULL);
bb = fallthru->dest; bb = fallthru->dest;
remove_edge (fallthru); remove_edge (fallthru);
flow_transfer_insn = NULL_RTX; flow_transfer_insn = NULL_RTX;
...@@ -682,7 +699,18 @@ find_bb_boundaries (basic_block bb) ...@@ -682,7 +699,18 @@ find_bb_boundaries (basic_block bb)
return and barrier, or possibly other sequence not behaving like return and barrier, or possibly other sequence not behaving like
ordinary jump, we need to take care and move basic block boundary. */ ordinary jump, we need to take care and move basic block boundary. */
if (flow_transfer_insn) if (flow_transfer_insn)
BB_END (bb) = flow_transfer_insn; {
BB_END (bb) = flow_transfer_insn;
/* Clean up the bb field for the insns that do not belong to BB. */
x = flow_transfer_insn;
while (x != end)
{
x = NEXT_INSN (x);
if (!BARRIER_P (x))
set_block_for_insn (x, NULL);
}
}
/* We've possibly replaced the conditional jump by conditional jump /* We've possibly replaced the conditional jump by conditional jump
followed by cleanup at fallthru edge, so the outgoing edges may followed by cleanup at fallthru edge, so the outgoing edges may
......
...@@ -1999,7 +1999,7 @@ try_optimize_cfg (int mode) ...@@ -1999,7 +1999,7 @@ try_optimize_cfg (int mode)
{ {
rtx label = BB_HEAD (b); rtx label = BB_HEAD (b);
delete_insn_chain (label, label); delete_insn_chain (label, label, false);
/* In the case label is undeletable, move it after the /* In the case label is undeletable, move it after the
BASIC_BLOCK note. */ BASIC_BLOCK note. */
if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL) if (NOTE_KIND (BB_HEAD (b)) == NOTE_INSN_DELETED_LABEL)
......
...@@ -195,10 +195,11 @@ delete_insn_and_edges (rtx insn) ...@@ -195,10 +195,11 @@ delete_insn_and_edges (rtx insn)
} }
/* Unlink a chain of insns between START and FINISH, leaving notes /* Unlink a chain of insns between START and FINISH, leaving notes
that must be paired. */ that must be paired. If CLEAR_BB is true, we set bb field for
insns that cannot be removed to NULL. */
void void
delete_insn_chain (rtx start, rtx finish) delete_insn_chain (rtx start, rtx finish, bool clear_bb)
{ {
rtx next; rtx next;
...@@ -213,6 +214,9 @@ delete_insn_chain (rtx start, rtx finish) ...@@ -213,6 +214,9 @@ delete_insn_chain (rtx start, rtx finish)
else else
next = delete_insn (start); next = delete_insn (start);
if (clear_bb && !INSN_DELETED_P (start))
set_block_for_insn (start, NULL);
if (start == finish) if (start == finish)
break; break;
start = next; start = next;
...@@ -229,7 +233,7 @@ delete_insn_chain_and_edges (rtx first, rtx last) ...@@ -229,7 +233,7 @@ delete_insn_chain_and_edges (rtx first, rtx last)
&& BLOCK_FOR_INSN (last) && BLOCK_FOR_INSN (last)
&& BB_END (BLOCK_FOR_INSN (last)) == last) && BB_END (BLOCK_FOR_INSN (last)) == last)
purge = true; purge = true;
delete_insn_chain (first, last); delete_insn_chain (first, last, false);
if (purge) if (purge)
purge_dead_edges (BLOCK_FOR_INSN (last)); purge_dead_edges (BLOCK_FOR_INSN (last));
} }
...@@ -370,7 +374,8 @@ rtl_delete_block (basic_block b) ...@@ -370,7 +374,8 @@ rtl_delete_block (basic_block b)
/* Selectively delete the entire chain. */ /* Selectively delete the entire chain. */
BB_HEAD (b) = NULL; BB_HEAD (b) = NULL;
delete_insn_chain (insn, end); delete_insn_chain (insn, end, true);
if (b->il.rtl->global_live_at_start) if (b->il.rtl->global_live_at_start)
{ {
FREE_REG_SET (b->il.rtl->global_live_at_start); FREE_REG_SET (b->il.rtl->global_live_at_start);
...@@ -608,7 +613,7 @@ rtl_merge_blocks (basic_block a, basic_block b) ...@@ -608,7 +613,7 @@ rtl_merge_blocks (basic_block a, basic_block b)
/* Delete everything marked above as well as crap that might be /* Delete everything marked above as well as crap that might be
hanging out between the two blocks. */ hanging out between the two blocks. */
BB_HEAD (b) = NULL; BB_HEAD (b) = NULL;
delete_insn_chain (del_first, del_last); delete_insn_chain (del_first, del_last, true);
/* Reassociate the insns of B with A. */ /* Reassociate the insns of B with A. */
if (!b_empty) if (!b_empty)
...@@ -745,7 +750,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) ...@@ -745,7 +750,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
{ {
rtx insn = src->il.rtl->footer; rtx insn = src->il.rtl->footer;
delete_insn_chain (kill_from, BB_END (src)); delete_insn_chain (kill_from, BB_END (src), false);
/* Remove barriers but keep jumptables. */ /* Remove barriers but keep jumptables. */
while (insn) while (insn)
...@@ -765,7 +770,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) ...@@ -765,7 +770,8 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
} }
} }
else else
delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target))); delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)),
false);
} }
/* If this already is simplejump, redirect it. */ /* If this already is simplejump, redirect it. */
...@@ -801,13 +807,13 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout) ...@@ -801,13 +807,13 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
INSN_UID (insn), INSN_UID (BB_END (src))); INSN_UID (insn), INSN_UID (BB_END (src)));
delete_insn_chain (kill_from, insn); delete_insn_chain (kill_from, insn, false);
/* Recognize a tablejump that we are converting to a /* Recognize a tablejump that we are converting to a
simple jump and remove its associated CODE_LABEL simple jump and remove its associated CODE_LABEL
and ADDR_VEC or ADDR_DIFF_VEC. */ and ADDR_VEC or ADDR_DIFF_VEC. */
if (tablejump_p (insn, &label, &table)) if (tablejump_p (insn, &label, &table))
delete_insn_chain (label, table); delete_insn_chain (label, table, false);
barrier = next_nonnote_insn (BB_END (src)); barrier = next_nonnote_insn (BB_END (src));
if (!barrier || !BARRIER_P (barrier)) if (!barrier || !BARRIER_P (barrier))
...@@ -1217,7 +1223,7 @@ rtl_tidy_fallthru_edge (edge e) ...@@ -1217,7 +1223,7 @@ rtl_tidy_fallthru_edge (edge e)
/* Selectively unlink the sequence. */ /* Selectively unlink the sequence. */
if (q != PREV_INSN (BB_HEAD (c))) if (q != PREV_INSN (BB_HEAD (c)))
delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c))); delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
e->flags |= EDGE_FALLTHRU; e->flags |= EDGE_FALLTHRU;
} }
...@@ -1715,6 +1721,23 @@ rtl_verify_flow_info_1 (void) ...@@ -1715,6 +1721,23 @@ rtl_verify_flow_info_1 (void)
bb->index); bb->index);
err = 1; err = 1;
} }
for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
if (!BARRIER_P (insn)
&& BLOCK_FOR_INSN (insn) != NULL)
{
error ("insn %d in header of bb %d has non-NULL basic block",
INSN_UID (insn), bb->index);
err = 1;
}
for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
if (!BARRIER_P (insn)
&& BLOCK_FOR_INSN (insn) != NULL)
{
error ("insn %d in footer of bb %d has non-NULL basic block",
INSN_UID (insn), bb->index);
err = 1;
}
} }
/* Now check the basic blocks (boundaries etc.) */ /* Now check the basic blocks (boundaries etc.) */
...@@ -1918,10 +1941,21 @@ rtl_verify_flow_info (void) ...@@ -1918,10 +1941,21 @@ rtl_verify_flow_info (void)
rtx head = BB_HEAD (bb); rtx head = BB_HEAD (bb);
rtx end = BB_END (bb); rtx end = BB_END (bb);
/* Verify the end of the basic block is in the INSN chain. */
for (x = last_head; x != NULL_RTX; x = PREV_INSN (x)) for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
if (x == end) {
break; /* Verify the end of the basic block is in the INSN chain. */
if (x == end)
break;
/* And that the code outside of basic blocks has NULL bb field. */
if (!BARRIER_P (x)
&& BLOCK_FOR_INSN (x) != NULL)
{
error ("insn %d outside of basic blocks has non-NULL bb field",
INSN_UID (x));
err = 1;
}
}
if (!x) if (!x)
{ {
...@@ -1955,7 +1989,7 @@ rtl_verify_flow_info (void) ...@@ -1955,7 +1989,7 @@ rtl_verify_flow_info (void)
err = 1; err = 1;
} }
last_head = x; last_head = PREV_INSN (x);
FOR_EACH_EDGE (e, ei, bb->succs) FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU) if (e->flags & EDGE_FALLTHRU)
...@@ -2000,6 +2034,18 @@ rtl_verify_flow_info (void) ...@@ -2000,6 +2034,18 @@ rtl_verify_flow_info (void)
} }
} }
for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
{
/* Check that the code before the first basic block has NULL
bb field. */
if (!BARRIER_P (x)
&& BLOCK_FOR_INSN (x) != NULL)
{
error ("insn %d outside of basic blocks has non-NULL bb field",
INSN_UID (x));
err = 1;
}
}
free (bb_info); free (bb_info);
num_bb_notes = 0; num_bb_notes = 0;
...@@ -2550,7 +2596,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b) ...@@ -2550,7 +2596,7 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
rtx first = BB_END (a), last; rtx first = BB_END (a), last;
last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a)); last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a));
delete_insn_chain (NEXT_INSN (first), last); delete_insn_chain (NEXT_INSN (first), last, false);
b->il.rtl->header = NULL; b->il.rtl->header = NULL;
} }
......
...@@ -4080,8 +4080,9 @@ extend_bb (void) ...@@ -4080,8 +4080,9 @@ extend_bb (void)
/* Don't emit a NOTE if it would end up before a BARRIER. */ /* Don't emit a NOTE if it would end up before a BARRIER. */
&& !BARRIER_P (NEXT_INSN (insn)))) && !BARRIER_P (NEXT_INSN (insn))))
{ {
emit_note_after (NOTE_INSN_DELETED, insn); rtx note = emit_note_after (NOTE_INSN_DELETED, insn);
/* Make insn to appear outside BB. */ /* Make insn appear outside BB. */
set_block_for_insn (note, NULL);
BB_END (EXIT_BLOCK_PTR->prev_bb) = insn; BB_END (EXIT_BLOCK_PTR->prev_bb) = insn;
} }
} }
......
...@@ -3214,7 +3214,7 @@ peephole2_optimize (void) ...@@ -3214,7 +3214,7 @@ peephole2_optimize (void)
try = emit_insn_after_setloc (try, peep2_insn_data[i].insn, try = emit_insn_after_setloc (try, peep2_insn_data[i].insn,
INSN_LOCATOR (peep2_insn_data[i].insn)); INSN_LOCATOR (peep2_insn_data[i].insn));
before_try = PREV_INSN (insn); before_try = PREV_INSN (insn);
delete_insn_chain (insn, peep2_insn_data[i].insn); delete_insn_chain (insn, peep2_insn_data[i].insn, false);
/* Re-insert the EH_REGION notes. */ /* Re-insert the EH_REGION notes. */
if (note || (was_call && nonlocal_goto_handler_labels)) if (note || (was_call && nonlocal_goto_handler_labels))
......
...@@ -2062,7 +2062,7 @@ extern rtx emit (rtx); ...@@ -2062,7 +2062,7 @@ extern rtx emit (rtx);
extern rtx delete_insn (rtx); extern rtx delete_insn (rtx);
extern rtx entry_of_function (void); extern rtx entry_of_function (void);
extern void emit_insn_at_entry (rtx); extern void emit_insn_at_entry (rtx);
extern void delete_insn_chain (rtx, rtx); extern void delete_insn_chain (rtx, rtx, bool);
extern rtx unlink_insn_chain (rtx, rtx); extern rtx unlink_insn_chain (rtx, rtx);
extern rtx delete_insn_and_edges (rtx); extern rtx delete_insn_and_edges (rtx);
extern void delete_insn_chain_and_edges (rtx, rtx); extern void delete_insn_chain_and_edges (rtx, rtx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment