+#if USE_BIPARTIT_MATCHING
+ if (get_irn_mode(irn) == mode_T) {
+ unsigned clique_size = 0;
+ unsigned n_alloc = 0;
+ pbqp_node *clique[cls->n_regs];
+ bipartite_t *bp = bipartite_new(cls->n_regs, cls->n_regs);
+
+ /* add all proj after a perm to clique */
+ const ir_edge_t *edge;
+ foreach_out_edge(irn, edge) {
+ ir_node *proj = get_edge_src_irn(edge);
+
+ /* ignore node if it is not necessary for register allocation */
+ if (!arch_irn_consider_in_reg_alloc(cls, proj))
+ continue;
+
+ /* insert pbqp node into temp rpeo list of this block */
+ plist_insert_front(temp_list, get_node(pbqp_inst, get_irn_idx(proj)));
+
+ if(is_Perm_Proj(proj)) {
+ /* add proj to clique */
+ pbqp_node *clique_member = get_node(pbqp_inst,proj->node_idx);
+ vector *costs = clique_member->costs;
+ unsigned idx = 0;
+
+ clique[clique_size] = clique_member;
+
+ for(idx = 0; idx < costs->len; idx++) {
+ if(costs->entries[idx].data != INF_COSTS) {
+ bipartite_add(bp, clique_size, idx);
+ }
+ }
+
+ /* increase node counter */
+ clique_size++;
+ n_alloc++;
+ }
+ }
+
+ if(clique_size > 0) {
+ plist_element_t *listElement;
+ foreach_plist(temp_list, listElement) {
+ pbqp_node *clique_candidate = listElement->data;
+ unsigned idx = 0;
+ bool isMember = true;
+
+ /* clique size not bigger then register class size */
+ if(clique_size >= cls->n_regs) break;
+
+ for(idx = 0; idx < clique_size; idx++) {
+ pbqp_node *member = clique[idx];
+
+ if(member == clique_candidate) {
+ isMember = false;
+ break;
+ }
+
+ if(get_edge(pbqp_inst, member->index, clique_candidate->index) == NULL && get_edge(pbqp_inst, clique_candidate->index, member->index) == NULL) {
+ isMember = false;
+ break;
+ }
+ }
+
+ /* goto next list element if current node is not a member of the clique */
+ if(!isMember) { continue; }
+
+ /* add candidate to clique */
+ clique[clique_size] = clique_candidate;
+
+ vector *costs = clique_candidate->costs;
+ for(idx = 0; idx < costs->len; idx++) {
+ if(costs->entries[idx].data != INF_COSTS) {
+ bipartite_add(bp, clique_size, idx);
+ }
+ }
+
+ /* increase node counter */
+ clique_size++;
+ }
+ }
+
+ /* solve bipartite matching */
+ bipartite_matching(bp, assignment);
+
+ /* assign colors */
+ unsigned nodeIdx = 0;
+ for(nodeIdx = 0; nodeIdx < clique_size; nodeIdx++) {
+ vector *costs = clique[nodeIdx]->costs;
+ int idx;
+ for(idx = 0; idx < (int)costs->len; idx++) {
+ if(assignment[nodeIdx] != idx) {
+ costs->entries[idx].data = INF_COSTS;
+ }
+ }
+ assert(assignment[nodeIdx] >= 0 && "there must have been a register assigned (node not register pressure faithful?)");
+ }
+
+ /* free memory */
+ bipartite_free(bp);
+ }
+ else {
+ if (arch_irn_consider_in_reg_alloc(cls, irn)) {
+ plist_insert_front(temp_list, get_node(pbqp_inst, get_irn_idx(irn)));
+ }
+ }
+#else