diff options
author | Jan Hubicka <jh@suse.cz> | 2001-07-02 23:16:50 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2001-07-02 21:16:50 +0000 |
commit | f8d1529b85d65cec8c84f56b1b907f9d673697f2 (patch) | |
tree | d6945804f248caa779d2113a20027c0772b21764 /gcc | |
parent | 861d4e70e82f01fc77436cf8fe5fd87bc3e8368b (diff) | |
download | gcc-f8d1529b85d65cec8c84f56b1b907f9d673697f2.zip gcc-f8d1529b85d65cec8c84f56b1b907f9d673697f2.tar.gz gcc-f8d1529b85d65cec8c84f56b1b907f9d673697f2.tar.bz2 |
flow.c (try_redirect_by_replacing_jump): Remove cc0 setter.
* flow.c (try_redirect_by_replacing_jump): Remove cc0 setter.
* flow.c (forwarder_block_p): Fix for fallthru blocks.
(try_redirect_by_replacing_jump): Update properly the count
and frequency information.
From-SVN: r43708
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/flow.c | 37 |
2 files changed, 36 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 328753f..a83fdf5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Mon Jul 2 23:14:00 CEST 2001 Jan Hubicka <jh@suse.cz> + + * flow.c (try_redirect_by_replacing_jump): Remove cc0 setter. + + * flow.c (forwarder_block_p): Fix for fallthru blocks. + (try_redirect_by_replacing_jump): Update properly the count + and frequency information. + Mon Jul 2 14:20:13 2001 Jeffrey A Law (law@cygnus.com) * toplev.c (dump_file_index): Move SSA dumps just after first @@ -1597,18 +1597,19 @@ static bool forwarder_block_p (bb) basic_block bb; { - rtx insn; + rtx insn = bb->head; if (bb == EXIT_BLOCK_PTR || bb == ENTRY_BLOCK_PTR || !bb->succ || bb->succ->succ_next) return false; - insn = next_active_insn (bb->head); - if (!insn) - return false; - if (GET_CODE (insn) == CODE_LABEL - || (GET_CODE (insn) == JUMP_INSN && onlyjump_p (insn))) - return true; - return false; + while (insn != bb->end) + { + if (active_insn_p (insn)) + return false; + insn = NEXT_INSN (insn); + } + return (!active_insn_p (insn) + || (GET_CODE (insn) == JUMP_INSN && onlyjump_p (insn))); } /* Return nonzero if we can reach target from src by falling trought. */ @@ -1699,6 +1700,8 @@ try_redirect_by_replacing_jump (e, target) e->flags = EDGE_FALLTHRU; else e->flags = 0; + e->probability = REG_BR_PROB_BASE; + e->count = src->count; /* Fixup barriers. */ barrier = next_nonnote_insn (insn); @@ -1707,6 +1710,20 @@ try_redirect_by_replacing_jump (e, target) else if (!fallthru && GET_CODE (barrier) != BARRIER) emit_barrier_after (insn); + /* In case we've zapped an conditional jump, we need to kill the cc0 + setter too if available. */ +#ifdef HAVE_cc0 + insn = src->end; + if (GET_CODE (insn) == JUMP_INSN) + insn = prev_nonnote_insn (insn); + if (sets_cc0_p (insn)) + { + if (insn == src->end) + src->end = PREV_INSN (insn); + flow_delete_insn (insn); + } +#endif + if (e->dest != target) redirect_edge_succ (e, target); return true; @@ -1766,7 +1783,7 @@ redirect_edge_and_branch (e, target) for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j) if (XEXP (RTVEC_ELT (vec, j), 0) == old_label) { - RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (VOIDmode, new_label); + RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label); --LABEL_NUSES (old_label); ++LABEL_NUSES (new_label); } @@ -1815,6 +1832,8 @@ redirect_edge_and_branch (e, target) if (s) { s->flags |= e->flags; + s->probability += e->probability; + s->count += e->count; remove_edge (e); } else |