X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeutil.c;h=6e6abf2bba4bfe8c10a9d1a1bb67d437507588d5;hb=51d8477e3b9f11aa3d8f38ef386ab46a63b26a0b;hp=1637c4d2115408a5c59aa9f5db55959aff43aa2f;hpb=0dad8bfcc985ba41f200b5db21d8f1546ae901c2;p=libfirm diff --git a/ir/be/beutil.c b/ir/be/beutil.c index 1637c4d21..6e6abf2bb 100644 --- a/ir/be/beutil.c +++ b/ir/be/beutil.c @@ -38,18 +38,18 @@ #include "irgopt.h" #include "irtools.h" #include "irprintf.h" -#include "iredges.h" +#include "iredges_t.h" #include "beutil.h" -#include "besched_t.h" -#include "bearch_t.h" +#include "besched.h" +#include "bearch.h" /* Get an always empty set. */ pset *be_empty_set(void) { static pset *empty_set = NULL; - if(!empty_set) + if (!empty_set) empty_set = pset_new_ptr(1); assert(pset_count(empty_set) == 0); @@ -74,7 +74,8 @@ static int sched_edge_hook(FILE *F, ir_node *irn) return 1; } -void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix) { +void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix) +{ DUMP_NODE_EDGE_FUNC old = get_dump_node_edge_hook(); dump_consts_local(0); @@ -84,7 +85,8 @@ void dump_ir_block_graph_sched(ir_graph *irg, const char *suffix) { set_dump_node_edge_hook(old); } -void dump_ir_extblock_graph_sched(ir_graph *irg, const char *suffix) { +void dump_ir_extblock_graph_sched(ir_graph *irg, const char *suffix) +{ DUMP_NODE_EDGE_FUNC old = get_dump_node_edge_hook(); dump_consts_local(0); @@ -100,7 +102,8 @@ void dump_ir_extblock_graph_sched(ir_graph *irg, const char *suffix) { * @param suffix A suffix to its file name. * @param dumper The dump function */ -void be_dump(ir_graph *irg, const char *suffix, void (*dumper)(ir_graph *, const char *)) { +void be_dump(ir_graph *irg, const char *suffix, void (*dumper)(ir_graph *, const char *)) +{ static ir_graph *last_irg = NULL; static int nr = 0; char buf[128]; @@ -117,9 +120,7 @@ void be_dump(ir_graph *irg, const char *suffix, void (*dumper)(ir_graph *, const void be_clear_links(ir_graph *irg) { - ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK); irg_walk_graph(irg, firm_clear_link, NULL, NULL); - ir_free_resources(irg, IR_RESOURCE_IRN_LINK); } static void count_num_reachable_nodes(ir_node *irn, void *env) @@ -129,7 +130,8 @@ static void count_num_reachable_nodes(ir_node *irn, void *env) (void) irn; } -unsigned get_num_reachable_nodes(ir_graph *irg) { +unsigned get_num_reachable_nodes(ir_graph *irg) +{ int num = 0; irg_walk_graph(irg, count_num_reachable_nodes, NULL, &num); return num; @@ -138,7 +140,8 @@ unsigned get_num_reachable_nodes(ir_graph *irg) { /** * Gets the Proj with number pn from irn. */ -ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn) { +ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn) +{ const ir_edge_t *edge; ir_node *proj; assert(get_irn_mode(irn) == mode_T && "need mode_T"); @@ -153,7 +156,8 @@ ir_node *be_get_Proj_for_pn(const ir_node *irn, long pn) { return NULL; } -FILE *be_ffopen(const char *base, const char *ext, const char *mode) { +FILE *be_ffopen(const char *base, const char *ext, const char *mode) +{ FILE *out; char buf[1024]; @@ -165,3 +169,32 @@ FILE *be_ffopen(const char *base, const char *ext, const char *mode) { } return out; } + +static void add_to_postorder(ir_node *block, void *data) +{ + ir_node ***list = (ir_node***) data; + ARR_APP1(ir_node*, *list, block); +} + +ir_node **be_get_cfgpostorder(ir_graph *irg) +{ + ir_node **list = NEW_ARR_F(ir_node*, 0); + ir_node *end_block = get_irg_end_block(irg); + + /* end block may be unreachable in case of endless loops */ + if (get_Block_n_cfgpreds(end_block) == 0) + ARR_APP1(ir_node*, list, end_block); + + /* walk blocks */ + irg_block_edges_walk(get_irg_start_block(irg), NULL, add_to_postorder, + &list); + + return list; +} + +ir_node *get_first_block_succ(const ir_node *block) +{ + const ir_edge_t *edge = get_irn_out_edge_first_kind(block, EDGE_KIND_BLOCK); + assert(edge != NULL); + return get_edge_src_irn(edge); +}