ifcvt.c (dead_or_predicable): Handling merging when other_bb and new_dest are the same.

* ifcvt.c (dead_or_predicable): Handling merging when other_bb
        and new_dest are the same.

From-SVN: r49366
This commit is contained in:
Richard Henderson 2002-01-30 23:10:49 -08:00 committed by Richard Henderson
parent 89cf7be582
commit 874b5b14bf
2 changed files with 45 additions and 24 deletions

View file

@ -1,3 +1,8 @@
2002-01-30 Richard Henderson <rth@redhat.com>
* ifcvt.c (dead_or_predicable): Handling merging when other_bb
and new_dest are the same.
2002-01-30 Richard Henderson <rth@redhat.com>
PR opt/5076

View file

@ -2629,35 +2629,41 @@ dead_or_predicable (test_bb, merge_bb, other_bb, new_dest, reversep)
change group management. */
old_dest = JUMP_LABEL (jump);
new_label = block_label (new_dest);
if (reversep
? ! invert_jump_1 (jump, new_label)
: ! redirect_jump_1 (jump, new_label))
goto cancel;
if (other_bb != new_dest)
{
new_label = block_label (new_dest);
if (reversep
? ! invert_jump_1 (jump, new_label)
: ! redirect_jump_1 (jump, new_label))
goto cancel;
}
if (! apply_change_group ())
return FALSE;
if (old_dest)
LABEL_NUSES (old_dest) -= 1;
if (new_label)
LABEL_NUSES (new_label) += 1;
JUMP_LABEL (jump) = new_label;
if (reversep)
invert_br_probabilities (jump);
redirect_edge_succ (BRANCH_EDGE (test_bb), new_dest);
if (reversep)
if (other_bb != new_dest)
{
gcov_type count, probability;
count = BRANCH_EDGE (test_bb)->count;
BRANCH_EDGE (test_bb)->count = FALLTHRU_EDGE (test_bb)->count;
FALLTHRU_EDGE (test_bb)->count = count;
probability = BRANCH_EDGE (test_bb)->probability;
BRANCH_EDGE (test_bb)->probability = FALLTHRU_EDGE (test_bb)->probability;
FALLTHRU_EDGE (test_bb)->probability = probability;
update_br_prob_note (test_bb);
if (old_dest)
LABEL_NUSES (old_dest) -= 1;
if (new_label)
LABEL_NUSES (new_label) += 1;
JUMP_LABEL (jump) = new_label;
if (reversep)
invert_br_probabilities (jump);
redirect_edge_succ (BRANCH_EDGE (test_bb), new_dest);
if (reversep)
{
gcov_type count, probability;
count = BRANCH_EDGE (test_bb)->count;
BRANCH_EDGE (test_bb)->count = FALLTHRU_EDGE (test_bb)->count;
FALLTHRU_EDGE (test_bb)->count = count;
probability = BRANCH_EDGE (test_bb)->probability;
BRANCH_EDGE (test_bb)->probability
= FALLTHRU_EDGE (test_bb)->probability;
FALLTHRU_EDGE (test_bb)->probability = probability;
update_br_prob_note (test_bb);
}
}
/* Move the insns out of MERGE_BB to before the branch. */
@ -2671,6 +2677,16 @@ dead_or_predicable (test_bb, merge_bb, other_bb, new_dest, reversep)
reorder_insns (head, end, PREV_INSN (earliest));
}
/* Remove the jump and edge if we can. */
if (other_bb == new_dest)
{
delete_insn (jump);
remove_edge (BRANCH_EDGE (test_bb));
/* ??? Can't merge blocks here, as then_bb is still in use.
At minimum, the merge will get done just before bb-reorder. */
}
return TRUE;
cancel: