re PR bootstrap/59279 (r205337 breaks bootstrap with java)

PR bootstrap/59279
	Revert previous commit.

From-SVN: r205338
This commit is contained in:
Steven Bosscher 2013-11-24 21:59:49 +00:00
parent 57d6c446c7
commit 29f3fd5b6a
7 changed files with 75 additions and 137 deletions

View File

@ -1,3 +1,8 @@
2013-11-24 Steven Bosscher <steven@gcc.gnu.org>
PR bootstrap/59279
Revert previous commit.
2013-11-24 Steven Bosscher <steven@gcc.gnu.org>
* jump.c (reset_insn_reg_label_operand_notes): New function,

View File

@ -2944,65 +2944,40 @@ delete_unreachable_blocks (void)
return changed;
}
/* Look for, and delete, any dead jumptables between START and END. */
static void
delete_dead_jump_tables_between (rtx start, rtx end)
{
rtx insn, next;
for (insn = start; insn != end; insn = next)
{
next = NEXT_INSN (insn);
if (next != NULL_RTX
&& LABEL_P (insn)
&& LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
&& JUMP_TABLE_DATA_P (next))
{
rtx label = insn, jump = next;
if (dump_file)
fprintf (dump_file, "Dead jumptable %i removed\n",
INSN_UID (insn));
next = NEXT_INSN (next);
delete_insn (jump);
delete_insn (label);
}
}
}
/* Delete any jump tables never referenced. We can't delete them at the
time of removing tablejump insn as the label preceding the jump table
data may be referenced by the preceding insns computing the destination.
So we delay deleting and garbage-collect them from time to time, after
a CFG cleanup. */
time of removing tablejump insn as they are referenced by the preceding
insns computing the destination, so we delay deleting and garbagecollect
them once life information is computed. */
void
delete_dead_jumptables (void)
{
basic_block bb;
/* Label reference count must up-to-date to detect dead jump tables. */
rebuild_jump_labels (get_insns ());
/* A dead jump table does not belong to any basic block. Scan insns
between two adjacent basic blocks. */
FOR_EACH_BB (bb)
{
if (current_ir_type () == IR_RTL_CFGLAYOUT)
rtx insn, next;
for (insn = NEXT_INSN (BB_END (bb));
insn && !NOTE_INSN_BASIC_BLOCK_P (insn);
insn = next)
{
/* Jump tables only appear in the header or footer of BB. */
delete_dead_jump_tables_between (BB_HEADER (bb), NULL_RTX);
delete_dead_jump_tables_between (BB_FOOTER (bb), NULL_RTX);
}
else
{
/* Jump tables are in the insns chain between basic blocks. */
rtx start = NEXT_INSN (BB_END (bb));
rtx end = (bb->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
? NULL_RTX : BB_HEAD (bb->next_bb);
delete_dead_jump_tables_between (start, end);
next = NEXT_INSN (insn);
if (LABEL_P (insn)
&& LABEL_NUSES (insn) == LABEL_PRESERVE_P (insn)
&& JUMP_TABLE_DATA_P (next))
{
rtx label = insn, jump = next;
if (dump_file)
fprintf (dump_file, "Dead jumptable %i removed\n",
INSN_UID (insn));
next = NEXT_INSN (next);
delete_insn (jump);
delete_insn (label);
}
}
}
}
@ -3074,13 +3049,13 @@ cleanup_cfg (int mode)
if (mode & CLEANUP_CROSSJUMP)
remove_fake_exit_edges ();
/* Don't always call delete_dead_jumptables in cfglayout mode, because
jump tables can only appear in the headers and footers of basic blocks
and we usually are not interested in anything hiding there.
But if an expensive cleanup is called for, garbage-collect the dead
jump tables to get label reference counts right. This sometimes
allows some labels to be removed and more basic blocks to be merged. */
if (!(mode & CLEANUP_CFGLAYOUT) || (mode & CLEANUP_EXPENSIVE))
/* 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 ();
/* ??? We probably do this way too often. */

View File

@ -3696,10 +3696,10 @@ fixup_reorder_chain (void)
#endif
/* Now add jumps and labels as needed to match the blocks new
outgoing edges. Fixup missing or redundant BARRIERs. */
outgoing edges. */
for (bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; bb ;
bb = (basic_block) bb->aux)
for (bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; bb ; bb = (basic_block)
bb->aux)
{
edge e_fall, e_taken, e;
rtx bb_end_insn;
@ -3853,26 +3853,13 @@ fixup_reorder_chain (void)
relink_block_chain (/*stay_in_cfglayout_mode=*/false);
/* Annoying special case - stray barriers left in the code. This happens
if a tablejump is transformed to a simpe or confitional jump, or if a
basic block ending in a tablejump is removed but the jump table itself
is not. */
/* Annoying special case - jump around dead jumptables left in the code. */
FOR_EACH_BB (bb)
{
edge e = find_fallthru_edge (bb->succs);
if (e && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
{
rtx insn, next;
for (insn = NEXT_INSN (BB_END (e->src));
insn != BB_HEAD (e->dest);
insn = next)
{
next = NEXT_INSN (insn);
if (BARRIER_P (insn))
remove_insn (insn);
}
}
if (e && !can_fallthru (e->src, e->dest))
force_nonfallthru (e);
}
/* Ensure goto_locus from edges has some instructions with that locus
@ -4286,7 +4273,7 @@ break_superblocks (void)
}
/* Finalize the changes: reorder insn list according to the sequence specified
by aux pointers, enter compensation code. */
by aux pointers, enter compensation code, rebuild scope forest. */
void
cfg_layout_finalize (void)
@ -4294,7 +4281,6 @@ cfg_layout_finalize (void)
#ifdef ENABLE_CHECKING
verify_flow_info ();
#endif
delete_dead_jumptables ();
force_one_exit_fallthru ();
rtl_register_cfg_hooks ();
if (reload_completed
@ -4305,6 +4291,9 @@ cfg_layout_finalize (void)
fixup_fallthru_exit_predecessor ();
fixup_reorder_chain ();
rebuild_jump_labels (get_insns ());
delete_dead_jumptables ();
#ifdef ENABLE_CHECKING
verify_insn_chain ();
verify_flow_info ();

View File

@ -5273,9 +5273,9 @@ ira (FILE *f)
if (optimize && rebuild_p)
{
timevar_push (TV_JUMP);
rebuild_jump_labels (get_insns ());
if (purge_all_dead_edges ())
delete_unreachable_blocks ();
rebuild_jump_labels (get_insns ());
timevar_pop (TV_JUMP);
}

View File

@ -177,34 +177,6 @@ make_pass_cleanup_barriers (gcc::context *ctxt)
}
/* Remove all REG_LABEL_OPERAND notes from INSN.
REG_LABEL_TARGET notes (including the JUMP_LABEL field) are sticky and
not reset here; that way we won't lose association with a label when
e.g. the source for a target register disappears out of reach for targets
that may use jump-target registers. Jump transformations are supposed to
transform any REG_LABEL_TARGET notes. The target label reference in a
branch may disappear from the branch (and from the instruction before it)
for other reasons, like register allocation. */
static void
reset_insn_reg_label_operand_notes (rtx insn)
{
if (INSN_P (insn))
{
rtx note, next;
for (note = REG_NOTES (insn); note; note = next)
{
next = XEXP (note, 1);
if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
&& ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
remove_note (insn, note);
}
}
}
/* Initialize LABEL_NUSES and JUMP_LABEL fields, add REG_LABEL_TARGET
for remaining targets for JUMP_P. Delete any REG_LABEL_OPERAND
notes whose labels don't occur in the insn any more. */
@ -214,38 +186,32 @@ init_label_info (rtx f)
{
rtx insn;
if (current_ir_type () == IR_RTL_CFGLAYOUT)
for (insn = f; insn; insn = NEXT_INSN (insn))
{
basic_block bb;
if (LABEL_P (insn))
LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
FOR_EACH_BB (bb)
{
/* Labels only appear between BB_HEAD and the basic block note,
and in the basic block header and footer. */
for (insn = BB_HEAD (bb);
insn && LABEL_P (insn);
insn = NEXT_INSN (insn))
LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
for (insn = BB_HEADER (bb); insn; insn = NEXT_INSN (insn))
if (LABEL_P (insn))
LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
for (insn = BB_FOOTER (bb); insn; insn = NEXT_INSN (insn))
if (LABEL_P (insn))
LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
/* REG_LABEL_TARGET notes (including the JUMP_LABEL field) are
sticky and not reset here; that way we won't lose association
with a label when e.g. the source for a target register
disappears out of reach for targets that may use jump-target
registers. Jump transformations are supposed to transform
any REG_LABEL_TARGET notes. The target label reference in a
branch may disappear from the branch (and from the
instruction before it) for other reasons, like register
allocation. */
FOR_BB_INSNS (bb, insn)
if (INSN_P (insn))
reset_insn_reg_label_operand_notes (insn);
}
}
else
{
for (insn = f; insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
{
if (LABEL_P (insn))
LABEL_NUSES (insn) = (LABEL_PRESERVE_P (insn) != 0);
if (INSN_P (insn))
reset_insn_reg_label_operand_notes (insn);
rtx note, next;
for (note = REG_NOTES (insn); note; note = next)
{
next = XEXP (note, 1);
if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
&& ! reg_mentioned_p (XEXP (note, 0), PATTERN (insn)))
remove_note (insn, note);
}
}
}
}

View File

@ -415,7 +415,7 @@ rtl_loop_done (void)
loop_optimizer_finalize ();
free_dominance_info (CDI_DOMINATORS);
cleanup_cfg (CLEANUP_EXPENSIVE);
cleanup_cfg (0);
if (dump_file)
{
dump_reg_info (dump_file);

View File

@ -1471,7 +1471,7 @@ sms_schedule (void)
continue;
}
/* Don't handle BBs with calls
/* Don't handle BBs with calls or barriers
or !single_set with the exception of instructions that include
count_reg---these instructions are part of the control part
that do-loop recognizes.
@ -1481,6 +1481,7 @@ sms_schedule (void)
rtx set;
if (CALL_P (insn)
|| BARRIER_P (insn)
|| (NONDEBUG_INSN_P (insn) && !JUMP_P (insn)
&& !single_set (insn) && GET_CODE (PATTERN (insn)) != USE
&& !reg_mentioned_p (count_reg, insn))
@ -1495,6 +1496,8 @@ sms_schedule (void)
{
if (CALL_P (insn))
fprintf (dump_file, "SMS loop-with-call\n");
else if (BARRIER_P (insn))
fprintf (dump_file, "SMS loop-with-barrier\n");
else if ((NONDEBUG_INSN_P (insn) && !JUMP_P (insn)
&& !single_set (insn) && GET_CODE (PATTERN (insn)) != USE))
fprintf (dump_file, "SMS loop-with-not-single-set\n");