+ op = get_irn_op(current_node);
+ peephole_node = (peephole_opt_func)op->ops.generic;
+ if (peephole_node == NULL)
+ continue;
+
+ peephole_node(current_node);
+ assert(!is_Bad(current_node));
+ }
+}
+
+static void kill_node_and_preds(ir_node *node)
+{
+ int arity, i;
+
+ arity = get_irn_arity(node);
+ for (i = 0; i < arity; ++i) {
+ ir_node *pred = get_irn_n(node, i);
+
+ set_irn_n(node, i, new_Bad());
+ if (get_irn_n_edges(pred) != 0)
+ continue;
+
+ kill_node_and_preds(pred);
+ }
+
+ if (!is_Proj(node))
+ sched_remove(node);
+ kill_node(node);
+}
+
+/**
+ * Walk through the block schedule and skip all barrier nodes.
+ */
+static void skip_barrier(ir_node *ret_blk, ir_graph *irg) {
+ ir_node *irn;
+
+ sched_foreach_reverse(ret_blk, irn) {
+ const ir_edge_t *edge, *next;
+
+ if (!be_is_Barrier(irn))