block_stmt_iterator bsi;
edge_iterator ei;
edge e;
+ bool last = true;
/* If this block doesn't dominate anything, there can't be any place to sink
the statements to. */
{
if (!bsi_end_p (bsi))
bsi_prev (&bsi);
+ last = false;
continue;
}
if (dump_file)
bsi_move_before (&bsi, &tobsi);
sink_stats.sunk++;
+
+ /* If we've just removed the last statement of the BB, the
+ bsi_end_p() test below would fail, but bsi_prev() would have
+ succeeded, and we want it to succeed. So we keep track of
+ whether we're at the last statement and pick up the new last
+ statement. */
+ if (last)
+ {
+ bsi = bsi_last (bb);
+ continue;
+ }
+
+ last = false;
if (!bsi_end_p (bsi))
bsi_prev (&bsi);
return flag_tree_sink != 0;
}
-struct tree_opt_pass pass_sink_code =
+struct gimple_opt_pass pass_sink_code =
{
+ {
+ GIMPLE_PASS,
"sink", /* name */
gate_sink, /* gate */
do_sink, /* execute */
TODO_update_ssa
| TODO_dump_func
| TODO_ggc_collect
- | TODO_verify_ssa, /* todo_flags_finish */
- 0 /* letter */
+ | TODO_verify_ssa /* todo_flags_finish */
+ }
};