+ pbqp_alloc_env->restr_nodes[get_irn_idx(irn)] = cntConstrains;
+}
+
+static void insert_ife_edge(be_pbqp_alloc_env_t *pbqp_alloc_env, ir_node *src_node, ir_node *trg_node)
+{
+ pbqp *pbqp = pbqp_alloc_env->pbqp_inst;
+ const arch_register_class_t *cls = pbqp_alloc_env->cls;
+ pbqp_matrix *ife_matrix_template = pbqp_alloc_env->ife_matrix_template;
+ unsigned *restr_nodes = pbqp_alloc_env->restr_nodes;
+
+ if (get_edge(pbqp, get_irn_idx(src_node), get_irn_idx(trg_node)) == NULL) {
+
+ /* increase ife edge counter */
+ pbqp_alloc_env->ife_edge_num[get_irn_idx(src_node)]++;
+ pbqp_alloc_env->ife_edge_num[get_irn_idx(trg_node)]++;
+
+ /* do useful optimization to speed up pbqp solving (we can do this because we know our matrix) */
+ if (get_free_regs(restr_nodes, cls, src_node) == 1 && get_free_regs(restr_nodes, cls, trg_node) == 1) {
+ unsigned src_idx = vector_get_min_index(get_node(pbqp, get_irn_idx(src_node))->costs);
+ unsigned trg_idx = vector_get_min_index(get_node(pbqp, get_irn_idx(trg_node))->costs);
+ assert(src_idx != trg_idx && "Interfering nodes could not have the same register!");
+ return;
+ }
+ if (get_free_regs(restr_nodes, cls, src_node) == 1 || get_free_regs(restr_nodes, cls, trg_node) == 1) {
+ if (get_free_regs(restr_nodes, cls, src_node) == 1) {
+ unsigned idx = vector_get_min_index(get_node(pbqp, get_irn_idx(src_node))->costs);
+ vector_set(get_node(pbqp, get_irn_idx(trg_node))->costs, idx, INF_COSTS);
+ }
+ else {
+ unsigned idx = vector_get_min_index(get_node(pbqp, get_irn_idx(trg_node))->costs);
+ vector_set(get_node(pbqp, get_irn_idx(src_node))->costs, idx, INF_COSTS);
+ }
+ return;
+ }