extended functionality
[libfirm] / ir / ana / irloop.h
index 8ea6e71..ce55201 100644 (file)
@@ -27,9 +27,7 @@
 # include "irgraph.h"
 # include "irnode.h"
 
-
-/* @@@ Interprocedural backedges ... ???? */
-
+/* ------------------------------------------------------------------- */
 /*
  * Backedge information.
  *
  * 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 */
@@ -118,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. */
@@ -145,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_ */