# 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);
/** Sets backedge information to zero. */
void clear_backedges (ir_node *n);
+/* ------------------------------------------------------------------- */
/**
* The loops datastructure.
*
* @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 */
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. */
+ * @returns Maximal depth of loop tree.
+ *
+ * ATTENTION:
+ * One assumes, the Phi nodes in a block with a backedge have backedges
+ * at the same positions as the block. This is not the case, as
+ * the scc algorithms does not respect the program semantics in this case.
+ * Take a swap in a loop (t = i; i = j; j = t;) This results in two Phi
+ * nodes. They form a cycle. Once the scc algorithm deleted one of the
+ * edges, the cycle is removed. The second Phi node does not get a
+ * backedge!
+ */
/* @@@ Well, maybe construct_loop_information or analyze_loops ? */
int construct_backedges(ir_graph *irg);
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_ */