X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firloop.h;h=ce552013cb108771a0f202f6e90b707ca8dd4280;hb=4bad1346ff2abc3923beea23e5ac949acc7ca514;hp=9dde7ce6b786fce1e6708d64bb3ec442bcd0b481;hpb=e5092bfad5d7e2406dfdf0aaee12e303ffb75ba6;p=libfirm diff --git a/ir/ana/irloop.h b/ir/ana/irloop.h index 9dde7ce6b..ce552013c 100644 --- a/ir/ana/irloop.h +++ b/ir/ana/irloop.h @@ -27,9 +27,7 @@ # include "irgraph.h" # include "irnode.h" - -/* @@@ Interprocedural backedges ... ???? */ - +/* ------------------------------------------------------------------- */ /* * Backedge information. * @@ -39,8 +37,11 @@ * The backedge information can only be used if the graph is not in * phase phase_building. */ +/* ------------------------------------------------------------------- */ /** Returns true if the predesessor pos is a backedge. */ +int is_inter_backedge(ir_node *n, int pos); +int is_intra_backedge(ir_node *n, int pos); bool is_backedge (ir_node *n, int pos); /** Remarks that edge pos is a backedge. */ void set_backedge (ir_node *n, int pos); @@ -51,6 +52,7 @@ bool has_backedges (ir_node *n); /** Sets backedge information to zero. */ void clear_backedges (ir_node *n); +/* ------------------------------------------------------------------- */ /** * The loops datastructure. * @@ -67,6 +69,7 @@ void clear_backedges (ir_node *n); * @todo We could add a field pointing from a node to the containing loop, * this would cost a lot of memory, though. */ +/* ------------------------------------------------------------------- */ typedef struct ir_loop ir_loop; /* Loop elements are loop nodes and ir nodes */ @@ -76,6 +79,9 @@ typedef union { ir_loop *son; /**< Pointer to an ir_loop element */ } loop_element; +int is_ir_loop(const void *thing); + +/** Set the outermost loop in ir graph as basic access to loop tree. */ void set_irg_loop(ir_graph *irg, ir_loop *l); ir_loop *get_irg_loop(ir_graph *irg); @@ -106,7 +112,8 @@ loop_element get_loop_element (ir_loop *loop, int pos); int get_loop_element_pos(ir_loop *loop, void *le); /** Returns a unique node number for the loop node to make output - readable. Casten pointer if libfirm_debug not set. */ + readable. If libfirm_debug is not set it returns the loop cast to + int. */ int get_loop_loop_nr(ir_loop *loop); /** A field to connect additional information to a loop. Only valid @@ -114,9 +121,9 @@ int get_loop_loop_nr(ir_loop *loop); void set_loop_link (ir_loop *loop, void *link); void *get_loop_link (const ir_loop *loop); -/* - * Constructing and destructing the loop/backedge information. - */ +/* ------------------------------------------------------------------- */ +/* Constructing and destructing the loop/backedge information. */ +/* ------------------------------------------------------------------- */ /** Constructs backedge information for irg in intraprocedural view. * @returns Maximal depth of loop tree. */ @@ -141,4 +148,21 @@ int construct_ip_cf_backedges (void); void free_loop_information(ir_graph *irg); void free_all_loop_information (void); + + + +/* ------------------------------------------------------------------- */ +/* Simple analyses based on the loop information */ +/* ------------------------------------------------------------------- */ + +/** Test whether a value is loop invariant. + * + * @param n The node to be tested. + * @param block A block node. + * + * Returns true, if the node n is not changed in the loop block + * belongs to or in inner loops of this block. */ +int is_loop_invariant(ir_node *n, ir_node *block); + + #endif /* _IRLOOP_H_ */