+
+ /* We got here if we need to add a new jump insn in a new block
+ across the edge e_fall. */
+
+ jump_insn = emit_jump_to_block_after (e_fall->dest, bb_end_insn);
+ barrier_insn = emit_barrier_after (jump_insn);
+
+ VARRAY_GROW (basic_block_info, ++n_basic_blocks);
+ create_basic_block (n_basic_blocks - 1, jump_insn, jump_insn, NULL);
+
+ nb = BASIC_BLOCK (n_basic_blocks - 1);
+ nb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
+ nb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
+ nb->local_set = 0;
+
+ COPY_REG_SET (nb->global_live_at_start, bb->global_live_at_start);
+ COPY_REG_SET (nb->global_live_at_end, bb->global_live_at_start);
+
+ nb->aux = xmalloc (sizeof (struct reorder_block_def));
+ RBI (nb)->eff_head = nb->head;
+ RBI (nb)->eff_end = barrier_insn;
+ RBI (nb)->scope = RBI (bb)->scope;
+ RBI (nb)->index = RBI (bb)->index + 1;
+ RBI (nb)->visited = 1;
+ RBI (nb)->next = RBI (bb)->next;
+ RBI (bb)->next = nb;
+
+ /* Link to new block. */
+ make_edge (NULL, nb, e_fall->dest, 0);
+ redirect_edge_succ (e_fall, nb);
+
+ /* Don't process this new block. */
+ bb = nb;
+
+ /* Fix subsequent reorder block indices to reflect new block. */
+ while ((nb = RBI (nb)->next) != NULL)
+ RBI (nb)->index += 1;
+ }
+
+ /* Put basic_block_info in the new order. */
+ for (bb = BASIC_BLOCK (0); bb ; bb = RBI (bb)->next)
+ {
+ bb->index = RBI (bb)->index;
+ BASIC_BLOCK (bb->index) = bb;