X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firloop_t.h;h=4a64334843b0cb29b2fab641b239979440c794ed;hb=ff0e8d7fcb34481652f0bf521ba04b1eca5e2106;hp=9797db619b571c01b1691130e541a0617b1a6509;hpb=de3ad6fcd245b88094f28f89284f2d62d4d50d3c;p=libfirm diff --git a/ir/ana/irloop_t.h b/ir/ana/irloop_t.h index 9797db619..4a6433484 100644 --- a/ir/ana/irloop_t.h +++ b/ir/ana/irloop_t.h @@ -1,26 +1,59 @@ -/* Copyright (C) 2002 by Universitaet Karlsruhe -* All rights reserved. -* -* Authors: Goetz Lindenmaier -* -* irloops_t.h: -*/ +/* + * Project: libFIRM + * File name: ir/ana/irloop_t.h + * Purpose: Loop datastructure and access functions -- private stuff. + * Author: Goetz Lindenmaier + * Modified by: + * Created: 7.2002 + * CVS-ID: $Id$ + * Copyright: (c) 2002-2003 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ -/* $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. */ + 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 */ + int depth; /**< Nesting depth */ + int n_sons; /**< Number of ir_nodes in array "children" */ + 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 ir_loop *outer_loop; /* The outer loop */ - struct ir_loop **sons; /* Inner loops */ - struct ir_node **nodes; /* Nodes in loop. */ - int depth; /* Nesting depth */ /* struct state_entry *mem_phis; struct state_entry *states; @@ -28,12 +61,73 @@ struct ir_loop { struct obset **oval; struct loop_node *link; */ +#ifdef DEBUG_libfirm + long loop_nr; /**< a unique node number for each loop node to make output + readable. */ + void *link; /**< GL @@@ For debugging the analyses. */ +#endif }; -static INLINE void -add_loop_son(ir_loop *loop, ir_loop *son); + +/** 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 -add_loop_node(ir_loop *loop, ir_node *n); +_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) #endif /* _IRLOOP_T_H_ */