X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeutil.c;h=689f9f372f243760c204a538db160415321c35bc;hb=80a6158fdd766f42ee6c508a773bc114ff1b61f3;hp=42557a9f00726e46d1f9eccd22f0e332dcf0a530;hpb=0f9e388d0a008c3215229024b80897bdc9a6c4e9;p=libfirm diff --git a/ir/be/beutil.c b/ir/be/beutil.c index 42557a9f0..689f9f372 100644 --- a/ir/be/beutil.c +++ b/ir/be/beutil.c @@ -1,3 +1,8 @@ +/** + * Contains some useful function for the backend. + * @author Sebastian Hack + * @cvsid $Id$ + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -13,25 +18,28 @@ #include "ircons.h" #include "iropt.h" #include "irgopt.h" +#include "irtools.h" #include "irprintf.h" #include "beutil.h" #include "besched_t.h" #include "bearch.h" +/* Get an always empty set. */ pset *be_empty_set(void) { static pset *empty_set = NULL; if(!empty_set) - empty_set = pset_new_ptr_default(); + empty_set = pset_new_ptr(1); + assert(pset_count(empty_set) == 0); return empty_set; } struct dump_env { - FILE *f; - arch_env_t *env; + FILE *f; + arch_env_t *env; }; static void dump_allocated_block(ir_node *block, void *data) @@ -80,9 +88,9 @@ static void dump_allocated_block(ir_node *block, void *data) void dump_allocated_irg(arch_env_t *arch_env, ir_graph *irg, char *suffix) { char buf[1024]; - struct dump_env env; + struct dump_env env; - env.env = arch_env; + env.env = arch_env; ir_snprintf(buf, sizeof(buf), "%F-alloc%s.vcg", irg, suffix); @@ -94,40 +102,6 @@ void dump_allocated_irg(arch_env_t *arch_env, ir_graph *irg, char *suffix) } } -static void localize_const_walker(ir_node *irn, void *data) -{ - if(!is_Block(irn)) { - int i, n; - - for(i = 0, n = get_irn_arity(irn); i < n; ++i) { - ir_node *op = get_irn_n(irn, i); - if(get_irn_opcode(op) == iro_Const) { - ir_node *tgt_block, *cnst; - - /* Special treatment for phi nodes, because phi-usage is different */ - tgt_block = get_nodes_block(irn); - if(is_Phi(irn)) - tgt_block = get_nodes_block(get_irn_n(tgt_block, i)); - - /* - * We have to create the const node by ourselves, since the - * firmcons implementation always places it in the start block. - */ - cnst = new_ir_node(NULL, get_irn_irg(irn), - tgt_block, op_Const, get_irn_mode(op), 0, NULL); - cnst->attr.con.tv = get_Const_tarval(op); - set_irn_n(irn, i, cnst); - } - } - } -} - -void localize_consts(ir_graph *irg) -{ - irg_walk_graph(irg, localize_const_walker, NULL, NULL); - dead_node_elimination(irg); -} - /** * Edge hook to dump the schedule edges. */ @@ -179,16 +153,12 @@ void be_dump(ir_graph *irg, const char *suffix, void (*dumper)(ir_graph *, const } snprintf(buf, sizeof(buf), "-%02d%s", nr++, suffix); + buf[sizeof(buf) - 1] = '\0'; dumper(irg, buf); } -static void clear_link(ir_node *irn, void *data) -{ - set_irn_link(irn, NULL); -} - static void collect_phis(ir_node *irn, void *data) { if(is_Phi(irn)) { @@ -200,7 +170,7 @@ static void collect_phis(ir_node *irn, void *data) void be_clear_links(ir_graph *irg) { - irg_walk_graph(irg, clear_link, NULL, NULL); + irg_walk_graph(irg, firm_clear_link, NULL, NULL); } void be_collect_phis(ir_graph *irg) @@ -208,7 +178,18 @@ void be_collect_phis(ir_graph *irg) irg_walk_graph(irg, collect_phis, NULL, NULL); } +static void count_num_reachable_nodes(ir_node *irn, void *env) { + int *num = env; + (*num)++; +} + +unsigned get_num_reachable_nodes(ir_graph *irg) { + int num = 0; + irg_walk_graph(irg, count_num_reachable_nodes, NULL, &num); + return num; +} +/* FIXME: not used. can be deleted? */ ir_node *dom_up_search(pset *accept, ir_node *start_point_exclusive) { ir_node *irn, *idom; @@ -217,6 +198,9 @@ ir_node *dom_up_search(pset *accept, ir_node *start_point_exclusive) { if (pset_find_ptr(accept, irn)) return irn; + /* FIXME: This is obviously buggy: after the first recursive call idom is a block + and get_nodes_block will fail. + Moreover, why not a simple iteration instead of recursion */ idom = get_Block_idom(get_nodes_block(start_point_exclusive)); if (idom)