jump.c (mark_all_labels): Work in cfglayout mode.

* jump.c (mark_all_labels): Work in cfglayout mode.
	* cfgcleanup.c (cleanup_cfg): Do not call delete_dead_jumptables
	when in cfglayout mode, because there are no dead jumptables
	visible.
	* cfgrtl.c (commit_one_edge_insertion): Don't set bb->aux when
	in cfglayout mode.
	(commit_edge_insertions): Do not allow insertion of instructions
	with control flow insns when in cfglayout mode.

From-SVN: r119191
This commit is contained in:
Steven Bosscher 2006-11-25 10:53:06 +00:00
parent dc4871cba2
commit 05549c9604
4 changed files with 55 additions and 5 deletions

View File

@ -1,3 +1,14 @@
2006-11-25 Steven Bosscher <steven@gcc.gnu.org>
* jump.c (mark_all_labels): Work in cfglayout mode.
* cfgcleanup.c (cleanup_cfg): Do not call delete_dead_jumptables
when in cfglayout mode, because there are no dead jumptables
visible.
* cfgrtl.c (commit_one_edge_insertion): Don't set bb->aux when
in cfglayout mode.
(commit_edge_insertions): Do not allow insertion of instructions
with control flow insns when in cfglayout mode.
2006-11-25 Zdenek Dvorak <dvorakz@suse.cz>
* tree-vrp.c (execute_vrp): Do not pass loops structure through
@ -1467,7 +1478,7 @@
2006-11-11 Jan Hubicka <jh@suse.cz>
* extended.texi (__builtin_expect): We no longer require second argument
* extend.texi (__builtin_expect): We no longer require second argument
to be constant.
* gengtype.c (adjust_field_rtx_def): Drop NOTE_INSN_EXPECTED_VALUE.
* builtins.c (expand_builtin_expect): Simplify.

View File

@ -763,8 +763,6 @@ merge_blocks_move (edge e, basic_block b, basic_block c, int mode)
if (BB_PARTITION (b) != BB_PARTITION (c))
return NULL;
/* If B has a fallthru edge to C, no need to move anything. */
if (e->flags & EDGE_FALLTHRU)
{
@ -2260,7 +2258,15 @@ cleanup_cfg (int mode)
}
else
break;
delete_dead_jumptables ();
/* Don't call delete_dead_jumptables in cfglayout mode, because
that function assumes that jump tables are in the insns stream.
But we also don't _have_ to delete dead jumptables in cfglayout
mode because we shouldn't even be looking at things that are
not in a basic block. Dead jumptables are cleaned up when
going out of cfglayout mode. */
if (!(mode & CLEANUP_CFGLAYOUT))
delete_dead_jumptables ();
}
timevar_pop (TV_CLEANUP_CFG);

View File

@ -1477,7 +1477,8 @@ commit_one_edge_insertion (edge e, int watch_calls)
gcc_assert (!JUMP_P (last));
/* Mark the basic block for find_many_sub_basic_blocks. */
bb->aux = &bb->aux;
if (current_ir_type () != IR_RTL_CFGLAYOUT)
bb->aux = &bb->aux;
}
/* Update the CFG for all queued instructions. */
@ -1509,6 +1510,13 @@ commit_edge_insertions (void)
if (!changed)
return;
/* In the old rtl CFG API, it was OK to insert control flow on an
edge, apparently? In cfglayout mode, this will *not* work, and
the caller is responsible for making sure that control flow is
valid at all times. */
if (current_ir_type () == IR_RTL_CFGLAYOUT)
return;
blocks = sbitmap_alloc (last_basic_block);
sbitmap_zero (blocks);
FOR_EACH_BB (bb)

View File

@ -202,6 +202,31 @@ mark_all_labels (rtx f)
}
}
}
/* If we are in cfglayout mode, there may be non-insns between the
basic blocks. If those non-insns represent tablejump data, they
contain label references that we must record. */
if (current_ir_type () == IR_RTL_CFGLAYOUT)
{
basic_block bb;
rtx insn;
FOR_EACH_BB (bb)
{
for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
{
gcc_assert (JUMP_TABLE_DATA_P (insn));
mark_jump_label (PATTERN (insn), insn, 0);
}
for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
{
gcc_assert (JUMP_TABLE_DATA_P (insn));
mark_jump_label (PATTERN (insn), insn, 0);
}
}
}
}
/* Move all block-beg, block-end and loop-beg notes between START and END out