X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedmris.c;h=61fdedc75569a73024396c1d8c5d38de33886a15;hb=dd4cd761ab637d4488c7e29f49843b1b02366acf;hp=b6e854bdd79eb03dcbb54da60a2697c548988733;hpb=4d5c3365a58cba59993045a9e08e686d8ae079a7;p=libfirm diff --git a/ir/be/beschedmris.c b/ir/be/beschedmris.c index b6e854bdd..61fdedc75 100644 --- a/ir/be/beschedmris.c +++ b/ir/be/beschedmris.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -18,12 +18,16 @@ */ /** + * @file + * @brief Implements a list scheduler for the MRIS algorithm. + * @author Sebastian Hack + * @date 04.04.2006 + * @version $Id$ + * * Implements a list scheduler for the MRIS algorithm in: * Govindarajan, Yang, Amaral, Zhang, Gao * Minimum Register Instruction Sequencing to Reduce Register Spills * in out-of-order issue superscalar architectures - * @author Sebastian Hack - * @date 04.04.2006 */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -43,17 +47,15 @@ #include "irgwalk.h" #include "irtools.h" #include "irbitset.h" - #include "height.h" #include "benode_t.h" #include "besched_t.h" #include "beschedmris.h" -#include "benodesets.h" #include "beirg.h" struct _mris_env_t { - ir_phase ph; + ir_phase ph; heights_t *heights; const arch_env_t *aenv; ir_graph *irg; @@ -77,16 +79,17 @@ typedef struct _mris_irn_t { #define get_mris_irn(env, irn) ((mris_irn_t *) phase_get_or_set_irn_data(&env->ph, irn)) #define foreach_lineage(env, pos, tmp) list_for_each_entry_safe(mris_irn_t, pos, tmp, &(env)->lineage_head, lineage_list) -static void *mris_irn_data_init(ir_phase *ph, ir_node *irn, void *data) +static void *mris_irn_data_init(ir_phase *ph, const ir_node *irn, void *data) { mris_irn_t *mi = data ? data : phase_alloc(ph, sizeof(mi[0])); + (void) irn; memset(mi, 0, sizeof(mi[0])); INIT_LIST_HEAD(&mi->lineage_list); return mi; } #if 0 -static int compute_height(mris_env_t *env, ir_node *irn, unsigned long visited) +static int compute_height(mris_env_t *env, ir_node *irn, ir_visited_t visited) { mris_irn_t *mi = get_mris_irn(env, irn); @@ -120,7 +123,7 @@ static int compute_height(mris_env_t *env, ir_node *irn, unsigned long visited) static void compute_heights(mris_env_t *env) { const ir_edge_t *edge; - unsigned long visited; + ir_visited_t visited; visited = get_irg_visited(env->irg) + 1; set_irg_visited(env->irg, visited); @@ -206,7 +209,7 @@ static ir_node *put_lowest_in_front(mris_env_t *env, ir_node **in) } #if 0 -static void reaches_walker(mris_env_t *env, ir_node *irn, ir_node *tgt, int *found, unsigned long visited) +static void reaches_walker(mris_env_t *env, ir_node *irn, ir_node *tgt, int *found, ir_visited_t visited) { if(get_irn_visited(irn) < visited && get_nodes_block(irn) == env->bl) { @@ -229,7 +232,7 @@ static void reaches_walker(mris_env_t *env, ir_node *irn, ir_node *tgt, int *fou static int reaches(mris_env_t *env, ir_node *src, ir_node *tgt) { int found = 0; - unsigned long visited = get_irg_visited(env->irg) + 1; + ir_visited_t visited = get_irg_visited(env->irg) + 1; set_irg_visited(env->irg, visited); reaches_walker(env, src, tgt, &found, visited); @@ -274,30 +277,32 @@ static void replace_tuple_by_repr_proj(mris_env_t *env, ir_node **in) static void lineage_formation(mris_env_t *env) { DEBUG_ONLY(firm_dbg_module_t *dbg = env->dbg); - nodeset *nodes = new_nodeset(128); + ir_nodeset_t nodes; + const ir_edge_t *edge; - const ir_edge_t *edge; + ir_nodeset_init(&nodes); foreach_out_edge(env->bl, edge) { ir_node *irn = get_edge_src_irn(edge); if(to_appear(env, irn)) - nodeset_insert(nodes, irn); + ir_nodeset_insert(&nodes, irn); } - while(nodeset_count(nodes) > 0) { + while(ir_nodeset_size(&nodes) > 0) { mris_irn_t *mi; - ir_node *irn; - ir_node *highest_node = NULL; - ir_node *lowest_desc = NULL; - ir_node *start; + ir_node *irn; + ir_node *highest_node = NULL; + ir_node *lowest_desc = NULL; + ir_node *start; mris_irn_t *start_mi; + ir_nodeset_iterator_t iter; ir_node **in; int recompute_height = 0; unsigned curr_height = 0; /* search the highest node which is not yet in a lineage. */ - for(irn = nodeset_first(nodes); irn; irn = nodeset_next(nodes)) { + foreach_ir_nodeset(&nodes, irn, iter) { unsigned height = get_irn_height(env->heights, irn); if(height > curr_height) { highest_node = irn; @@ -316,7 +321,7 @@ static void lineage_formation(mris_env_t *env) mi->lineage_next = NULL; mi->lineage_end = NULL; list_add(&mi->lineage_list, &env->lineage_head); - nodeset_remove(nodes, highest_node); + ir_nodeset_remove(&nodes, highest_node); /* put all descendants in an array. @@ -373,7 +378,7 @@ static void lineage_formation(mris_env_t *env) start_mi->lineage_end = lowest_desc; lowest_mi->lineage_start = start; - nodeset_remove(nodes, lowest_desc); + ir_nodeset_remove(&nodes, lowest_desc); } /* else we cannot extend this lineage, so break. */ @@ -392,6 +397,8 @@ static void lineage_formation(mris_env_t *env) if(recompute_height) heights_recompute(env->heights); } + + ir_nodeset_destroy(&nodes); } static int fuse_two_lineages(mris_env_t *env, mris_irn_t *u, mris_irn_t *v)