+ /* Check, if the time steps are correct */
+ for(i = 1; i < n; ++i) {
+ if(save_time_step[i] - save_time_step[i - 1] <= 0) {
+ DBG((dbg_sched, LEVEL_DEFAULT,
+ "%+F from %+F(%d) -> %+F(%d) step shrinks from %d -> %d\n",
+ block, save_nodes[i - 1], i - 1, save_nodes[i], i,
+ save_time_step[i - 1], save_time_step[i]));
+ res = 0;
+ }
+ }
+
+ /* Restore the old time steps */
+ i = 0;
+ sched_foreach(block, irn) {
+ sched_info_t *info = get_irn_sched_info(irn);
+ info->time_step = save_time_step[i++];
+ }
+
+ /* Check for all nodes in the block if they are scheduled. */
+ foreach_out_edge(block, edge) {
+ ir_node *irn = get_edge_src_irn(edge);
+ if(to_appear_in_schedule(irn) && !pset_find_ptr(scheduled_nodes, irn)) {
+ DBG((dbg_sched, LEVEL_DEFAULT,
+ "%+F: %+F is in block but not scheduled\n", block, irn));
+ res = 0;
+ }
+ }
+
+ del_pset(scheduled_nodes);
+ free(save_time_step);
+ free((void *) save_nodes);
+ return res;
+}
+
+/**
+ * Block-Walker: verify the current block and update the status
+ */
+static void sched_verify_walker(ir_node *block, void *data)
+{
+ int *res = data;
+ *res &= sched_verify(block);
+}
+
+/* Verify the schedules in all blocks of the irg. */
+int sched_verify_irg(ir_graph *irg)
+{
+ int res = 1;
+ irg_block_walk_graph(irg, sched_verify_walker, NULL, &res);
+
+ return res;
+}
+
+int sched_skip_cf_predicator(const ir_node *irn, void *data) {
+ arch_env_t *ae = data;
+ return arch_irn_class_is(ae, irn, branch);
+}
+
+int sched_skip_phi_predicator(const ir_node *irn, void *data) {
+ return is_Phi(irn);
+}
+
+/* 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;
+}
+
+//---------------------------------------------------------------------------
+
+typedef struct remove_dead_nodes_env_t_ {
+ ir_graph *irg;
+ bitset_t *reachable;
+} remove_dead_nodes_env_t;
+
+static void mark_dead_nodes_walker(ir_node *node, void *data)
+{
+ remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data;
+ bitset_set(env->reachable, get_irn_idx(node));
+}
+
+static void remove_dead_nodes_walker(ir_node *block, void *data)
+{
+ remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data;
+ ir_node *node, *next;
+
+ for(node = sched_first(block); !sched_is_end(node); node = next) {
+ int i, arity;
+
+ // get next node now, as after calling sched_remove it will be invalid
+ next = sched_next(node);
+
+ if(bitset_is_set(env->reachable, get_irn_idx(node)))
+ continue;
+
+ arity = get_irn_arity(node);
+ for(i = 0; i < arity; ++i)
+ set_irn_n(node, i, new_r_Bad(env->irg));
+
+ sched_remove(node);
+ }
+}
+
+void be_remove_dead_nodes_from_schedule(ir_graph *irg)
+{
+ remove_dead_nodes_env_t env;
+ env.irg = irg;
+ env.reachable = bitset_alloca(get_irg_last_idx(irg));
+
+ // mark all reachable nodes
+ irg_walk_graph(irg, mark_dead_nodes_walker, NULL, &env);
+
+ // walk schedule and remove non-marked nodes
+ irg_block_walk_graph(irg, remove_dead_nodes_walker, NULL, &env);