+Sat Aug 7 19:32:16 1999 Richard Henderson <rth@cygnus.com>
+
+ * jump.c (onlyjump_p): New function.
+ * rtl.h: Declare it.
+ * flow.c (delete_unreachable_blocks): Use onlyjump_p instead
+ of condjump_p in calling tidy_fallthru_edge and merge_blocks.
+
Sat Aug 7 17:09:36 1999 Richard Henderson <rth@cygnus.com>
* global.c (build_insn_chain): Use EXECUTE_IF_SET_IN_REG_SET
if ((s = b->succ) != NULL
&& s->succ_next == NULL
&& s->dest == c
- /* If the last insn is not a normal conditional jump
- (or an unconditional jump), then we can not tidy the
- fallthru edge because we can not delete the jump. */
- && GET_CODE (b->end) == JUMP_INSN
- && condjump_p (b->end))
+ /* If the jump insn has side effects, we can't tidy the edge. */
+ && (GET_CODE (b->end) != JUMP_INSN
+ || onlyjump_p (b->end)))
tidy_fallthru_edge (s, b, c);
}
&& (s->flags & EDGE_EH) == 0
&& (c = s->dest) != EXIT_BLOCK_PTR
&& c->pred->pred_next == NULL
- /* If the last insn is not a normal conditional jump
- (or an unconditional jump), then we can not merge
- the blocks because we can not delete the jump. */
- && GET_CODE (b->end) == JUMP_INSN
- && condjump_p (b->end)
+ /* If the jump insn has side effects, we can't kill the edge. */
+ && (GET_CODE (b->end) != JUMP_INSN
+ || onlyjump_p (b->end))
&& merge_blocks (s, b, c))
continue;
return for_each_rtx (&PATTERN (insn), returnjump_p_1, NULL);
}
+/* Return true if INSN is a jump that only transfers control and
+ nothing more. */
+
+int
+onlyjump_p (insn)
+ rtx insn;
+{
+ rtx set;
+
+ if (GET_CODE (insn) != JUMP_INSN)
+ return 0;
+
+ set = single_set (insn);
+ if (set == NULL)
+ return 0;
+ if (GET_CODE (SET_DEST (set)) != PC)
+ return 0;
+ if (side_effects_p (SET_SRC (set)))
+ return 0;
+
+ return 1;
+}
+
#ifdef HAVE_cc0
/* Return 1 if X is an RTX that does nothing but set the condition codes
extern rtx condjump_label PROTO ((rtx));
extern int simplejump_p PROTO ((rtx));
extern int returnjump_p PROTO ((rtx));
+extern int onlyjump_p PROTO ((rtx));
extern int sets_cc0_p PROTO ((rtx));
extern int invert_jump PROTO ((rtx, rtx));
extern int rtx_renumbered_equal_p PROTO ((rtx, rtx));