+static void find_bb_boundaries PARAMS ((basic_block));
+static void compute_outgoing_frequencies PARAMS ((basic_block));
+static bool inside_basic_block_p PARAMS ((rtx));
+static bool control_flow_insn_p PARAMS ((rtx));
+\f
+/* Return true if insn is something that should be contained inside basic
+ block. */
+
+static bool
+inside_basic_block_p (insn)
+ rtx insn;
+{
+ switch (GET_CODE (insn))
+ {
+ case CODE_LABEL:
+ /* Avoid creating of basic block for jumptables. */
+ return (NEXT_INSN (insn) == 0
+ || GET_CODE (NEXT_INSN (insn)) != JUMP_INSN
+ || (GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_VEC
+ && GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_DIFF_VEC));
+
+ case JUMP_INSN:
+ return (GET_CODE (PATTERN (insn)) != ADDR_VEC
+ && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC);
+
+ case CALL_INSN:
+ case INSN:
+ return true;
+
+ case BARRIER:
+ case NOTE:
+ return false;
+
+ default:
+ abort ();
+ }
+}
+
+/* Return true if INSN may cause control flow transfer, so it should be last in
+ the basic block. */
+
+static bool
+control_flow_insn_p (insn)
+ rtx insn;
+{
+ rtx note;
+
+ switch (GET_CODE (insn))
+ {
+ case NOTE:
+ case CODE_LABEL:
+ return false;
+
+ case JUMP_INSN:
+ /* Jump insn always causes control transfer except for tablejumps. */
+ return (GET_CODE (PATTERN (insn)) != ADDR_VEC
+ && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC);
+
+ case CALL_INSN:
+ /* Call insn may return to the nonlocal goto handler. */
+ return ((nonlocal_goto_handler_labels
+ && (0 == (note = find_reg_note (insn, REG_EH_REGION,
+ NULL_RTX))
+ || INTVAL (XEXP (note, 0)) >= 0))
+ /* Or may trap. */
+ || can_throw_internal (insn));
+
+ case INSN:
+ return (flag_non_call_exceptions && can_throw_internal (insn));
+
+ case BARRIER:
+ /* It is nonsence to reach barrier when looking for the
+ end of basic block, but before dead code is eliminated
+ this may happen. */
+ return false;
+
+ default:
+ abort ();
+ }
+}