+ be_liveness_nodes_live_at(lv, arch_env, cls, pos, live);
+
+ n = pset_count(live);
+
+ if(n == 0) {
+ del_pset(live);
+ return NULL;
+ }
+
+ nodes = xmalloc(n * sizeof(nodes[0]));
+
+ DBG((dbg, LEVEL_1, "live:\n"));
+ for(irn = pset_first(live), i = 0; irn; irn = pset_next(live), i++) {
+ DBG((dbg, LEVEL_1, "\t%+F\n", irn));
+ nodes[i] = irn;
+ }
+ del_pset(live);
+
+ perm = be_new_Perm(cls, irg, bl, n, nodes);
+ sched_add_after(pos, perm);
+ free(nodes);
+
+ curr = perm;
+ for (i = 0; i < n; ++i) {
+ ir_node *copies[2];
+ ir_node *perm_op = get_irn_n(perm, i);
+ const arch_register_t *reg = arch_get_irn_register(arch_env, perm_op);
+
+ ir_mode *mode = get_irn_mode(perm_op);
+ ir_node *proj = new_r_Proj(irg, bl, perm, mode, i);
+ arch_set_irn_register(arch_env, proj, reg);
+
+ sched_add_after(curr, proj);
+ curr = proj;
+
+ copies[0] = perm_op;
+ copies[1] = proj;
+
+ be_ssa_constr(dom_front, lv, 2, copies);
+ }
+
+ return perm;
+}
+
+struct _elr_closure_t {
+ struct obstack obst;
+ const be_chordal_env_t *cenv;
+};
+
+static void elr_split_walker(ir_node *bl, void *data)
+{
+ struct _elr_closure_t *c = data;
+ const be_chordal_env_t *cenv = c->cenv;
+ const arch_env_t *aenv = cenv->birg->main_env->arch_env;
+ be_lv_t *lv = cenv->birg->lv;
+ be_dom_front_info_t *dom_front = cenv->birg->dom_front;
+ be_insn_t *insn;
+ be_insn_env_t ie;
+
+ be_insn_env_init(&ie, cenv->birg, cenv->cls, &c->obst);
+
+ for(insn = be_scan_insn(&ie, sched_first(bl)); !is_Block(insn->irn); insn = be_scan_insn(&ie, insn->next_insn)) {
+ ir_node *pred = sched_prev(insn->irn);
+ if(!is_Block(pred) && !is_Phi(insn->irn))
+ insert_Perm_after(aenv, lv, cenv->cls, dom_front, insn->irn);
+ }