+ return node->chunk;
+}
+
+/**
+ * Let chunk(src) absorb the nodes of chunk(tgt) (only possible when there
+ * are no interference edges from chunk(src) to chunk(tgt)).
+ * @return 1 if successful, 0 if not possible
+ */
+static int aff_chunk_absorb(co_mst_env_t *env, const ir_node *src, const ir_node *tgt)
+{
+ aff_chunk_t *c1 = get_aff_chunk(env, src);
+ aff_chunk_t *c2 = get_aff_chunk(env, tgt);
+
+#ifdef DEBUG_libfirm
+ DB((dbg, LEVEL_4, "Attempt to let c1 (id %u): ", c1 ? c1->id : 0));
+ if (c1) {
+ DBG_AFF_CHUNK(env, LEVEL_4, c1);
+ } else {
+ DB((dbg, LEVEL_4, "{%+F}", src));
+ }
+ DB((dbg, LEVEL_4, "\n\tabsorb c2 (id %u): ", c2 ? c2->id : 0));
+ if (c2) {
+ DBG_AFF_CHUNK(env, LEVEL_4, c2);
+ } else {
+ DB((dbg, LEVEL_4, "{%+F}", tgt));
+ }
+ DB((dbg, LEVEL_4, "\n"));
+#endif
+
+ if (c1 == NULL) {
+ if (c2 == NULL) {
+ /* no chunk exists */
+ co_mst_irn_t *mirn = get_co_mst_irn(env, src);
+ int i;
+
+ for (i = mirn->n_neighs - 1; i >= 0; --i) {
+ if (mirn->int_neighs[i] == tgt)
+ break;
+ }
+ if (i < 0) {
+ /* create one containing both nodes */
+ c1 = new_aff_chunk(env);
+ aff_chunk_add_node(c1, get_co_mst_irn(env, src));
+ aff_chunk_add_node(c1, get_co_mst_irn(env, tgt));
+ goto absorbed;
+ }
+ } else {
+ /* c2 already exists */
+ if (! aff_chunk_interferes(c2, src)) {
+ aff_chunk_add_node(c2, get_co_mst_irn(env, src));
+ goto absorbed;
+ }
+ }
+ } else if (c2 == NULL) {
+ /* c1 already exists */
+ if (! aff_chunk_interferes(c1, tgt)) {
+ aff_chunk_add_node(c1, get_co_mst_irn(env, tgt));
+ goto absorbed;
+ }
+ } else if (c1 != c2 && ! aff_chunks_interfere(c1, c2)) {
+ int idx, len;
+
+ for (idx = 0, len = ARR_LEN(c2->n); idx < len; ++idx)
+ aff_chunk_add_node(c1, get_co_mst_irn(env, c2->n[idx]));
+
+ for (idx = 0, len = ARR_LEN(c2->interfere); idx < len; ++idx) {
+ const ir_node *irn = c2->interfere[idx];
+ nodes_insert(&c1->interfere, irn);
+ }