- else {
- b = get_irn_link(irn);
-
- assert(b && b->magic == BORDER_FOURCC && "Illegal border encountered");
- }
-
- b->pressure = pressure;
- b->is_def = is_def;
- b->is_real = is_real;
- b->irn = irn;
- b->step = step;
- list_add_tail(&b->list, head);
- DBG((env->dbg, LEVEL_5, "\t\t%s adding %+F, step: %d\n", is_def ? "def" : "use", irn, step));
-
-
- return b;
-}
-
-/**
- * Check, if an irn is of the register class currently under processing.
- * @param env The chordal environment.
- * @param irn The node.
- * @return 1, if the node is of that register class, 0 if not.
- */
-static INLINE int has_reg_class(const be_chordal_env_t *env, const ir_node *irn)
-{
- // return arch_irn_has_reg_class(env->main_env->arch_env, irn, -1, env->cls);
- return arch_irn_consider_in_reg_alloc(env->birg->main_env->arch_env, env->cls, irn);
-}
-
-#define has_limited_constr(req, irn) \
- (arch_get_register_req(arch_env, (req), irn, -1) && (req)->type == arch_register_req_type_limited)
-
-typedef struct _operand_t operand_t;
-
-struct _operand_t {
- ir_node *irn;
- ir_node *carrier;
- operand_t *partner;
- int pos;
- arch_register_req_t req;
-};
-
-typedef struct {
- operand_t *ops;
- int n_ops;
- int use_start;
- ir_node *next_insn;
- unsigned in_constraints : 1;
- unsigned out_constraints : 1;
- unsigned has_constraints : 1;
- unsigned pre_colored : 1;
-} insn_t;
-
-static insn_t *scan_insn(be_chordal_env_t *env, ir_node *irn, struct obstack *obst)
-{
- const arch_env_t *arch_env = env->birg->main_env->arch_env;
- operand_t o;
- insn_t *insn;
- int i, n;
- int pre_colored = 0;
-
- insn = obstack_alloc(obst, sizeof(insn[0]));
- memset(insn, 0, sizeof(insn[0]));
-
- insn->next_insn = sched_next(irn);
- if(get_irn_mode(irn) == mode_T) {
- ir_node *p;
-
- for(p = sched_next(irn); is_Proj(p); p = sched_next(p)) {
- if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, p)) {
- o.carrier = p;
- o.irn = irn;
- o.pos = -(get_Proj_proj(p) + 1);
- o.partner = NULL;
- arch_get_register_req(arch_env, &o.req, p, -1);
- obstack_grow(obst, &o, sizeof(o));
- insn->n_ops++;
- insn->out_constraints |= arch_register_req_is(&o.req, limited);
- pre_colored += arch_get_irn_register(arch_env, p) != NULL;
- }
- }
-
- insn->next_insn = p;
- }
-
- else if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, irn)) {
- o.carrier = irn;
- o.irn = irn;
- o.pos = -1;
- o.partner = NULL;
- arch_get_register_req(arch_env, &o.req, irn, -1);
- obstack_grow(obst, &o, sizeof(o));
- insn->n_ops++;
- insn->out_constraints |= arch_register_req_is(&o.req, limited);
- pre_colored += arch_get_irn_register(arch_env, irn) != NULL;
- }
-
- insn->pre_colored = pre_colored == insn->n_ops;
- insn->use_start = insn->n_ops;
-
- for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
- ir_node *op = get_irn_n(irn, i);
-
- if(arch_irn_consider_in_reg_alloc(arch_env, env->cls, op)) {
- o.carrier = op;
- o.irn = irn;
- o.pos = i;
- o.partner = NULL;
- arch_get_register_req(arch_env, &o.req, irn, i);
- obstack_grow(obst, &o, sizeof(o));
- insn->n_ops++;
- insn->in_constraints |= arch_register_req_is(&o.req, limited);
- }
- }
-
- insn->has_constraints = insn->in_constraints | insn->out_constraints;
- insn->ops = obstack_finish(obst);
- return insn;
-}
-
-#if 0
-static operand_t *find_unpaired_use(insn_t *insn, const operand_t *op, int can_be_constrained)
-{
- int i;
- operand_t *res = NULL;
-
- for(i = insn->use_start; i < insn->n_ops; ++i) {
- operand_t *op = &insn->ops[i];
- int has_constraint = arch_register_req_is(&op->req, limited);
-
- if(!values_interfere(op->carrier, op->irn) && !op->partner) {
-
- if(!has_constraint || can_be_constrained) {
- if(arch_register_req_is(&op->req, should_be_same) && op->req.other_same == op->carrier)
- return op;
- else
- res = op;
+ for (j = 0; j < insn->use_start; ++j) {
+ be_operand_t *smallest = NULL;
+ int smallest_n_regs = env->cls->n_regs + 1;
+ be_operand_t *out_op = &insn->ops[j];
+
+ /* Try to find an in operand which has ... */
+ for (i = insn->use_start; i < insn->n_ops; ++i) {
+ int n_total;
+ be_operand_t *op = &insn->ops[i];
+ be_lv_t *lv;
+
+ if (op->partner != NULL)
+ continue;
+ lv = be_get_irg_liveness(env->irg);
+ if (be_values_interfere(lv, op->irn, op->carrier))
+ continue;
+
+ bitset_copy(bs, op->regs);
+ bitset_and(bs, out_op->regs);
+ n_total = bitset_popcount(op->regs);
+
+ if (!bitset_is_empty(bs) && n_total < smallest_n_regs) {
+ smallest = op;
+ smallest_n_regs = n_total;