+/**
+ * Enter memory for the outs to a node.
+ *
+ * @param n current node
+ * @param free current free address in the chunk allocated for the outs
+ *
+ * @return The next free address
+ */
+static ir_node **_set_out_edges(ir_node *n, ir_node **free) {
+ int n_outs, start, i, irn_arity;
+ ir_node *pred;
+
+ set_irn_visited(n, get_irg_visited(current_ir_graph));
+
+ /* Allocate my array */
+ n_outs = PTR_TO_INT(n->out);
+ n->out = free;
+#ifdef DEBUG_libfirm
+ n->out_valid = 1;
+#endif /* defined DEBUG_libfirm */
+ free += n_outs;
+ /* We count the successors again, the space will be sufficient.
+ We use this counter to remember the position for the next back
+ edge. */
+ n->out[0] = (ir_node *)0;
+
+ start = is_Block(n) ? 0 : -1;
+ irn_arity = get_irn_arity(n);
+
+ for (i = start; i < irn_arity; ++i) {
+ pred = get_irn_n(n, i);
+ /* Recursion */
+ if (get_irn_visited(pred) < get_irg_visited(current_ir_graph))
+ free = _set_out_edges(pred, free);
+ /* Remember our back edge */
+ pred->out[get_irn_n_outs(pred)+1] = n;
+ pred->out[0] = INT_TO_PTR(get_irn_n_outs(pred) + 1);
+ }
+ return free;