- 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->has_constraints |= arch_register_req_is(&o.req, limited);
+ if(!o2) {
+ bitset_copy(bs, o1->regs);
+ return bs;
+ }
+
+ assert(o1->req.cls == o2->req.cls);
+
+ if(bitset_contains(o1->regs, o2->regs))
+ bitset_copy(bs, o1->regs);
+ else if(bitset_contains(o2->regs, o1->regs))
+ bitset_copy(bs, o2->regs);
+ else
+ res = NULL;
+
+ return res;
+}
+
+static be_insn_t *chordal_scan_insn(be_chordal_env_t *env, ir_node *irn)
+{
+ be_insn_env_t ie;
+
+ ie.ignore_colors = env->ignore_colors;
+ ie.aenv = env->birg->main_env->arch_env;
+ ie.obst = &env->obst;
+ ie.cls = env->cls;
+ return be_scan_insn(&ie, irn);
+}
+
+static ir_node *prepare_constr_insn(be_chordal_env_t *env, ir_node *irn)
+{
+ be_insn_t *insn = chordal_scan_insn(env, irn);
+ bitset_t *def_constr = bitset_alloca(env->cls->n_regs);
+ bitset_t *tmp = bitset_alloca(env->cls->n_regs);
+ ir_node *bl = get_nodes_block(insn->irn);
+ int i, j;
+
+ if(!insn->has_constraints)
+ goto end;
+
+ /* insert copies for nodes that occur constrained more than once. */
+ for(i = insn->use_start; i < insn->n_ops; ++i) {
+ be_operand_t *op = &insn->ops[i];
+
+ if(op->has_constraints) {
+ for(j = i + 1; j < insn->n_ops; ++j) {
+ be_operand_t *a_op = &insn->ops[j];
+
+ if(a_op->carrier == op->carrier && a_op->has_constraints) {
+ ir_node *copy = be_new_Copy(env->cls, env->irg, bl, op->carrier);
+
+ sched_add_before(insn->irn, copy);
+ set_irn_n(insn->irn, a_op->pos, copy);
+ DBG((env->dbg, LEVEL_3, "inserting multiple constr copy %+F for %+F pos %d\n", copy, insn->irn, a_op->pos));
+ }