- for (max=get_irn_arity(irn), o=0; o<max; ++o) {
- ir_node *arg = get_irn_n(irn, o);
- ir_node *pred_block = get_Block_cfgpred_block(get_nodes_block(irn), o);
- ir_node *cpy = be_new_Copy(bel->cls, irg, pred_block, arg);
- pset_insert_ptr(bel->copies, cpy);
- DBG((dbg, DBG_START, " place a %+F of %+F in %+F\n", cpy, arg, pred_block));
- sched_add_before(pred_block, cpy);
- set_irn_n(irn, o, cpy);
- }
+ DEL_ARR_F(starters);
+}
+
+/**
+ * Collects all values live-in at block @p blk and all phi results in this block.
+ * Then it adds the best values (at most n_regs) to the blocks start_workset.
+ * The phis among the remaining values get spilled: Introduce psudo-copies of
+ * their args to break interference and make it possible to spill them to the
+ * same spill slot.
+ */
+static block_info_t *compute_block_start_info(belady_env_t *env, ir_node *block) {
+ ir_node *pred_block;
+ block_info_t *res, *pred_info;
+
+ /* Have we seen this block before? */
+ res = get_block_info(block);
+ if (res)
+ return res;
+
+ /* Create the block info for this block. */
+ res = new_block_info(&env->ob);
+ set_block_info(block, res);
+
+ /* Use endset of predecessor block as startset */
+ assert(get_Block_n_cfgpreds(block) == 1 && block != get_irg_start_block(get_irn_irg(block)));
+ pred_block = get_Block_cfgpred_block(block, 0);
+ pred_info = get_block_info(pred_block);
+
+ /* if pred block has not been processed yet, do it now */
+ if (pred_info == NULL || pred_info->processed == 0) {
+ belady(pred_block, env);
+ pred_info = get_block_info(pred_block);