+static int ifg_std_connected(const void *self, const ir_node *a, const ir_node *b)
+{
+ return values_interfere(a, b);
+}
+
+typedef struct _nodes_iter_t {
+ const be_chordal_env_t *env;
+ struct obstack obst;
+ int n;
+ int curr;
+ ir_node **nodes;
+} nodes_iter_t;
+
+static void nodes_walker(ir_node *bl, void *data)
+{
+ nodes_iter_t *it = data;
+ struct list_head *head = get_block_border_head(it->env, bl);
+
+ border_t *b;
+
+ foreach_border_head(head, b) {
+ if(b->is_def && b->is_real) {
+ obstack_ptr_grow(&it->obst, b->irn);
+ it->n++;
+ }
+ }
+}
+
+static void find_nodes(const void *self, void *iter) {
+ const ifg_std_t *ifg = self;
+ nodes_iter_t *it = iter;
+
+ obstack_init(&it->obst);
+ it->n = 0;
+ it->curr = 0;
+ it->env = ifg->env;
+
+ irg_block_walk_graph(ifg->env->irg, nodes_walker, NULL, iter);
+ it->nodes = obstack_finish(&it->obst);
+}
+
+static INLINE void node_break(nodes_iter_t *it, int force)
+{
+ if((it->curr >= it->n || force) && it->nodes) {
+ obstack_free(&it->obst, NULL);
+ it->nodes = NULL;
+ }
+}
+
+static ir_node *get_next_node(void *iter)
+{
+ nodes_iter_t *it = iter;
+ ir_node *res = NULL;
+
+ if(it->curr < it->n)
+ res = it->nodes[it->curr++];
+
+ node_break(it, 0);
+
+ return res;
+}
+
+static ir_node *ifg_std_nodes_begin(const void *self, void *iter)
+{
+ find_nodes(self, iter);
+ return get_next_node(iter);
+}
+
+static ir_node *ifg_std_nodes_next(const void *self, void *iter)