+static co_mst_irn_t *get_co_mst_irn(co_mst_env_t *env, const ir_node *node)
+{
+ co_mst_irn_t *res = (co_mst_irn_t*)ir_nodemap_get(&env->map, node);
+ if (res == NULL) {
+ res = co_mst_irn_init(env, node);
+ ir_nodemap_insert(&env->map, node, res);
+ }
+ return res;
+}
+
+typedef int decide_func_t(const co_mst_irn_t *node, int col);
+
+#ifdef DEBUG_libfirm
+
+/**
+ * Write a chunk to stderr for debugging.
+ */
+static void dbg_aff_chunk(const co_mst_env_t *env, const aff_chunk_t *c)
+{
+ int i, l;
+ (void) env;
+ if (c->weight_consistent)
+ ir_fprintf(stderr, " $%d ", c->weight);
+ ir_fprintf(stderr, "{");
+ for (i = 0, l = ARR_LEN(c->n); i < l; ++i) {
+ const ir_node *n = c->n[i];
+ ir_fprintf(stderr, " %+F,", n);
+ }
+ ir_fprintf(stderr, "}");
+}
+
+/**
+ * Dump all admissible colors to stderr.
+ */
+static void dbg_admissible_colors(const co_mst_env_t *env, const co_mst_irn_t *node)
+{
+ size_t idx;
+ (void) env;
+
+ if (bitset_popcount(node->adm_colors) < 1)
+ fprintf(stderr, "no admissible colors?!?");
+ else {
+ bitset_foreach(node->adm_colors, idx) {
+ ir_fprintf(stderr, " %zu", idx);
+ }
+ }
+}
+
+/**
+ * Dump color-cost pairs to stderr.
+ */
+static void dbg_col_cost(const co_mst_env_t *env, const col_cost_t *cost)
+{
+ int i;
+ for (i = 0; i < env->n_regs; ++i)
+ fprintf(stderr, " (%d, %.4f)", cost[i].col, cost[i].cost);
+}
+
+#endif /* DEBUG_libfirm */
+
+static inline int get_mst_irn_col(const co_mst_irn_t *node)
+{
+ return node->tmp_col >= 0 ? node->tmp_col : node->col;