aboutsummaryrefslogtreecommitdiff
path: root/gcc/flow.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-07-20 20:05:09 -0700
committerKazu Hirata <kazu@gcc.gnu.org>2001-07-21 03:05:09 +0000
commite9644cfea18acae1d77d30b608bde9f5c5f6e602 (patch)
tree95e9841e9a4d470c278c1c6ffcee14c2af239e1b /gcc/flow.c
parent3461fba7ad8292cc6bbf62d4cf0e0f8038137a30 (diff)
downloadgcc-e9644cfea18acae1d77d30b608bde9f5c5f6e602.zip
gcc-e9644cfea18acae1d77d30b608bde9f5c5f6e602.tar.gz
gcc-e9644cfea18acae1d77d30b608bde9f5c5f6e602.tar.bz2
flow.c (try_redirect_by_replacing_jump): Correctly compute which insns to delete in the presence of cc0 in a jump insn.
* flow.c (try_redirect_by_replacing_jump): Correctly compute which insns to delete in the presence of cc0 in a jump insn. From-SVN: r44217
Diffstat (limited to 'gcc/flow.c')
-rw-r--r--gcc/flow.c38
1 files changed, 15 insertions, 23 deletions
diff --git a/gcc/flow.c b/gcc/flow.c
index 06a1040..fb054e4 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -1654,7 +1654,7 @@ try_redirect_by_replacing_jump (e, target)
basic_block target;
{
basic_block src = e->src;
- rtx insn = src->end;
+ rtx insn = src->end, kill_from;
edge tmp;
rtx set;
int fallthru = 0;
@@ -1671,19 +1671,24 @@ try_redirect_by_replacing_jump (e, target)
if (!set || side_effects_p (set))
return false;
+ /* In case we zap a conditional jump, we'll need to kill
+ the cc0 setter too. */
+ kill_from = insn;
+#ifdef HAVE_cc0
+ if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
+ kill_from = PREV_INSN (insn);
+#endif
+
/* See if we can create the fallthru edge. */
if (can_fallthru (src, target))
{
- src->end = PREV_INSN (insn);
+ src->end = PREV_INSN (kill_from);
if (rtl_dump_file)
fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
- flow_delete_insn (insn);
fallthru = 1;
/* Selectivly unlink whole insn chain. */
- if (src->end != PREV_INSN (target->head))
- flow_delete_insn_chain (NEXT_INSN (src->end),
- PREV_INSN (target->head));
+ flow_delete_insn_chain (kill_from, PREV_INSN (target->head));
}
/* If this already is simplejump, redirect it. */
else if (simplejump_p (insn))
@@ -1701,8 +1706,7 @@ try_redirect_by_replacing_jump (e, target)
rtx target_label = block_label (target);
rtx barrier;
- src->end = PREV_INSN (insn);
- src->end = emit_jump_insn_after (gen_jump (target_label), src->end);
+ src->end = emit_jump_insn_before (gen_jump (target_label), kill_from);
JUMP_LABEL (src->end) = target_label;
LABEL_NUSES (target_label)++;
if (basic_block_for_insn)
@@ -1710,7 +1714,9 @@ try_redirect_by_replacing_jump (e, target)
if (rtl_dump_file)
fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
INSN_UID (insn), INSN_UID (src->end));
- flow_delete_insn (insn);
+
+ flow_delete_insn_chain (kill_from, insn);
+
barrier = next_nonnote_insn (src->end);
if (!barrier || GET_CODE (barrier) != BARRIER)
emit_barrier_after (src->end);
@@ -1727,20 +1733,6 @@ try_redirect_by_replacing_jump (e, target)
e->probability = REG_BR_PROB_BASE;
e->count = src->count;
- /* 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
-
/* We don't want a block to end on a line-number note since that has
the potential of changing the code between -g and not -g. */
while (GET_CODE (e->src->end) == NOTE