-void compute_outs(ir_graph *irg) {
- ir_graph *rem = current_ir_graph;
- int n_out_edges = 0;
-
- current_ir_graph = irg;
-
- /* Update graph state */
- assert(get_irg_phase_state(current_ir_graph) != phase_building);
- current_ir_graph->outs_state = outs_consistent;
+static void set_out_edges_node(ir_node *node, struct obstack *obst)
+{
+ if (irn_visited_else_mark(node))
+ return;
+
+ /* Allocate my array */
+ unsigned n_outs = node->o.n_outs;
+ node->o.out = OALLOCF(obst, ir_def_use_edges, edges, n_outs);
+ node->o.out->n_edges = 0;
+
+ /* add def->use edges from my predecessors to me */
+ int start = is_Block(node) ? 0 : -1;
+ int irn_arity = get_irn_arity(node);
+ for (int i = start; i < irn_arity; ++i) {
+ ir_node *def = get_irn_n(node, i);
+
+ /* recurse, ensures that out array of pred is already allocated */
+ set_out_edges_node(def, obst);
+
+ /* Remember this Def-Use edge */
+ unsigned pos = def->o.out->n_edges++;
+ def->o.out->edges[pos].use = node;
+ def->o.out->edges[pos].pos = i;
+ }
+}