+ 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);
+ obstack_ptr_grow(&it->obst, NULL);
+ 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)
+{
+ (void) self;
+ return get_next_node(iter);
+}
+
+static void ifg_std_nodes_break(const void *self, void *iter)
+{
+ (void) self;
+ node_break(iter, 1);
+}
+
+typedef struct _adj_iter_t {
+ const be_chordal_env_t *env;
+ const ir_node *irn;
+ int valid;
+ ir_nodeset_t neighbours;
+ ir_nodeset_iterator_t iter;
+} adj_iter_t;
+
+static void find_neighbour_walker(ir_node *block, void *data)
+{
+ adj_iter_t *it = data;
+ struct list_head *head = get_block_border_head(it->env, block);
+
+ border_t *b;
+ int has_started = 0;
+
+ if (!be_is_live_in(it->env->birg->lv, block, it->irn) && block != get_nodes_block(it->irn))
+ return;
+
+ foreach_border_head(head, b) {
+ ir_node *irn = b->irn;
+
+ if (irn == it->irn) {
+ if (b->is_def)
+ has_started = 1;
+ else
+ break; /* if we reached the end of the node's lifetime we can safely break */
+ }
+ else if (b->is_def) {
+ /* if any other node than the one in question starts living, add it to the set */
+ ir_nodeset_insert(&it->neighbours, irn);
+ }
+ else if (!has_started) {
+ /* we only delete, if the live range in question has not yet started */
+ ir_nodeset_remove(&it->neighbours, irn);
+ }
+
+ }
+}
+
+static void find_neighbours(const ifg_std_t *ifg, adj_iter_t *it, const ir_node *irn)
+{
+ it->env = ifg->env;
+ it->irn = irn;
+ it->valid = 1;
+ ir_nodeset_init(&it->neighbours);
+
+ dom_tree_walk(get_nodes_block(irn), find_neighbour_walker, NULL, it);
+
+ ir_nodeset_iterator_init(&it->iter, &it->neighbours);
+}
+
+static inline void neighbours_break(adj_iter_t *it, int force)
+{
+ (void) force;
+ assert(it->valid == 1);
+ ir_nodeset_destroy(&it->neighbours);
+ it->valid = 0;
+}
+
+static ir_node *get_next_neighbour(adj_iter_t *it)
+{
+ ir_node *res = ir_nodeset_iterator_next(&it->iter);
+
+ if (res == NULL) {
+ ir_nodeset_destroy(&it->neighbours);
+ }
+ return res;
+}
+
+static ir_node *ifg_std_neighbours_begin(const void *self, void *iter, const ir_node *irn)
+{
+ adj_iter_t *it = iter;
+ find_neighbours(self, iter, irn);
+ return ir_nodeset_iterator_next(&it->iter);
+}
+
+static ir_node *ifg_std_neighbours_next(const void *self, void *iter)
+{
+ (void) self;
+ return get_next_neighbour(iter);