From 2cc8c3b3bb545e020df93fa6bbc880974d66c20b Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Tue, 7 Oct 2008 16:56:21 +0000 Subject: [PATCH] another fix for the delayed phi problem, mark memperms as spill+reload [r22584] --- ir/be/bespillbelady.c | 18 ++++++++++-------- ir/be/ia32/bearch_ia32.c | 2 ++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index 362874ff4..12f84ce84 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -593,9 +593,9 @@ 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)) + if (USES_IS_PENDING(loc.time) && !all_preds_known) ARR_APP1(loc_t, delayed, loc); - else*/ + else ARR_APP1(loc_t, starters, loc); } else { be_spill_phi(senv, node); @@ -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)) + if (USES_IS_PENDING(loc.time) && !all_preds_known) ARR_APP1(loc_t, delayed, loc); else ARR_APP1(loc_t, starters, loc); @@ -638,9 +638,10 @@ 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); @@ -653,18 +654,19 @@ static void decide_start_workset(const ir_node *block) 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)); + " 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: +// ; } } diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 3647a61d4..7fc5d809f 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -1269,6 +1269,7 @@ static ir_node *create_push(ia32_code_gen_t *cg, ir_node *node, ir_node *schedpo set_ia32_use_frame(push); set_ia32_op_type(push, ia32_AddrModeS); set_ia32_ls_mode(push, mode_Is); + set_ia32_is_spill(push); sched_add_before(schedpoint, push); return push; @@ -1287,6 +1288,7 @@ static ir_node *create_pop(ia32_code_gen_t *cg, ir_node *node, ir_node *schedpoi set_ia32_use_frame(pop); set_ia32_op_type(pop, ia32_AddrModeD); set_ia32_ls_mode(pop, mode_Is); + set_ia32_is_reload(pop); sched_add_before(schedpoint, pop); -- 2.20.1