dec_irg_block_visited() added
[libfirm] / ir / ir / irgmod.h
index 513a011..55cdd53 100644 (file)
@@ -1,53 +1,73 @@
-/* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
-** All rights reserved.
-**
-** Authors: Martin Trapp, Christian Schaefer
-**
-** irgmod.h: ir graph modification*/
-
-# include "irgraph.h"
-# include "ircons.h"
-# include "array.h"
-# include "misc.h"
-
-/* ir_node *arg_access (ir_mode *mode, long proj); */
-
-
-inline ir_node *get_r_value_internal (ir_node *block, int pos, ir_mode *mode);
-
-
-/** Needed only during ir_graph construction. Should all go into
-    ircons.ch **/
-
-/* Read a store.
-   Use this function to get the most recent version of the store (type M).
-   Internally it does the same as get_value. */
-ir_node *get_store (void);
-
-/* write a store */
-void set_store (ir_node *store);
-
-/* add a control flow edge */
-void add_in_edge (ir_node *block, ir_node *jmp);
-
-/* read a value from the array with the local variables */
-ir_node *get_value (int pos, ir_mode *mode);
-
-/* write a value in the array with the local variables */
-void set_value (int pos, ir_node *value);
-
-/* fixes the number of predecessors of a block. */
-void mature_block (ir_node *block);
-
-/* sets current block */
-void switch_block (ir_node *target);
-
-
-/** always useful, e.g. for optimizations.  **/
-/* turns a node into a tuple. The tuples predecessors have to be
-   set by hand. */
+/*
+ * Project:     libFIRM
+ * File name:   ir/ir/irgmod.h
+ * Purpose:     Support for ir graph modification.
+ * Author:      Martin Trapp, Christian Schaefer
+ * Modified by: Goetz Lindenmaier
+ * Created:
+ * CVS-ID:      $Id$
+ * Copyright:   (c) 1998-2003 Universität Karlsruhe
+ * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ */
+
+/**
+ *
+ * @file irgmod.h
+ *
+ * ir graph modification.
+ *
+ * @author Martin Trapp, Christian Schaefer
+ */
+
+
+# ifndef _IRGMOD_H_
+# define _IRGMOD_H_
+
+# include "irnode.h"
+
+/** Exchanges two nodes by conserving edges leaving old (i.e.,
+   pointers pointing to old).  Turns the old node into an Id. */
+void exchange (ir_node *old, ir_node *nw);
+
+/** Turns a node into a "useless" Tuple.
+ *
+ *  Turns a node into a "useless" Tuple.  The Tuple node just forms a tuple
+ *  from several inputs.  The predecessors of the tuple have to be
+ *  set by hand.  The block predecessor automatically remains the same.
+ *  This is useful if a node returning a tuple is removed, but the Projs
+ *  extracting values from the tuple are not available.
+ *
+ *  @param node The node to be turned into a tuple.
+ *  @param arity The number of values formed into a Tuple.
+ */
 void turn_into_tuple (ir_node *node, int arity);
 
-/* exchanges two nodes by conserving edges leaving old (i.e., pointers
-   pointing to old. */
-inline void exchange (ir_node *old, ir_node *new);
+/** Walks over the passed ir graph and collects all Phi nodes as a
+  * list built with the link field in their corresponding block.
+  * Further it collects all Proj nodes in a list of the node producing
+  * the tuple. In case of nested tuples the Projs are collected in the
+  * node producing the outermost Tuple.
+  * All other link fields are cleared afterwards.
+  */
+void collect_phiprojs(ir_graph *irg);
+
+/** Parts a block into two.  This is useful to insert other blocks within a
+ *  given block.
+ *
+ * Adds a new block (new_block) in the control flow before the block
+ * (old_block) of node.  Moves node and its predecessors from old_block to
+ * new_block.  Moves all Projs that depend on moved nodes and are in old_block
+ * to new_block. Moves all Phi nodes from old_block to new_block.  To achieve
+ * this the routine assumes that all Phi nodes are in a list (using the link
+ * field) in the link field of old_block.  Further it assumes that all Proj nodes
+ * are accessible by the link field of the nodes producing the Tuple. This
+ * can be established by collect_phiprojs().  part_block conserves this property.
+ * Adds a Jmp node to new_block that jumps to old_block.
+ * Assumes that node is contained in current_ir_graph.  Sets current_block in
+ * this ir_graph to new_block.
+ *
+ * @param node   The node were to break the block
+ */
+void part_block(ir_node *node);
+
+#endif /* ifndef _IRGMOD_H_ */