X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=203edf2ef099e4fababa48ae0b1e1e604e919007;hb=3f807bf48426a29da4129ff29c44a4b4690c45f6;hp=137786f44ebc1fd845eec20ccb1cbb7e863238f2;hpb=e5fb67efb637315db0be7f976f8ebeaf0e44364e;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index 137786f44..203edf2ef 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -377,6 +377,8 @@ static void displace(workset_t *new_vals, int is_usage) #ifdef PLACE_SPILLS if (!USES_IS_INFINITE(ws->vals[i].time) && !ws->vals[i].spilled) { ir_node *after_pos = sched_prev(instr); + DB((dbg, DBG_DECIDE, "Spill %+F after node %+F\n", val, + after_pos)); be_add_spill(senv, val, after_pos); } #endif @@ -497,9 +499,6 @@ static loc_t to_take_or_not_to_take(ir_node* first, ir_node *node, assert(is_Phi(node)); loc.time = USES_INFINITY; DB((dbg, DBG_START, " %+F not taken (dead)\n", node)); - if (is_Phi(node)) { - be_spill_phi(senv, node); - } return loc; } @@ -577,6 +576,8 @@ static void decide_start_workset(const ir_node *block) if (! is_Phi(node)) break; + if (!arch_irn_consider_in_reg_alloc(arch_env, cls, node)) + continue; if (all_preds_known) { available = available_in_all_preds(pred_worksets, arity, node, true); @@ -591,6 +592,8 @@ static void decide_start_workset(const ir_node *block) ARR_APP1(loc_t, delayed, loc); else ARR_APP1(loc_t, starters, loc); + } else { + be_spill_phi(senv, node); } } @@ -624,10 +627,12 @@ static void decide_start_workset(const ir_node *block) /* so far we only put nodes into the starters list that are used inside * the loop. If register pressure in the loop is low then we can take some * values and let them live through the loop */ + DB((dbg, DBG_START, "Loop pressure %d, taking %d delayed vals\n", + pressure, free_slots)); if (free_slots > 0) { qsort(delayed, ARR_LEN(delayed), sizeof(delayed[0]), loc_compare); - for (i = 0; i < ARR_LEN(delayed) && i < free_slots; ++i) { + for (i = 0; i < ARR_LEN(delayed) && free_slots > 0; ++i) { int p, arity; loc_t *loc = & delayed[i]; @@ -652,6 +657,7 @@ static void decide_start_workset(const ir_node *block) DB((dbg, DBG_START, " delayed %+F taken\n", loc->node)); ARR_APP1(loc_t, starters, *loc); loc->node = NULL; + --free_slots; skip_delayed: ; }