+#define foreach_out_edge_kind(irn, edge, kind) \
+ for(edge = get_irn_out_edge_first_kind(irn, kind); edge; edge = get_irn_out_edge_next(irn, edge))
+
+/**
+ * A convenience iteration macro over all out edges of a node, which is safe
+ * against alteration of the current edge.
+ *
+ * @param irn The node.
+ * @param edge An ir_edge_t pointer which shall be set to the current edge.
+ * @param ne The next edge, enables alteration safe edge processing.
+ */
+#define foreach_out_edge_kind_safe(irn, edge, ne, kind) \
+ for((edge) = (get_irn_out_edge_first_kind(irn, kind)), (ne) = ((edge) ? (get_irn_out_edge_next(irn, edge)) : NULL); \
+ edge; (edge) = (ne), (ne) = ((edge) ? (get_irn_out_edge_next(irn, edge)) : NULL))
+
+/**
+ * Convenience macro for normal out edges.
+ */
+#define foreach_out_edge(irn, edge) foreach_out_edge_kind(irn, edge, EDGE_KIND_NORMAL)
+
+/**
+ * Convenience macro for normal out edges.
+ */
+#define foreach_out_edge_safe(irn, edge, tmp) foreach_out_edge_kind_safe(irn, edge, tmp, EDGE_KIND_NORMAL)