X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbessadestrsimple.c;h=c7dbcf7da65a5e5b7bb34f091a24daf7806ecb8e;hb=c1fdf770d4d000dd5cf22daead32369342c5f5d1;hp=75c8afdec0c697604c1eca4b07e6489084d5d15a;hpb=b1ba3383b1807b7b506b394eb5b3e0992ad60f34;p=libfirm diff --git a/ir/be/bessadestrsimple.c b/ir/be/bessadestrsimple.c index 75c8afdec..c7dbcf7da 100644 --- a/ir/be/bessadestrsimple.c +++ b/ir/be/bessadestrsimple.c @@ -1,30 +1,36 @@ -/** - * Author: Daniel Grund - * Date: 17.01.2006 - * Copyright: (c) Universitaet Karlsruhe - * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. +/* + * Copyright (C) 1995-2008 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. + * + * 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 Simple SSA destruction. + * @author Daniel Grund + * @date 17.01.2006 + * @version $Id$ + */ +#ifdef NOT_PORTED -#ifdef HAVE_CONFIG_H #include "config.h" -#endif - -#ifdef HAVE_MALLOC_H - #include -#endif -#ifdef HAVE_ALLOCA_H - #include -#endif #include #include #include -#ifdef WITH_LIBCORE -#include -#include -#endif #include "set.h" #include "pset.h" @@ -39,9 +45,8 @@ #include "irdom_t.h" #include "phiclass.h" -#include "beraextern.h" #include "beabi.h" -#include "bearch.h" +#include "bearch_t.h" #include "benode_t.h" #include "beirgmod.h" #include "besched_t.h" @@ -54,15 +59,16 @@ #define DBG_LEVEL 2 typedef struct _ssa_destr_env_t { - ir_graph *irg; + ir_graph *irg; const arch_register_class_t *cls; - const arch_env_t *aenv; - set *vars; + set *vars; } ssa_destr_env_t; #define pset_foreach(pset, irn) for(irn=pset_first(pset); irn; irn=pset_next(pset)) #define set_foreach(set, e) for(e=set_first(set); e; e=set_next(set)) +static phi_classes_t *pc = NULL; + /****************************************************************************** __ __ _ ___ __ __ \ \ / / | | |__ \ \ \ / / @@ -131,14 +137,13 @@ pset *be_get_var_values(set *vars, int var_nr) { return vi->values; } -static INLINE ir_node *get_first_phi(pset *s) { - ir_node *irn; +static INLINE ir_node *get_first_phi(ir_node **s) { + int i; - pset_foreach(s, irn) - if (is_Phi(irn)) { - pset_break(s); - return irn; - } + for (i = ARR_LEN(s) - 1; i >= 0; --i) { + if (is_Phi(s[i])) + return s[i]; + } assert(0 && "There must be a phi in this"); return NULL; @@ -152,27 +157,31 @@ static INLINE ir_node *get_first_phi(pset *s) { */ static void values_to_vars(ir_node *irn, void *env) { ssa_destr_env_t *sde = env; - int nr; - pset *vals; + int nr, i, build_vals = 0; + ir_node **vals; - if(arch_get_irn_reg_class(sde->aenv, irn, -1) == NULL) + if (arch_get_irn_reg_class(irn, -1) == NULL) return; - vals = get_phi_class(irn); + vals = get_phi_class(pc, irn); if (vals) { nr = get_irn_node_nr(get_first_phi(vals)); } else { /* not a phi class member, value == var */ - nr = get_irn_node_nr(irn); - vals = pset_new_ptr(1); - pset_insert_ptr(vals, irn); + nr = get_irn_node_nr(irn); + vals = NEW_ARR_F(ir_node *, 1); + vals[0] = irn; + build_vals = 1; } /* values <--> var mapping */ - pset_foreach(vals, irn) { - be_var_add_value(sde->vars, nr, irn); + for (i = ARR_LEN(vals) - 1; i >= 0; --i) { + be_var_add_value(sde->vars, nr, vals[i]); } + + if (build_vals) + DEL_ARR_F(vals); } /****************************************************************************** @@ -196,7 +205,7 @@ static void values_to_vars(ir_node *irn, void *env) { * 1) Simplest case (phi with a non-phi arg): * A single copy is inserted. * - * 2) Phi chain (phi (with phi-arg)* with non=phi arg): + * 2) Phi chain (phi (with phi-arg)* with non-phi arg): * Several copies are placed, each after returning from recursion. * * 3) Phi-loop: @@ -228,7 +237,7 @@ static ir_node *insert_copies(ssa_destr_env_t *sde, const arch_register_class_t /* In case this is a 'normal' phi we insert at the * end of the pred block before cf nodes */ - last_cpy = sched_skip(pred_blk, 0, sched_skip_cf_predicator, sde->aenv); + last_cpy = sched_skip(pred_blk, 0, sched_skip_cf_predicator, NULL); last_cpy = sched_next(last_cpy); /* If we detect a loop stop recursion. */ @@ -285,28 +294,28 @@ static void ssa_destr_simple_walker(ir_node *blk, void *env) { if (!is_Phi(phi)) break; - if (arch_irn_is(sde->aenv, phi, ignore)) + if (arch_irn_is(phi, ignore)) continue; - cls = arch_get_irn_reg_class(sde->aenv, phi, -1); + cls = arch_get_irn_reg_class(phi, -1); insert_copies(sde, cls, phi, pos, phi); } } } -set *be_ssa_destr_simple(ir_graph *irg, const arch_env_t *aenv) { +set *be_ssa_destr_simple(ir_graph *irg) +{ ssa_destr_env_t sde; sde.irg = irg; - sde.aenv = aenv; sde.vars = new_set(compare_var_infos, 16); be_clear_links(irg); irg_block_walk_graph(irg, ssa_destr_simple_walker, NULL, &sde); /* Mapping of SSA-Values <--> Variables */ - phi_class_compute(irg); + pc = phi_class_new_from_irg(irg, 0); be_clear_links(irg); irg_walk_graph(irg, values_to_vars, NULL, &sde); @@ -321,4 +330,7 @@ void free_ssa_destr_simple(set *vars) del_pset(vi->values); del_set(vars); + phi_class_free(pc); } + +#endif /* NOT_PORTED */