X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbespillbelady.c;h=ffb44f2145dd7704439a229939681829f70a728f;hb=afbbc0b1ccd684c4c24bfd43d0f994123245f39f;hp=12f84ce849e3fa4cb8126216afc08035def26029;hpb=2cc8c3b3bb545e020df93fa6bbc880974d66c20b;p=libfirm diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index 12f84ce84..ffb44f214 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -593,7 +593,7 @@ static void decide_start_workset(const ir_node *block) loc = to_take_or_not_to_take(first, node, loop, available); if (! USES_IS_INFINITE(loc.time)) { - if (USES_IS_PENDING(loc.time) && !all_preds_known) + if (USES_IS_PENDING(loc.time)) ARR_APP1(loc_t, delayed, loc); else ARR_APP1(loc_t, starters, loc); @@ -616,7 +616,7 @@ static void decide_start_workset(const ir_node *block) loc = to_take_or_not_to_take(first, node, loop, available); if (! USES_IS_INFINITE(loc.time)) { - if (USES_IS_PENDING(loc.time) && !all_preds_known) + if (USES_IS_PENDING(loc.time)) ARR_APP1(loc_t, delayed, loc); else ARR_APP1(loc_t, starters, loc); @@ -638,35 +638,35 @@ static void decide_start_workset(const ir_node *block) qsort(delayed, ARR_LEN(delayed), sizeof(delayed[0]), loc_compare); for (i = 0; i < ARR_LEN(delayed) && free_slots > 0; ++i) { - //int p, arity; + int p, arity; loc_t *loc = & delayed[i]; -#if 0 - /* don't use values which are dead in a known predecessors - * to not induce unnecessary reloads */ - arity = get_irn_arity(block); - for (p = 0; p < arity; ++p) { - ir_node *pred_block = get_Block_cfgpred_block(block, p); - block_info_t *pred_info = get_block_info(pred_block); - - if (pred_info == NULL) - continue; - - if (!workset_contains(pred_info->end_workset, loc->node)) { - DB((dbg, DBG_START, - " delayed %+F not live at pred %+F\n", loc->node, - pred_block)); - goto skip_delayed; + if (!is_Phi(loc->node)) { + /* don't use values which are dead in a known predecessors + * to not induce unnecessary reloads */ + arity = get_irn_arity(block); + for (p = 0; p < arity; ++p) { + ir_node *pred_block = get_Block_cfgpred_block(block, p); + block_info_t *pred_info = get_block_info(pred_block); + + if (pred_info == NULL) + continue; + + if (!workset_contains(pred_info->end_workset, loc->node)) { + DB((dbg, DBG_START, + " delayed %+F not live at pred %+F\n", loc->node, + pred_block)); + goto skip_delayed; + } } } -#endif DB((dbg, DBG_START, " delayed %+F taken\n", loc->node)); ARR_APP1(loc_t, starters, *loc); loc->node = NULL; --free_slots; -// skip_delayed: -// ; + skip_delayed: + ; } }