+ /* Else insert the argument of the phi to the members of this ou */
+ DBG((dbg, LEVEL_1, "\t Member: %+F\n", arg));
+
+ /* Check if arg has occurred at a prior position in the arg/list */
+ arg_pos = 0;
+ for (o=0; o<unit->node_count; ++o)
+ if (unit->nodes[o] == arg) {
+ arg_pos = o;
+ break;
+ }
+
+ if (!arg_pos) { /* a new argument */
+ /* insert node, set costs */
+ unit->nodes[unit->node_count] = arg;
+ unit->costs[unit->node_count] = co->get_costs(irn, arg, i);
+ unit->node_count++;
+ } else { /* arg has occured before in same phi */
+ /* increase costs for existing arg */
+ unit->costs[arg_pos] += co->get_costs(irn, arg, i);
+ }
+ }
+ unit->nodes = xrealloc(unit->nodes, unit->node_count * sizeof(*unit->nodes));
+ unit->costs = xrealloc(unit->costs, unit->node_count * sizeof(*unit->costs));
+ } else
+
+ /* Proj of a perm with corresponding arg */
+ if (is_Perm_Proj(co->aenv, irn)) {
+ assert(!nodes_interfere(co->cenv, irn, get_Perm_src(irn)));
+ unit->nodes = xmalloc(2 * sizeof(*unit->nodes));
+ unit->costs = xmalloc(2 * sizeof(*unit->costs));
+ unit->node_count = 2;
+ unit->nodes[0] = irn;
+ unit->nodes[1] = get_Perm_src(irn);
+ unit->costs[1] = co->get_costs(irn, unit->nodes[1], -1);
+ } else
+
+ /* Src == Tgt of a 2-addr-code instruction */
+ if (is_2addr_code(co->aenv, irn, &req)) {
+ ir_node *other = req.other_same;
+ if (!nodes_interfere(co->cenv, irn, other)) {
+ unit->nodes = xmalloc(2 * sizeof(*unit->nodes));
+ unit->costs = xmalloc(2 * sizeof(*unit->costs));
+ unit->node_count = 2;
+ unit->nodes[0] = irn;
+ unit->nodes[1] = other;
+ unit->costs[1] = co->get_costs(irn, other, -120480);
+ }
+ } else
+ assert(0 && "This is not an optimizable node!");
+
+ /* Insert the new unit at a position according to its costs */
+ if (unit->node_count > 1) {
+ int i;
+ struct list_head *tmp;
+
+ /* Determine the maximum costs this unit can cause: all_nodes_cost */
+ for(i=1; i<unit->node_count; ++i) {
+ unit->sort_key = MAX(unit->sort_key, unit->costs[i]);
+ unit->all_nodes_costs += unit->costs[i];
+ }