+/**
+ * Get the edge object of an outgoing edge at a node.
+ * @param irg The graph, the node is in.
+ * @param src The node at which the edge originates.
+ * @param pos The position of the edge.
+ * @return The corresponding edge object or NULL,
+ * if no such edge exists.
+ */
+const ir_edge_t *get_irn_edge_kind(ir_graph *irg, const ir_node *src, int pos, ir_edge_kind_t kind)
+{
+ if (edges_activated_kind(irg, kind)) {
+ irg_edge_info_t *info = _get_irg_edge_info(irg, kind);
+ ir_edge_t key;
+
+ key.src = (ir_node *)src;
+ key.pos = pos;
+ return set_find(info->edges, &key, EDGE_SIZE, edge_hash(&key));
+ }
+
+ return NULL;
+}
+
+/**
+ * Get the edge object of an outgoing edge at a node.
+ * Looks for an edge for all kinds.
+ */
+
+const ir_edge_t *get_irn_edge(ir_graph *irg, const ir_node *src, int pos)
+{
+ const ir_edge_t *edge;
+ if((edge = get_irn_edge_kind(irg, src, pos, EDGE_KIND_NORMAL)) == NULL)
+ edge = get_irn_edge_kind(irg, src, pos, EDGE_KIND_BLOCK);
+ return(edge);
+}
+
+/**
+ * Change the out count
+ */
+static INLINE void edge_change_cnt(ir_node *tgt, ir_edge_kind_t kind, int ofs) {
+ irn_edge_info_t *info = _get_irn_edge_info(tgt, kind);
+ info->out_count += ofs;
+}
+
+/**
+ * Verify the edge list of a node, ie. ensure it's a loop:
+ * head -> e_1 -> ... -> e_n -> head
+ */
+static INLINE void vrfy_list_head(ir_node *irn, ir_edge_kind_t kind) {
+ int err = 0;
+ int num = 0;
+ pset *lh_set = pset_new_ptr(16);
+ const struct list_head *head = _get_irn_outs_head(irn, kind);
+ const struct list_head *pos;
+
+ list_for_each(pos, head) {
+ if (pset_find_ptr(lh_set, pos)) {
+ const ir_edge_t *edge = list_entry(pos, ir_edge_t, list);
+
+ ir_fprintf(stderr, "EDGE Verifier: edge list broken (self loop not to head) for %+F:\n", irn);
+ fprintf(stderr, "- at list entry %d\n", num);
+ if (edge->invalid)
+ fprintf(stderr, "- edge(%ld) is invalid\n", edge_get_id(edge));
+ if (edge->src)
+ ir_fprintf(stderr, "- edge(%ld) %+F(%d)\n", edge_get_id(edge), edge->src, edge->pos);
+ err = 1;
+ break;
+ }
+ num++;
+ pset_insert_ptr(lh_set, pos);
+ }
+
+ del_pset(lh_set);
+
+ assert(err == 0);
+}
+
+/* The edge from (src, pos) -> old_tgt is redirected to tgt */
+void edges_notify_edge_kind(ir_node *src, int pos, ir_node *tgt,
+ ir_node *old_tgt, ir_edge_kind_t kind,
+ ir_graph *irg)