X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firloop.c;h=1722d48034b7b8330c07a2f84c66b5225db68683;hb=ebdaa596d904a0651c8d794481288d2d629bdb3a;hp=f1774a4fcfe60596b995ab3445734472fce860db;hpb=097df59b4c98c50ad57e39c77b46638adfc55bb4;p=libfirm diff --git a/ir/ana/irloop.c b/ir/ana/irloop.c index f1774a4fc..1722d4803 100644 --- a/ir/ana/irloop.c +++ b/ir/ana/irloop.c @@ -24,16 +24,10 @@ * @date 7.2002 * @version $Id: irloop_t.h 17143 2008-01-02 20:56:33Z beck $ */ -#ifdef HAVE_CONFIG_H # include "config.h" -#endif -#ifdef HAVE_STRING_H -# include -#endif -#ifdef HAVE_STDLIB_H -# include -#endif +#include +#include #include "irloop_t.h" #include "irprog_t.h" @@ -45,19 +39,30 @@ void add_loop_son(ir_loop *loop, ir_loop *son) { lson.son = son; ARR_APP1(loop_element, loop->children, lson); ++loop->n_sons; + loop->flags |= loop_outer_loop; } void add_loop_node(ir_loop *loop, ir_node *n) { loop_element ln; ln.node = n; assert(loop && loop->kind == k_ir_loop); - assert(get_kind(n) == k_ir_node || get_kind(n) == k_ir_graph); /* used in callgraph.c */ + ARR_APP1(loop_element, loop->children, ln); + loop->n_nodes++; +} + +void add_loop_irg(ir_loop *loop, ir_graph *irg) { + loop_element ln; + ln.irg = irg; + assert(loop && loop->kind == k_ir_loop); ARR_APP1(loop_element, loop->children, ln); loop->n_nodes++; } /** * Mature all loops by removing the flexible arrays of a loop. + * + * @param loop the loop to mature + * @param obst an obstack, where the new arrays are allocated on */ void mature_loops(ir_loop *loop, struct obstack *obst) { loop_element *new_children = DUP_ARR_D(loop_element, obst, loop->children); @@ -111,7 +116,7 @@ ir_loop *get_loop_son(ir_loop *loop, int pos) { } /* Returns the number of nodes in the loop */ -int get_loop_n_nodes(ir_loop *loop) { +int get_loop_n_nodes(const ir_loop *loop) { assert(loop); assert(loop->kind == k_ir_loop); return loop->n_nodes; } @@ -119,7 +124,7 @@ int get_loop_n_nodes(ir_loop *loop) { /* Returns the pos'th ir_node-child * * TODO: This method isn't very efficient ! * * Returns NULL if there isn't a pos'th ir_node */ -ir_node *get_loop_node(ir_loop *loop, int pos) { +ir_node *get_loop_node(const ir_loop *loop, int pos) { int child_nr, node_nr = -1; assert(loop && loop->kind == k_ir_loop); @@ -172,7 +177,6 @@ void set_irn_loop(ir_node *n, ir_loop *loop) { n->loop = loop; } -/* Uses temporary information to get the loop */ ir_loop *(get_irn_loop)(const ir_node *n) { return _get_irn_loop(n); } @@ -186,8 +190,6 @@ int get_loop_loop_nr(const ir_loop *loop) { #endif } -/** A field to connect additional information to a loop. Only valid - if libfirm_debug is set. */ void set_loop_link(ir_loop *loop, void *link) { assert(loop && loop->kind == k_ir_loop); loop->link = link; @@ -207,7 +209,7 @@ void (set_irg_loop)(ir_graph *irg, ir_loop *loop) { } /* Returns the root loop info (if exists) for an irg. */ -ir_loop *(get_irg_loop)(ir_graph *irg) { +ir_loop *(get_irg_loop)(const ir_graph *irg) { return _get_irg_loop(irg); } @@ -218,8 +220,7 @@ ir_loop *(get_irg_loop)(ir_graph *irg) { ir_loop *alloc_loop(ir_loop *father, struct obstack *obst) { ir_loop *son; - son = obstack_alloc(obst, sizeof(*son)); - memset(son, 0, sizeof(*son)); + son = OALLOCZ(obst, ir_loop); son->kind = k_ir_loop; son->children = NEW_ARR_F(loop_element, 0); son->n_nodes = 0;