+ /* check, if we found some candidates for melting */
+ if (n_melt == 1) {
+ DBG((cenv->dbg, LEVEL_1, "\tno candidate found\n"));
+ continue;
+ }
+
+ ir_nodeset_remove(&entry->copies, ref);
+ sched_remove(ref);
+
+ melt_arr = (ir_node **)obstack_finish(&obst);
+ /* melt all found copykeeps */
+ NEW_ARR_A(ir_node *, new_ck_in, n_melt);
+ for (j = 0; j < n_melt; ++j) {
+ new_ck_in[j] = get_irn_n(melt_arr[j], 1);
+
+ /* now, we can kill the melted keep, except the */
+ /* ref one, we still need some information */
+ if (melt_arr[j] != ref)
+ kill_node(melt_arr[j]);
+ }
+
+#ifdef KEEP_ALIVE_COPYKEEP_HACK
+ new_ck = be_new_CopyKeep(entry->cls, irg, get_nodes_block(ref), be_get_CopyKeep_op(ref), n_melt, new_ck_in, mode_ANY);
+ keep_alive(new_ck);
+#else
+ new_ck = be_new_CopyKeep(entry->cls, irg, get_nodes_block(ref), be_get_CopyKeep_op(ref), n_melt, new_ck_in, get_irn_mode(ref));
+#endif /* KEEP_ALIVE_COPYKEEP_HACK */
+
+ /* set register class for all kept inputs */
+ for (j = 1; j <= n_melt; ++j)
+ be_node_set_reg_class(new_ck, j, entry->cls);
+
+ ir_nodeset_insert(&entry->copies, new_ck);
+
+ /* find scheduling point */
+ sched_pt = ref_mode_T;
+ do {
+ /* just walk along the schedule until a non-Keep/CopyKeep node is found */
+ sched_pt = sched_next(sched_pt);
+ } while (be_is_Keep(sched_pt) || be_is_CopyKeep(sched_pt));
+
+ sched_add_before(sched_pt, new_ck);
+ DBG((cenv->dbg, LEVEL_1, "created %+F, scheduled before %+F\n", new_ck, sched_pt));
+
+ /* finally: kill the reference copykeep */
+ kill_node(ref);
+ }
+ }