added test whether loop invariant
authorGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Fri, 26 Nov 2004 14:21:18 +0000 (14:21 +0000)
committerGötz Lindenmaier <goetz@ipd.info.uni-karlsruhe.de>
Fri, 26 Nov 2004 14:21:18 +0000 (14:21 +0000)
[r4474]

ir/ana/irloop.h
ir/ana/irscc.c

index 8ea6e71..051c22d 100644 (file)
@@ -27,9 +27,7 @@
 # include "irgraph.h"
 # include "irnode.h"
 
-
-/* @@@ Interprocedural backedges ... ???? */
-
+/* ------------------------------------------------------------------- */
 /*
  * Backedge information.
  *
@@ -39,6 +37,7 @@
  * 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. */
 bool is_backedge (ir_node *n, int pos);
@@ -51,6 +50,7 @@ bool has_backedges (ir_node *n);
 /** Sets backedge information to zero. */
 void clear_backedges (ir_node *n);
 
+/* ------------------------------------------------------------------- */
 /**
  * The loops datastructure.
  *
@@ -67,6 +67,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 +119,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 +146,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_ */
index 0352589..6d24951 100644 (file)
@@ -1422,3 +1422,43 @@ void find_strange_loop_nodes(ir_loop *l) {
   if (found_problem) exit(0);
 
 }
+
+
+
+
+
+
+
+/* ------------------------------------------------------------------- */
+/* Simple analyses based on the loop information                       */
+/* ------------------------------------------------------------------- */
+
+int is_loop_variant(ir_loop *l, ir_loop *b) {
+  int i, n_elems =  get_loop_n_elements (l);
+
+  if (l == b) return true;
+
+  for (i = 0; i < n_elems; ++i) {
+    loop_element e = get_loop_element(l, i);
+    if (is_ir_node (e.kind)) {
+    } else {
+      if (is_loop_variant(e.son), b) return true;
+    }
+  }
+
+  return false;
+}
+
+/* Test whether a value is loop invariant.
+ *
+ * @param n      The node to be tested.
+ * @param block  A block node.  We pass the block, not the loop as we must
+ *               start off with a block loop to find all proper uses.
+ *
+ * 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) {
+  ir_loop *l = get_irn_loop(block);
+  ir_node *b = (is_Block(n)) ? n : get_nodes_block(n);
+  return !is_loop_variant(l, get_irn_loop(b));
+}