From 9ade6371ce107751756515fdeef338cda59e19fe Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Fri, 17 Nov 2006 12:11:56 +0000 Subject: [PATCH] workaround for morgan/belady interaction problems --- ir/be/bespill.c | 20 +++++++++++++++++++- ir/be/bespillbelady.c | 4 ++-- ir/be/bespillbelady.h | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ir/be/bespill.c b/ir/be/bespill.c index 0da8e6ecd..7b31d26a1 100644 --- a/ir/be/bespill.c +++ b/ir/be/bespill.c @@ -170,6 +170,18 @@ void be_add_reload(spill_env_t *env, ir_node *to_spill, ir_node *before) { ir_node *arg = get_irn_n(to_spill, i); get_spillinfo(env, arg); } + +#if 1 + // hackery... sometimes the morgan algo spilled the value of a phi, + // the belady algo decides later to spill the whole phi, then sees the + // spill node and adds a reload for that spill node, problem is the + // reload gets attach to that same spill (and is totally unnecessary) + if(info->old_spill != NULL && + (before == info->old_spill || value_dominates(before, info->old_spill))) { + printf("spilledphi hack was needed...\n"); + before = sched_next(info->old_spill); + } +#endif } rel = obstack_alloc(&env->obst, sizeof(rel[0])); @@ -235,6 +247,7 @@ void be_spill_phi(spill_env_t *env, ir_node *node) { // if we had a spill for the phi value before, then remove this spill from // schedule, as we will remove it in the insert spill/reload phase if(spill->spill != NULL && !is_Phi(spill->spill)) { + assert(spill->old_spill == NULL); spill->old_spill = spill->spill; spill->spill = NULL; } @@ -344,11 +357,16 @@ static void spill_phi(spill_env_t *env, spill_info_t *spillinfo) { // rewire reloads from old_spill to phi if(spillinfo->old_spill != NULL) { const ir_edge_t *edge, *next; - foreach_out_edge_safe(spillinfo->old_spill, edge, next) { + ir_node *old_spill = spillinfo->old_spill; + + foreach_out_edge_safe(old_spill, edge, next) { ir_node* reload = get_edge_src_irn(edge); assert(be_is_Reload(reload) || is_Phi(reload)); set_irn_n(reload, get_edge_src_pos(edge), spillinfo->spill); } + set_irn_n(old_spill, be_pos_Spill_frame, new_Bad()); + set_irn_n(old_spill, be_pos_Spill_val, new_Bad()); + //sched_remove(old_spill); spillinfo->old_spill = NULL; } } diff --git a/ir/be/bespillbelady.c b/ir/be/bespillbelady.c index f171e66d5..b17bb3797 100644 --- a/ir/be/bespillbelady.c +++ b/ir/be/bespillbelady.c @@ -1,6 +1,6 @@ /** - * Author: Daniel Grund - * Date: 20.09.2005 + * Author: Daniel Grund, Matthias Braun + * Date: 20.09.2005 * Copyright: (c) Universitaet Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. * diff --git a/ir/be/bespillbelady.h b/ir/be/bespillbelady.h index 5308d890f..920b477cb 100644 --- a/ir/be/bespillbelady.h +++ b/ir/be/bespillbelady.h @@ -15,7 +15,7 @@ #include "bespill.h" void be_spill_belady(const be_chordal_env_t *env); -/// Same as be_spill_belady but reuses an existing spill enviornment +/// Same as be_spill_belady but reuses an existing spill environment void be_spill_belady_spill_env(const be_chordal_env_t *env, spill_env_t *spill_env); #endif /*BESPILLBELADY_H_*/ -- 2.20.1