X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessadestr.c;h=41c11d380280b7c721286f2f9b4a36acf8c62da0;hb=39d4311ea8a4f1bd78d1e0282d77d71f7ef4efdb;hp=16efca4f777d336512c16dbb38a4b0dba5cd9b71;hpb=0c92b911be3d9d02b4a49b2a142dab8d7ba978a6;p=libfirm diff --git a/ir/be/bessadestr.c b/ir/be/bessadestr.c index 16efca4f7..41c11d380 100644 --- a/ir/be/bessadestr.c +++ b/ir/be/bessadestr.c @@ -1,10 +1,28 @@ -/** - * Author: Daniel Grund - * Date: 25.05.2005 - * Copyright: (c) Universitaet Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. +/* + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. * - * Performs SSA-Destruction. + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Performs SSA-Destruction. + * @author Daniel Grund + * @date 25.05.2005 + * @version $Id$ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -24,12 +42,14 @@ #include "be_t.h" #include "beutil.h" #include "bechordal_t.h" -#include "bearch.h" +#include "bearch_t.h" #include "belive_t.h" #include "benode_t.h" #include "besched_t.h" #include "benodesets.h" #include "bestatevent.h" +#include "beirg_t.h" +#include "beintlive_t.h" DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;) @@ -53,7 +73,7 @@ static void clear_link(ir_node *irn, void *data) { */ static void collect_phis_walker(ir_node *irn, void *data) { be_chordal_env_t *env = data; - if(is_Phi(irn) && chordal_has_class(env, irn)) { + if (is_Phi(irn) && chordal_has_class(env, irn)) { ir_node *bl = get_nodes_block(irn); set_irn_link(irn, get_irn_link(bl)); set_irn_link(bl, irn); @@ -79,12 +99,18 @@ static int cmp_perm_proj(const void *a, const void *b, size_t n) { return !(p->arg == q->arg); } +typedef struct insert_all_perms_env_t { + be_chordal_env_t *chordal_env; + pmap *perm_map; +} insert_all_perms_env_t; + /** * Insert Perms in all predecessors of a block containing a phi */ static void insert_all_perms_walker(ir_node *bl, void *data) { - be_chordal_env_t *chordal_env = data; - pmap *perm_map = chordal_env->data; + insert_all_perms_env_t *env = data; + be_chordal_env_t *chordal_env = env->chordal_env; + pmap *perm_map = env->perm_map; ir_graph *irg = chordal_env->irg; be_lv_t *lv = chordal_env->birg->lv; int i, n; @@ -195,7 +221,6 @@ static void insert_all_perms_walker(ir_node *bl, void *data) { */ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) { be_chordal_env_t *chordal_env = data; - be_lv_t *lv = chordal_env->birg->lv; ir_node *phi; /* Consider all phis of this block */ @@ -221,7 +246,7 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) { DBG((dbg, LEVEL_1, " for %+F(%s) -- %+F(%s)\n", phi, phi_reg->name, arg, arg_reg->name)); - if(values_interfere(lv, phi, arg)) { + if (values_interfere(chordal_env->birg, phi, arg)) { /* Insert a duplicate in arguments block, make it the new phi arg, @@ -337,17 +362,19 @@ static void set_regs_or_place_dupls_walker(ir_node *bl, void *data) { void be_ssa_destruction(be_chordal_env_t *chordal_env) { pmap *perm_map = pmap_create(); ir_graph *irg = chordal_env->irg; + insert_all_perms_env_t insert_perms_env; FIRM_DBG_REGISTER(dbg, "ir.be.ssadestr"); be_assure_liveness(chordal_env->birg); /* create a map for fast lookup of perms: block --> perm */ - chordal_env->data = perm_map; irg_walk_graph(irg, clear_link, collect_phis_walker, chordal_env); DBG((dbg, LEVEL_1, "Placing perms...\n")); - irg_block_walk_graph(irg, insert_all_perms_walker, NULL, chordal_env); + insert_perms_env.chordal_env = chordal_env; + insert_perms_env.perm_map = perm_map; + irg_block_walk_graph(irg, insert_all_perms_walker, NULL, &insert_perms_env); if (chordal_env->opts->dump_flags & BE_CH_DUMP_SSADESTR) be_dump(irg, "-ssa_destr_perms_placed", dump_ir_block_graph_sched);