doxygen docu added
[libfirm] / ir / ir / irnode.h
index 58d5356..e999179 100644 (file)
@@ -105,9 +105,19 @@ void          set_irn_in            (ir_node *node, int arity, ir_node *in[]);
 /**
  * Get the n-th predecessor of a node.
  * This function removes Id predecessors.
+ * This function automatically handles intra- and interprocedural views.
  */
 ir_node      *get_irn_n             (const ir_node *node, int n);
+
+/**
+ * Get the n-th predecessor of a node in intraprocedural view.
+ * Can be used always if it's know that node is not a split one.
+ */
 ir_node      *get_irn_intra_n       (const ir_node *node, int n);
+
+/**
+ * Get the n-th predecessor of a node in interprocedural view.
+ */
 ir_node      *get_irn_inter_n       (const ir_node *node, int n);
 
 /** Replace the n-th predecessor of a node with a new one. */
@@ -132,6 +142,8 @@ opcode        get_irn_opcode        (const ir_node *node);
 const char   *get_irn_opname        (const ir_node *node);
 /** Get the ident for a string representation of the opcode. */
 ident        *get_irn_opident       (const ir_node *node);
+/** If arg is an argument of the node, returns it's position, -1 otherwise */
+int           get_irn_pred_pos      (ir_node *node, ir_node *arg);
 /** Gets the visited counter of a node. */
 unsigned long get_irn_visited (const ir_node *node);
 /** Sets the visited counter of a node. */
@@ -328,6 +340,9 @@ void add_End_keepalive (ir_node *end, ir_node *ka);
 /** Set the Keep alive node at position pos. */
 void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
 
+/** Set new keep-alives */
+void set_End_keepalives(ir_node *end, int n, ir_node *in[]);
+
 /** Some parts of the End node are allocated separately -- their memory
    is not recovered by dead_node_elimination if a End node is dead.
    free_End() frees these data structures. */
@@ -908,6 +923,10 @@ void     set_Confirm_bound (ir_node *node, ir_node *bound);
 pn_Cmp   get_Confirm_cmp   (ir_node *node);
 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp);
 
+/*
+ * Mux Support: Note that Psi nodes with one condition can be handled
+ * like Mux nodes, and the access functions work as expected.
+ */
 ir_node *get_Mux_sel   (ir_node *node);
 void     set_Mux_sel   (ir_node *node, ir_node *sel);
 ir_node *get_Mux_false (ir_node *node);
@@ -915,15 +934,23 @@ void     set_Mux_false (ir_node *node, ir_node *ir_false);
 ir_node *get_Mux_true  (ir_node *node);
 void     set_Mux_true  (ir_node *node, ir_node *ir_true);
 
+ir_node *get_Psi_cond   (ir_node *node, int pos);
+void     set_Psi_cond   (ir_node *node, int pos, ir_node *cond);
+ir_node *get_Psi_val    (ir_node *node, int pos);
+void     set_Psi_val    (ir_node *node, int pos, ir_node *val);
+ir_node *get_Psi_default(ir_node *node);
+void     set_Psi_default(ir_node *node, ir_node *val);
+int      get_Psi_n_conds(ir_node *node);
+
 /**
  * Projection numbers for result of CopyB node: use for Proj nodes!
  */
 typedef enum {
-  pn_CopyB_M_regular = pn_Call_M_regular, /**< The memory result. */
-  pn_CopyB_X_except  = pn_Call_X_except,  /**< The control flow result branching to the exception handler */
-  pn_CopyB_M_except  = pn_Call_M_except,  /**< The memory result in case the runtime function terminated with
+  pn_CopyB_M_regular = 0,  /**< The memory result. */
+  pn_CopyB_X_except  = 1,  /**< The control flow result branching to the exception handler */
+  pn_CopyB_M_except  = 2,  /**< The memory result in case the runtime function terminated with
                  an exception */
-  pn_CopyB_max       = pn_Call_max        /**< number of projections from a CopyB */
+  pn_CopyB_max       = 3   /**< number of projections from a CopyB */
 } pn_CopyB;   /* Projection numbers for CopyB. */
 #define pn_CopyB_M pn_CopyB_M_regular
 
@@ -961,9 +988,9 @@ void    set_InstOf_obj (ir_node *node, ir_node *obj);
  * Projection numbers for Raise.
  */
 typedef enum {
-  pn_Raise_M,    /**< Memory result.    */
-  pn_Raise_X,    /**< Execution result. */
-  pn_Raise_max   /**< number of projections from a Raise */
+  pn_Raise_X = 0,  /**< The control flow to the exception handler. */
+  pn_Raise_M = 1,  /**< The Memory result. */
+  pn_Raise_max     /**< number of projections from a Raise */
 } pn_Raise;  /* Projection numbers for Raise. */
 
 ir_node *get_Raise_mem (ir_node *node);
@@ -1029,8 +1056,16 @@ int      is_Bad    (const ir_node *node);
 int      is_no_Block (const ir_node *node);
 /** returns true if the node is a Block */
 int      is_Block (const ir_node *node);
-/** returns true if node is a Unknown node. */
+/** returns true if node is an Unknown node. */
 int      is_Unknown (const ir_node *node);
+/** returns true if node is a Return node. */
+int      is_Return (const ir_node *node);
+/** returns true if node is a Call node. */
+int      is_Call (const ir_node *node);
+/** returns true if node is a Sel node. */
+int      is_Sel (const ir_node *node);
+/** returns true if node is a Mux node or a Psi with only one condition. */
+int      is_Mux (const ir_node *node);
 /** returns true if node is a Proj node or a Filter node in
  * intraprocedural view */
 int      is_Proj (const ir_node *node);
@@ -1073,6 +1108,21 @@ int is_irn_constlike(const ir_node *node);
  */
 int is_irn_keep(const ir_node *node);
 
+/**
+ * Returns non-zero for nodes that are machine operations.
+ */
+int is_irn_machine_op(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that are machine operands.
+ */
+int is_irn_machine_operand(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that have the n'th user machine flag set.
+ */
+int is_irn_machine_user(const ir_node *node, unsigned n);
+
 /**
  * A type to express conditional jump predictions.
  */
@@ -1127,6 +1177,12 @@ unsigned register_additional_node_data(unsigned size);
  */
 void *get_irn_generic_attr(ir_node *node);
 
+/**
+ * Returns the unique node index for the node in its graph.
+ * This index is used to access phase information for this node.
+ */
+unsigned get_irn_idx(const ir_node *node);
+
 /*-----------------------------------------------------------------*/
 /** Debug aides                                                   **/
 /*-----------------------------------------------------------------*/