-static void *co_mst_irn_init(ir_phase *ph, ir_node *irn, void *old) {
- co_mst_irn_t *res = old ? old : phase_alloc(ph, sizeof(res[0]));
- co_mst_env_t *env = ph->priv;
-
- if (res != old) {
- const arch_register_req_t *req;
- void *nodes_it = be_ifg_nodes_iter_alloca(env->ifg);
- ir_node *neigh;
- unsigned len;
-
- res->irn = irn;
- res->chunk = new_aff_chunk(env);
- res->fixed = 0;
- res->tmp_fixed = 0;
- res->tmp_col = -1;
- res->int_neighs = NULL;
- res->int_aff_neigh = 0;
- res->col = arch_register_get_index(arch_get_irn_register(env->aenv, irn));
- res->init_col = res->col;
-
- /* add note to new chunk */
- aff_chunk_add_node(res->chunk, res);
-
- DB((dbg, LEVEL_4, "Creating phase info for %+F, chunk %d\n", irn, res->chunk->id));
-
- /* set admissible registers */
- res->adm_colors = bitset_obstack_alloc(phase_obst(ph), env->n_regs);
-
- /* Exclude colors not assignable to the irn */
- req = arch_get_register_req(env->aenv, irn, -1);
- if (arch_register_req_is(req, limited))
- rbitset_copy_to_bitset(req->limited, res->adm_colors);
- else
- bitset_set_all(res->adm_colors);
-
- /* exclude global ignore registers as well */
- bitset_andnot(res->adm_colors, env->ignore_regs);
-
- /* set the number of interfering affinity neighbours to -1, they are calculated later */
- res->int_aff_neigh = -1;
-
- /* build list of interfering neighbours */
- len = 0;
- /* count them first as an obstack array cannot be extended */
- be_ifg_foreach_neighbour(env->ifg, nodes_it, irn, neigh)
- len++;
- res->int_neighs = NEW_ARR_D(ir_node *, phase_obst(ph), len);
- len = 0;
- be_ifg_foreach_neighbour(env->ifg, nodes_it, irn, neigh)
- res->int_neighs[len++] = neigh;
+static int nodes_insert(const ir_node ***arr, const ir_node *irn)
+{
+ int idx = nodes_bsearch(*arr, irn);
+
+ if (idx < 0) {
+ int i, n = ARR_LEN(*arr);
+ const ir_node **l;
+
+ ARR_APP1(const ir_node *, *arr, irn);
+
+ /* move it */
+ idx = ~idx;
+ l = *arr;
+ for (i = n - 1; i >= idx; --i)
+ l[i + 1] = l[i];
+ l[idx] = irn;
+ return 1;