From: Richard Henderson Date: Thu, 31 Jan 2002 07:10:49 +0000 (-0800) Subject: ifcvt.c (dead_or_predicable): Handling merging when other_bb and new_dest are the... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=874b5b14bf088371b451ca16c1430ab90f910f2d;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7b63dd370d..bfc1972bfea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-01-30 Richard Henderson + + * ifcvt.c (dead_or_predicable): Handling merging when other_bb + and new_dest are the same. + 2002-01-30 Richard Henderson PR opt/5076 diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 2939de4483e..5a9a85438f5 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -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: