+ gcc_assert (LABEL_P (label));
+ /* See comment in make_label_edge. */
+ if (INSN_UID (label) == 0)
+ return;
+ bb = BLOCK_FOR_INSN (label);
+ SET_STATE (bb, FULL_STATE (bb) | BLOCK_USED_BY_TABLEJUMP);
+}
+
+static void
+purge_dead_tablejump_edges (basic_block bb, rtx table)
+{
+ rtx insn = BB_END (bb), tmp;
+ rtvec vec;
+ int j;
+ edge_iterator ei;
+ edge e;
+
+ if (GET_CODE (PATTERN (table)) == ADDR_VEC)
+ vec = XVEC (PATTERN (table), 0);
+ else
+ vec = XVEC (PATTERN (table), 1);
+
+ for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
+ mark_tablejump_edge (XEXP (RTVEC_ELT (vec, j), 0));
+
+ /* Some targets (eg, ARM) emit a conditional jump that also
+ contains the out-of-range target. Scan for these and
+ add an edge if necessary. */
+ if ((tmp = single_set (insn)) != NULL
+ && SET_DEST (tmp) == pc_rtx
+ && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
+ && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF)
+ mark_tablejump_edge (XEXP (XEXP (SET_SRC (tmp), 2), 0));
+
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
+ {
+ if (FULL_STATE (e->dest) & BLOCK_USED_BY_TABLEJUMP)
+ SET_STATE (e->dest, FULL_STATE (e->dest)
+ & ~(size_t) BLOCK_USED_BY_TABLEJUMP);
+ else if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
+ {
+ remove_edge (e);
+ continue;
+ }
+ ei_next (&ei);
+ }
+}