-extern ir_node *sched_skip(ir_node *from, int forward,
- sched_predicator_t *predicator, void *data)
+/* Skip nodes in a schedule. */
+ir_node *sched_skip(ir_node *from, int forward, sched_predicator_t *predicator, void *data)
+{
+ const ir_node *bl = get_block(from);
+ ir_node *curr;
+
+ if (is_Block(from))
+ from = forward ? sched_next(from) : sched_prev(from);
+
+ for(curr = from; curr != bl && predicator(curr, data); curr = forward ? sched_next(curr) : sched_prev(curr));
+
+ return curr;
+}
+
+/** A simple forward single linked list. */
+typedef struct {
+ ir_node *start; /**< start of the list */
+ ir_node *end; /**< last block in the list */
+ unsigned n_blks; /**< number of blocks in the list */
+} anchor;
+
+/**
+ * Ext-Block walker: create a block schedule
+ */
+static void create_block_list(ir_extblk *blk, void *env) {
+ anchor *list = env;
+ int i, n;
+
+ for (i = 0, n = get_extbb_n_blocks(blk); i < n; ++i) {
+ ir_node *block = get_extbb_block(blk, i);
+
+ set_irn_link(block, NULL);
+ if (list->start)
+ set_irn_link(list->end, block);
+ else
+ list->start = block;
+
+ list->end = block;
+ ++list->n_blks;
+ }
+}
+
+/*
+ * Calculates a block schedule. The schedule is stored as a linked
+ * list starting at the start_block of the irg.
+ */
+ir_node **sched_create_block_schedule(ir_graph *irg)