X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firloop_t.h;h=4a64334843b0cb29b2fab641b239979440c794ed;hb=ff0e8d7fcb34481652f0bf521ba04b1eca5e2106;hp=a63603ed042d777b62e66abe36dbf25dda509c0f;hpb=fd4953d44b540a94242b66672e99aa12b0c377ff;p=libfirm diff --git a/ir/ana/irloop_t.h b/ir/ana/irloop_t.h index a63603ed0..4a6433484 100644 --- a/ir/ana/irloop_t.h +++ b/ir/ana/irloop_t.h @@ -11,30 +11,48 @@ */ /** -* @file irloop_t.h -* -* @author Goetz Lindenmaier -*/ - -/* $Id$ */ + * @file irloop_t.h + * Loop datastructure and access functions -- private stuff. + * + * @author Goetz Lindenmaier + */ #include "firm_common.h" +#include "irgraph_t.h" +#include "irnode_t.h" #include "irloop.h" #ifndef _IRLOOP_T_H_ #define _IRLOOP_T_H_ +/** + * Possible loop flags, can be or'ed. + */ +typedef enum loop_flags { + loop_is_count_loop = 0x00000001, /**< if set it's a counting loop */ + loop_downto_loop = 0x00000002, /**< if set, it's a downto loop, else an upto loop */ + loop_is_endless = 0x00000004, /**< if set, this is an endless loop */ + loop_is_dead = 0x00000008, /**< if set, it's a dead loop ie will never be entered */ + loop_wrap_around = 0x00000010, /**< this loop is NOT endless, because of wrap around */ + loop_end_false = 0x00000020, /**< this loop end can't be computed "from compute_loop_info.c" */ + do_loop = 0x00000040, /**< this is a do loop */ + once = 0x00000080, /**< this is a do loop, with a false condition.It itarate once */ +} loop_flags_t; + /** The loops datastructure. */ struct ir_loop { firm_kind kind; /**< A type tag, set to k_ir_loop. */ struct ir_loop *outer_loop; /**< The outer loop */ loop_element *children; /**< Mixed array: Contains sons and loop_nodes */ -/* struct ir_loop **sons; */ /**< Inner loops */ -/* struct ir_node **nodes; */ /**< Nodes in loop. */ int depth; /**< Nesting depth */ int n_sons; /**< Number of ir_nodes in array "children" */ - int n_nodes; /**< Number of loop_nodes in array "childern" */ + int n_nodes; /**< Number of loop_nodes in array "children" */ + unsigned flags; /**< a set of loop_flags_t */ + tarval *loop_iter_start; /**< counting loop: the start value */ + tarval *loop_iter_end; /**< counting loop: the last value reached */ + tarval *loop_iter_increment; /**< counting loop: the increment */ + ir_node *loop_iter_variable; /**< The iteration variable of counting loop.*/ /* struct state_entry *mem_phis; @@ -44,19 +62,72 @@ struct ir_loop { struct loop_node *link; */ #ifdef DEBUG_libfirm - int loop_nr; /**< a unique node number for each loop node to make output + long loop_nr; /**< a unique node number for each loop node to make output readable. */ - void *link; /**< GL @@@ For debuging the analyses. */ + void *link; /**< GL @@@ For debugging the analyses. */ #endif - }; -INLINE void -add_loop_son(ir_loop *loop, ir_loop *son); -INLINE void -add_loop_node(ir_loop *loop, ir_node *n); +/** Add a son loop to a father loop. */ +void add_loop_son(ir_loop *loop, ir_loop *son); + +/** Add a node to a loop. */ +void add_loop_node(ir_loop *loop, ir_node *n); + +/** Sets the loop a node belonging to. */ +void set_irn_loop(ir_node *n, ir_loop *loop); + +/* -------- INLINE functions -------- */ + +static INLINE int +_is_ir_loop(const void *thing) { + return (get_kind(thing) == k_ir_loop); +} + +static INLINE void +_set_irg_loop(ir_graph *irg, ir_loop *loop) { + assert(irg); + irg->loop = loop; +} + +static INLINE ir_loop * +_get_irg_loop(ir_graph *irg) { + assert(irg); + return irg->loop; +} + +static INLINE ir_loop * +_get_loop_outer_loop(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->outer_loop; +} + +static INLINE int +_get_loop_depth(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->depth; +} + +static INLINE int +_get_loop_n_sons(const ir_loop *loop) { + assert(_is_ir_loop(loop)); + return loop->n_sons; +} + +/* Uses temporary information to get the loop */ +static INLINE ir_loop * +_get_irn_loop(const ir_node *n) { + return n->loop; +} + + +#define is_ir_loop(thing) _is_ir_loop(thing) +#define set_irg_loop(irg, loop) _set_irg_loop(irg, loop) +#define get_irg_loop(irg) _get_irg_loop(irg) +#define get_loop_outer_loop(loop) _get_loop_outer_loop(loop) +#define get_loop_depth(loop) _get_loop_depth(loop) +#define get_loop_n_sons(loop) _get_loop_n_sons(loop) +#define get_irn_loop(n) _get_irn_loop(n) -/* The following functions are needed in ircfloop.c */ -void set_irn_loop (ir_node *n, ir_loop* loop); #endif /* _IRLOOP_T_H_ */