+ 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;