more
[libfirm] / ir / ir / ircons.h
index 8561bd8..1dd7151 100644 (file)
  *
  *    For extensive documentation of FIRM see UKA Techreport 1999-14.
  *
- *    =========
- *
- *    The struct ir_graph
- *    -------------------
- *
- *      This struct contains all information about a procedure.
- *      It's allocated directly to memory.
- *
- *      The fields of ir_graph:
- *
- *      *ent             The entity describing this procedure.
- *
- *      The beginning and end of a graph:
- *
- *      *start_block     This ir_node is the block that contains the unique
- *                       start node of the procedure.  With it it contains
- *                       the Proj's on starts results.
- *                       Further all Const nodes are placed in the start block.
- *      *start           This ir_node is the unique start node of the procedure.
- *
- *      *end_block       This ir_node is the block that contains the unique
- *                       end node of the procedure.  This block contains no
- *                       further nodes.
- *      *end             This ir_node is the unique end node of the procedure.
- *
- *      The following nodes are Projs from the start node, held in ir_graph for
- *      simple access:
- *
- *      *frame           The ir_node producing the pointer to the stack frame of
- *                       the procedure as output.  This is the Proj node on the
- *                       third output of the start node.  This output of the start
- *                      node is tagged as pns_frame_base.  In FIRM most lokal
- *                       variables are modeled as data flow edges.  Static
- *                       allocated arrays can not be represented as dataflow
- *                       edges. Therefore FIRM has to represent them in the stack
- *                       frame.
- *
- *      *globals         This models a pointer to a space in the memory where
- *               _all_ global things are held.  Select from this pointer
- *               with a Sel node the pointer to a global variable /
- *               procedure / compiler known function... .
- *
- *      *args        The ir_node that produces the arguments of the method as
- *               it's result.  This is a Proj node on the fourth output of
- *               the start node.  This output is tagged as pn_Start_T_args.
- *
- *      *bad             The bad node is an auxiliary node. It is needed only once,
- *                       so there is this globally reachable node.
- *
- *      Datastructures that are private to a graph:
- *
- *      *obst            An obstack that contains all nodes.
- *
- *      *current_block   A pointer to the current block.  Any node created with
- *                       one of the node constructors (new_<opcode>) are assigned
- *                       to this block.  It can be set with set_cur_block(block).
- *                       Only needed for ir construction.
- *
- *      params/n_loc     An int giving the number of local variables in this
- *               procedure.  This is neede for ir construction. Name will
- *               be changed.
- *
- *      *value_table     This hash table (pset) is used for global value numbering
- *               for optimizing use in iropt.c.
- *
- *      *Phi_in_stack;   a stack needed for automatic Phi construction, needed only
- *               during ir construction.
- *
- *      visited          A int used as flag to traverse the ir_graph.
- *
- *      block_visited    A int used as a flag to traverse block nodes in the graph.
  *
  *    Three kinds of nodes
  *    --------------------
  *
  *    This library supplies several interfaces to construct a FIRM graph for
  *    a program:
- *    * A "comfortable" interface generating SSA automatically.  Automatically
+ *    - A "comfortable" interface generating SSA automatically.  Automatically
  *      computed predecessors of nodes need not be specified in the constructors.
  *      (new_<Node> constructurs and a set of additional routines.)
- *    * A less comfortable interface where all predecessors except the block
+ *    - A less comfortable interface where all predecessors except the block
  *      an operation belongs to need to be specified.  SSA must be constructed
  *      by hand.  (new_<Node> constructors and set_cur_block()).  This interface
  *      is called "block oriented".  It automatically calles the local optimizations
  *      for each new node.
- *    * An even less comfortable interface where the block needs to be specified
+ *    - An even less comfortable interface where the block needs to be specified
  *      explicitly.  This is called the "raw" interface. (new_r_<Node>
  *      constructors).  These nodes are not optimized.
  *
  *    ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
  *                         where_alloc where);
  *    ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
- *               type *free_type);
+ *               type *free_type, where_alloc where);
  *    ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj);
  *    ir_node *new_NoMem  (void);
+ *    ir_node *new_Mux    (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
  *
  *    void add_immBlock_pred (ir_node *block, ir_node *jmp);
  *    void mature_immBlock (ir_node *block);
  *    The block can be completed by mature_immBlock(block) if all predecessors are
  *    known.  If several blocks are built at once, mature_immBlock can only be called
  *    after set_value has been called for all values that are life at the end
- *    of the block.  This is necessary so that Phi nodes created mature_immBlock *    get the right predecessors in case of cyclic dependencies.  If all set_values
+ *    of the block.  This is necessary so that Phi nodes created mature_immBlock
+ *    get the right predecessors in case of cyclic dependencies.  If all set_values
  *    of this block are called after maturing it and before calling get_value
  *    in some block that is control flow dependent on this block, the construction
  *    is correct.
  *    later) optimizations are skipped.  This is necessary to
  *    construct Blocks in loops.  Leaving Unknown in the Block after finishing
  *    the construction may have strange effects, especially for interprocedural
- *    representation and analyses.
+ *    representation and analysis.
  *
  *
  *    CONTROL FLOW OPERATIONS
  *      attr.con   A tarval* pointer to the proper entry in the constant
  *                 table.
  *
- *    ir_node *new_SymConst (type *tp, symconst_addr_ent kind)
- *    ------------------------------------------------------------
+ *    ir_node *new_SymConst (union symconst_symbol value, symconst_addr_ent kind)
+ *    ---------------------------------------------------------------------------
  *
  *    There are three kinds of symbolic constants:
  *     symconst_type_tag  The symbolic constant represents a type tag.
  *                variable.
  *    To represent a pointer to an entity that is represented by an entity
  *    datastructure don't use
- *      new_SymConst((type_or_id*)get_entity_ld_ident(ent), linkage_ptr_info);.
+ *      new_SymConst((type_or_id*)get_entity_ld_ident(ent), symconst_addr_name);.
  *    Use a real const instead:
- *      new_Const(mode_P_mach, tarval_p_from_entity(ent));
+ *      new_SymConst(mode_P_mach, tarval_p_from_entity(ent));
  *    This makes the Constant independent of name changes of the entity due to
  *    mangling.
  *
  *                      ------------
  *
  *    Selects a field from an array type.  The entity has as owner the array, as
- *    type the arrays element type.  The indexes to access an array element are
+ *    type the arrays element type.  The indices to access an array element are
  *    given also.
  *
  *    Parameters:
  *      *store     The memory in which the object the entity should be selected from
  *                 is allocated.
  *      *frame     The pointer to the object.
- *      *arity     number of array indexes.
+ *      *arity     number of array indices.
  *      *in        array with index inputs to the node.
  *      *sel       The entity to select.
  *
  *    ir_node *new_Minus (ir_node *op, ir_mode *mode)
  *    -----------------------------------------------
  *
- *    Unary Minus operations on floating point values.
+ *    Unary Minus operations on integer and floating point values.
  *
  *    ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode)
  *    ------------------------------------------------------------
  *    Output:
  *      A 16-tuple containing the results of the 16 different comparisons.
  *      The following is a list giving the comparisons and a projection
- *      number (pnc_number) to use in Proj nodes to extract the proper result.
- *        False     false
- *        Eq        equal
- *        Lt    less
- *        Le    less or equal
- *        Gt    greater
- *        Ge    greater of equal
- *        Lg    less or greater
- *        Leg   less, equal or greater = ordered
- *        Uo    unordered
- *        Ue    unordered or equal
- *        Ul    unordered or less
- *        Ule   unordered, less or equal
- *        Ug    unordered or greater
- *        Uge   unordered, greater or equal
- *        Ne    unordered, less or greater = not equal
- *        True  true
+ *      number (pn_Cmp) to use in Proj nodes to extract the proper result.
+ *        pn_Cmp_False false
+ *        pn_Cmp_Eq    equal
+ *        pn_Cmp_Lt    less
+ *        pn_Cmp_Le    less or equal
+ *        pn_Cmp_Gt    greater
+ *        pn_Cmp_Ge    greater of equal
+ *        pn_Cmp_Lg    less or greater
+ *        pn_Cmp_Leg   less, equal or greater = ordered
+ *        pn_Cmp_Uo    unordered
+ *        pn_Cmp_Ue    unordered or equal
+ *        pn_Cmp_Ul    unordered or less
+ *        pn_Cmp_Ule   unordered, less or equal
+ *        pn_Cmp_Ug    unordered or greater
+ *        pn_Cmp_Uge   unordered, greater or equal
+ *        pn_Cmp_Ne    unordered, less or greater = not equal
+ *        pn_Cmp_True  true
  *
  *
  *
  *    later) optimizations are skipped.  This is necessary to
  *    construct Phi nodes in loops.  Leaving Unknown in the Phi after finishing
  *    the construction may have strange effects, especially for interprocedural
- *    representation and analyses.
+ *    representation and analysis.
  *
  *    Parameter
  *      arity            number of predecessors
  *    Output
  *      The definition valid in this block.
  *
+ *    ir_node *new_Mux (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode)
+ *    -----------------------------------------------------------------------------
+ *
+ *    Creates a Mux node. This node implements the following semantic:
+ *    If the sel node (which must be of mode_b) evaluates to true, its value is
+ *    ir_true, else ir_false;
+ *
  *
  *    OPERATIONS TO MANAGE MEMORY EXPLICITLY
  *    --------------------------------------
  *      a.*type          A pointer to the class the allocated data object
  *                       belongs to.
  *
- *    ir_node *new_Free (ir_node *store, ir_node *ptr, type *free_type)
- *    ------------------------------------------------------------------
+ *    ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size, type *free_type,
+ *    --------------------------------------------------------------------------------
+ *                        where_alloc where)
+ *                        ------------------
  *
  *    The Free node frees memory of the given variable.
  *
  *      *ptr         The pointer to the object to free.
  *      *size        The number of objects of type free_type to free in a sequence.
  *      *free_type   The type of the freed variable.
+ *      where        Where the variable was allocated, either heap_alloc or stack_alloc.
  *
  *    Inputs:
  *      A memory, a pointer and an unsigned integer.
  *    unifying the memories with a preceding Sync operation.
  *
  *    Parameters
- *      arity    The number of memories to syncronize.
+ *      arity    The number of memories to synchronize.
  *      **in     An array of pointers to nodes that produce an output of
  *               type memory.
  *    Inputs
  *
  *    There are two special routines for the global store:
  *
- *    inline void set_store (ir_node *store)
- *    --------------------------------------
+ *    void set_store (ir_node *store)
+ *    -------------------------------
  *
  *    Adds the store to the array of known values at a reserved
  *    position.
  *    Requires current_block to be set correctly.
  *
- *    inline ir_node *get_store (void)
- *    --------------------------------
+ *    ir_node *get_store (void)
+ *    -------------------------
  *
  *    Returns the node defining the actual store.
  *    Requires current_block to be set correctly.
@@ -1206,7 +1147,7 @@ ir_node *new_rd_Raise  (dbg_info *db, ir_graph *irg, ir_node *block,
  * @param *db    A pointer for debug information.
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
- * @param *mode  The mode of the operands and redults.
+ * @param *mode  The mode of the operands and results.
  * @param *con   Points to an entry in the constant table.
  * @param *tp    The type of the constant.
  */
@@ -1222,7 +1163,7 @@ ir_node *new_rd_Const_type (dbg_info* db, ir_graph *irg, ir_node *block,
  * @param *db    A pointer for debug information.
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
- * @param *mode  The mode of the operands and redults.
+ * @param *mode  The mode of the operands and results.
  * @param *con   Points to an entry in the constant table.
  */
 ir_node *new_rd_Const  (dbg_info *db, ir_graph *irg, ir_node *block,
@@ -1272,28 +1213,28 @@ ir_node *new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block,
  *
  * Same as new_rd_SymConst_type, except that the constructor is tailored for
  * symconst_addr_ent.
- * Adds the symconst to the start block of irg. */
+ * Adds the SymConst to the start block of irg. */
 ir_node *new_rd_SymConst_addr_ent (dbg_info *db, ir_graph *irg, entity *symbol, type *tp);
 
 /** Constructor for a SymConst addr_name node.
  *
  * Same as new_rd_SymConst_type, except that the constructor is tailored for
  * symconst_addr_ent.
- * Adds the symconst to the start block of irg. */
+ * Adds the SymConst to the start block of irg. */
 ir_node *new_rd_SymConst_addr_name (dbg_info *db, ir_graph *irg, ident *symbol, type *tp);
 
 /** Constructor for a SymConst type_tag node.
  *
  * Same as new_rd_SymConst_type, except that the constructor is tailored for
  * symconst_addr_ent.
- * Adds the symconst to the start block of irg. */
+ * Adds the SymConst to the start block of irg. */
 ir_node *new_rd_SymConst_type_tag (dbg_info *db, ir_graph *irg, type *symbol, type *tp);
 
 /** Constructor for a SymConst size node.
  *
  * Same as new_rd_SymConst_type, except that the constructor is tailored for
  * symconst_addr_ent.
- * Adds the symconst to the start block of irg. */
+ * Adds the SymConst to the start block of irg. */
 ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *tp);
 
 /** Constructor for a Sel node.
@@ -1302,7 +1243,7 @@ ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *
  * with a compound type.  It explicitly specifies the entity selected.
  * Dynamically the node may select entities that overwrite the given
  * entity.  If the selected entity is an array element entity the Sel
- * node takes the required array indicees as inputs.
+ * node takes the required array indices as inputs.
  *
  * @param   *db        A pointer for debug information.
  * @param   *irg       The ir graph the node  belongs to.
@@ -1311,8 +1252,8 @@ ir_node *new_rd_SymConst_size (dbg_info *db, ir_graph *irg, type *symbol, type *
  *                     from is allocated.
  * @param   *objptr    A pointer to a compound entity the Sel operation selects a
  *                     single attribute from.
- * @param   *n_index   The number of array indicees needed to select an array element entity.
- * @param   *index[]   If the compound entity is an array the indicees of the selected
+ * @param   *n_index   The number of array indices needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indices of the selected
  *                     element entity.  The constructor copies this array.
  * @param   *ent       The entity to select.
  */
@@ -1649,9 +1590,10 @@ ir_node *new_rd_Alloc  (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *st
  * @param *ptr        The pointer to the object to free.
  * @param *size       The number of objects of type free_type to free in a sequence.
  * @param *free_type  The type of the freed variable.
+ * @param where       Where the variable was allocated, either heap_alloc or stack_alloc.
  */
 ir_node *new_rd_Free   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
-                       ir_node *ptr, ir_node *size, type *free_type);
+                       ir_node *ptr, ir_node *size, type *free_type, where_alloc where);
 
 /** Constructor for a Sync node.
  *
@@ -1662,7 +1604,7 @@ ir_node *new_rd_Free   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *st
  * @param *db       A pointer for debug information.
  * @param *irg      The ir graph the node  belongs to.
  * @param *block    The ir block the node belongs to.
- * @param  arity    The number of memories to syncronize.
+ * @param  arity    The number of memories to synchronize.
  * @param  *in[]    An array of pointers to nodes that produce an output of type
  *                  memory.  The constructor copies this array.
  */
@@ -1673,7 +1615,7 @@ ir_node *new_rd_Sync   (dbg_info *db, ir_graph *irg, ir_node *block, int arity,
  * Projects a single value out of a tuple.  The parameter proj gives the
  * position of the value within the tuple.
  *
- * @param *db    A pointer for deubugginformation.
+ * @param *db    A pointer for debug information.
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
  * @param arg    A node producing a tuple.  The node must have mode_T.
@@ -1805,6 +1747,7 @@ ir_node *new_rd_EndExcept(dbg_info *db, ir_graph *irg, ir_node *block);
  *
  * The constructor builds the Filter in intraprocedural view.
  *
+ * @param *db     A pointer for debug information.
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
  * @param *arg  The tuple value to project from.
@@ -1823,6 +1766,21 @@ ir_node *new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *ar
  */
 ir_node *new_rd_NoMem  (ir_graph *irg);
 
+/** Constructor for a Mux node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *db       A pointer for debug information.
+ * @param *irg      The ir graph the node belong to.
+ * @param *block    The block the node belong to.
+ * @param *sel      The ir_node that calculates the boolean select.
+ * @param *ir_true  The ir_node that calculates the true result.
+ * @param *ir_false The ir_node that calculates the false result.
+ * @param *mode     The mode of the node (and it_true and ir_false).
+ */
+ir_node *new_rd_Mux  (dbg_info *db, ir_graph *irg, ir_node *block,
+    ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
+
 /*-------------------------------------------------------------------------*/
 /* The raw interface without debug support                                 */
 /*-------------------------------------------------------------------------*/
@@ -1889,7 +1847,7 @@ ir_node *new_r_Cond   (ir_graph *irg, ir_node *block, ir_node *c);
  * @param *irg   The ir graph the node  belongs to.
  * @param *block The ir block the node belongs to.
  * @param *store The state of memory.
- * @param arity  Number of array indexes.
+ * @param arity  Number of array indices.
  * @param *in[]   Array with index inputs to the node. The constructor copies this array.
  */
 ir_node *new_r_Return (ir_graph *irg, ir_node *block,
@@ -1919,6 +1877,20 @@ ir_node *new_r_Raise  (ir_graph *irg, ir_node *block,
 ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
                       ir_mode *mode, tarval *con);
 
+/** Constructor for a Const node.
+ *
+ * Constructor for a Const node. The constant represents a target
+ * value.  Sets the type information to type_unknown.  (No more
+ * supported: If tv is entity derives a somehow useful type.)
+ *
+ * @param *irg   The ir graph the node  belongs to.
+ * @param *block The ir block the node belongs to.
+ * @param *mode  The mode of the operands and the results.
+ * @param value  A value from which the tarval is made.
+ */
+ir_node *new_r_Const_long(ir_graph *irg, ir_node *block,
+                      ir_mode *mode, long value);
+
 /** Constructor for a SymConst node.
  *
  *  This is the constructor for a symbolic constant.
@@ -1942,7 +1914,7 @@ ir_node *new_r_Const  (ir_graph *irg, ir_node *block,
  *
  * @param *irg    The ir graph the node  belongs to.
  * @param *block  The ir block the node belongs to.
- * @param volue   A type, entity or a ident depending on the SymConst kind.
+ * @param value   A type, entity or a ident depending on the SymConst kind.
  * @param symkind The kind of the symbolic constant: type_tag, size or link_info.
  */
 ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
@@ -1954,7 +1926,7 @@ ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
  * with a compound type.  It explicitly specifies the entity selected.
  * Dynamically the node may select entities that overwrite the given
  * entity.  If the selected entity is an array element entity the Sel
- * node takes the required array indicees as inputs.
+ * node takes the required array indices as inputs.
  *
  * @param   *irg       The ir graph the node  belongs to.
  * @param   *block     The ir block the node belongs to.
@@ -1962,8 +1934,8 @@ ir_node *new_r_SymConst (ir_graph *irg, ir_node *block,
  *                     from is allocated.
  * @param   *objptr    A pointer to a compound entity the Sel operation selects a
  *                     single attribute from.
- * @param   *n_index   The number of array indicees needed to select an array element entity.
- * @param   *index[]   If the compound entity is an array the indicees of the selected
+ * @param   *n_index   The number of array indices needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indices of the selected
  *                     element entity.  The constructor copies this array.
  * @param   *ent       The entity to select.
  */
@@ -2274,9 +2246,10 @@ ir_node *new_r_Alloc  (ir_graph *irg, ir_node *block, ir_node *store,
  * @param *ptr        The pointer to the object to free.
  * @param *size       The number of objects of type free_type to free in a sequence.
  * @param *free_type  The type of the freed variable.
+ * @param where       Where the variable was allocated, either heap_alloc or stack_alloc.
  */
 ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
-               ir_node *ptr, ir_node *size, type *free_type);
+               ir_node *ptr, ir_node *size, type *free_type, where_alloc where);
 
 /** Constructor for a  Sync node.
  *
@@ -2286,7 +2259,7 @@ ir_node *new_r_Free   (ir_graph *irg, ir_node *block, ir_node *store,
  *
  * @param *irg      The ir graph the node  belongs to.
  * @param *block    The ir block the node belongs to.
- * @param  arity    The number of memories to syncronize.
+ * @param  arity    The number of memories to synchronize.
  * @param  *in[]    An array of pointers to nodes that produce an output of  type memory.
  *                  The constructor copies this array.
  */
@@ -2375,7 +2348,7 @@ ir_node *new_r_Confirm (ir_graph *irg, ir_node *block,
 
 /** Constructor for a Unknown node.
  *
- * Represents an arbtrary valus.  Places the node in
+ * Represents an arbitrary value.  Places the node in
  * the start block.
  *
  * @param *irg    The ir graph the node  belongs to.
@@ -2392,7 +2365,7 @@ ir_node *new_r_Unknown(ir_graph *irg, ir_mode *m);
  *
  * @param *irg    The ir graph the node belong to.
  * @param *block  The block the node belong to.
- * @param *callee The call node bisible in the  intra procedural view.
+ * @param *callee The call node visible in the  intra procedural view.
  */
 ir_node *new_r_CallBegin(ir_graph *irg, ir_node *block, ir_node *callee);
 
@@ -2455,6 +2428,20 @@ ir_node *new_r_Filter (ir_graph *irg, ir_node *block, ir_node *arg,
  */
 ir_node *new_r_NoMem  (ir_graph *irg);
 
+/** Constructor for a Mux node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *irg      The ir graph the node belong to.
+ * @param *block    The block the node belong to.
+ * @param *sel      The ir_node that calculates the boolean select.
+ * @param *ir_true  The ir_node that calculates the true result.
+ * @param *ir_false The ir_node that calculates the false result.
+ * @param *mode     The mode of the node (and it_true and ir_false).
+ */
+ir_node *new_r_Mux  (ir_graph *irg, ir_node *block,
+    ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
+
 /*-----------------------------------------------------------------------*/
 /* The block oriented interface                                          */
 /*-----------------------------------------------------------------------*/
@@ -2481,7 +2468,7 @@ ir_node *get_cur_block(void);
  * with a fixed number of predecessors.  Does set current_block.  Can
  * be used with automatic Phi node construction.
  *
- * @param *db    A Pointer for  debugginfomation.
+ * @param *db    A Pointer for debug information.
  * @param arity  The number of control predecessors.
  * @param in[]   An array of control predecessors.  The length of
  *               the array must be 'arity'.
@@ -2541,7 +2528,7 @@ ir_node *new_d_Cond   (dbg_info* db, ir_node *c);
  *
  * @param *db    A pointer for debug information.
  * @param *store The state of memory.
- * @param arity  Number of array indexes.
+ * @param arity  Number of array indices.
  * @param *in    Array with index inputs to the node.
  */
 
@@ -2566,12 +2553,11 @@ ir_node *new_d_Raise  (dbg_info* db, ir_node *store, ir_node *obj);
  * level type information for the constant value.
  *
  * @param *db    A pointer for debug information.
- * @param *mode  The mode of the operands and redults.
+ * @param *mode  The mode of the operands and results.
  * @param *con   Points to an entry in the constant table. This pointer is
                  added to the attributes of the node.
- * @param *tp    The type of the constante.
+ * @param *tp    The type of the constant.
  */
-
 ir_node *new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp);
 
 /** Constructor for a Const node.
@@ -2583,7 +2569,7 @@ ir_node *new_d_Const_type (dbg_info* db, ir_mode *mode, tarval *con, type *tp);
  * supported: If tv is entity derives a somehow useful type.)
  *
  * @param *db    A pointer for debug information.
- * @param *mode  The mode of the operands and redults.
+ * @param *mode  The mode of the operands and results.
  * @param *con   Points to an entry in the constant table. This pointer is added
  *               to the attributes of the node.
  */
@@ -2646,7 +2632,7 @@ ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *
  * with a compound type.  It explicitly specifies the entity selected.
  * Dynamically the node may select entities that overwrite the given
  * entity.  If the selected entity is an array element entity the Sel
- * node takes the required array indicees as inputs.
+ * node takes the required array indices as inputs.
  * Adds the node to the block in current_ir_block.
  *
  * @param   *db        A pointer for debug information.
@@ -2654,8 +2640,8 @@ ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *
  *                     from is allocated.
  * @param   *objptr    A pointer to a compound entity the Sel operation selects a
  *                     single attribute from.
- * @param   *n_index   The number of array indicees needed to select an array element entity.
- * @param   *index[]   If the compound entity is an array the indicees of the selected
+ * @param   *n_index   The number of array indices needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indices of the selected
  *                     element entity.  The constructor copies this array.
  * @param   *ent       The entity to select.
  */
@@ -2913,7 +2899,7 @@ ir_node *new_d_Cast   (dbg_info* db, ir_node *op, type *to_tp);
  *
  * Adds the node to the block in current_ir_block.
  *
- * @param *db    A pointer for debugginaromation.
+ * @param *db    A pointer for debug information.
  * @param arity  The number of predecessors
  * @param *in    Array with predecessors
  * @param *mode  The mode of it's inputs and output.
@@ -2967,9 +2953,10 @@ ir_node *new_d_Alloc  (dbg_info* db, ir_node *store, ir_node *size, type *alloc_
  * @param *ptr        The pointer to the object to free.
  * @param *size       The number of objects of type free_type to free in a sequence.
  * @param *free_type  The type of the freed variable.
+ * @param where       Where the variable was allocated, either heap_alloc or stack_alloc.
  */
 ir_node *new_d_Free   (dbg_info* db, ir_node *store, ir_node *ptr, ir_node *size,
-             type *free_type);
+             type *free_type, where_alloc where);
 
 /** Constructor for a Sync node.
  *
@@ -2979,7 +2966,7 @@ ir_node *new_d_Free   (dbg_info* db, ir_node *store, ir_node *ptr, ir_node *size
  * Adds the node to the block in current_ir_block.
  *
  * @param *db       A pointer for debug information.
- * @param  arity    The number of memories to syncronize.
+ * @param  arity    The number of memories to synchronize.
  * @param  **in     An array of pointers to nodes that produce an output of type
  *                  memory.  The constructor copies this array.
  */
@@ -2992,7 +2979,7 @@ ir_node *new_d_Sync   (dbg_info* db, int arity, ir_node *in[]);
  * position of the value within the tuple.
  * Adds the node to the block in current_ir_block.
  *
- * @param *db    A pointer for deubugginformation.
+ * @param *db    A pointer for deubug information.
  * @param arg    A node producing a tuple.
  * @param *mode  The mode of the value to project.
  * @param proj   The position of the value in the tuple.
@@ -3035,7 +3022,7 @@ ir_node *new_d_Tuple  (dbg_info* db, int arity, ir_node *in[]);
  */
 ir_node *new_d_Id     (dbg_info* db, ir_node *val, ir_mode *mode);
 
-/** Costructor for a Bad node.
+/** Constructor for a Bad node.
  *
  * Returns the unique Bad node of the graph.  The same as
  * get_irg_bad().
@@ -3060,7 +3047,7 @@ ir_node *new_d_Confirm (dbg_info* db, ir_node *val, ir_node *bound, pn_Cmp cmp);
 
 /** Constructor for an Unknown node.
  *
- * Represents an arbtrary valus.  Places the node in
+ * Represents an arbitrary value.  Places the node in
  * the start block.
  *
  * @param *m      The mode of the unknown value.
@@ -3075,7 +3062,7 @@ ir_node *new_d_Unknown(ir_mode *m);
  * node.Adds the node to the block in current_ir_block.
  *
  * @param *db     A pointer for debug information.
- * @param *callee The call node bisible in the  intra procedural view.
+ * @param *callee The call node visible in the  intra procedural view.
  */
 ir_node *new_d_CallBegin(dbg_info *db, ir_node *callee);
 
@@ -3087,7 +3074,7 @@ ir_node *new_d_CallBegin(dbg_info *db, ir_node *callee);
  */
 ir_node *new_d_EndReg (dbg_info *db);
 
-/** Constructor for an Endexcept node.
+/** Constructor for an EndExcept node.
  *
  * Used to represent regular procedure end in interprocedual view.
  * Adds the node to the block in current_ir_block.
@@ -3137,11 +3124,24 @@ ir_node *new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj);
  */
 ir_node *new_d_NoMem  (void);
 
+/** Constructor for a Mux node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *db       A pointer for debug information.
+ * @param *sel      The ir_node that calculates the boolean select.
+ * @param *ir_true  The ir_node that calculates the true result.
+ * @param *ir_false The ir_node that calculates the false result.
+ * @param *mode     The mode of the node (and it_true and ir_false).
+ */
+ir_node *new_d_Mux  (dbg_info *db, ir_node *sel,
+    ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
+
 /*-----------------------------------------------------------------------*/
 /* The block oriented interface without debug support                    */
 /*-----------------------------------------------------------------------*/
 
-/* Needed from the interfase with debug support:
+/* Needed from the interface with debug support:
 void set_cur_block (ir_node *target);   */
 
 /** Constructor for a Block node.
@@ -3221,7 +3221,7 @@ ir_node *new_Cond   (ir_node *c);
  * can end regular control flow. Adds the node to the block in current_ir_block.
  *
  * @param *store The state of memory.
- * @param arity  Number of array indexes.
+ * @param arity  Number of array indices.
  * @param *in    Array with index inputs to the node.
  */
 ir_node *new_Return (ir_node *store, int arity, ir_node *in[]);
@@ -3242,12 +3242,25 @@ ir_node *new_Raise  (ir_node *store, ir_node *obj);
  * supported: If tv is entity derives a somehow useful type.)
  * Adds the node to the block in current_ir_block.
  *
- * @param *mode  The mode of the operands and redults.
+ * @param *mode  The mode of the operands and results.
  * @param *con   Points to an entry in the constant table. This pointer is
  *               added to the attributes of  the node.
  */
 ir_node *new_Const  (ir_mode *mode, tarval *con);
 
+/**
+ * Make a const from a long.
+ * This is just convenience for the usual
+ * <code>
+ * new_Const(mode, tarval_from_long(mode, ...))
+ * </code>
+ * pain.
+ * @param mode The mode for the const.
+ * @param value The value of the constant.
+ * @return A new const node.
+ */
+ir_node *new_Const_long(ir_mode *mode, long value);
+
 /** Constructor for a Const node.
  *
  * Derives mode from passed type. */
@@ -3298,15 +3311,15 @@ ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent);
  * with a compound type.  It explicitly specifies the entity selected.
  * Dynamically the node may select entities that overwrite the given
  * entity.  If the selected entity is an array element entity the Sel
- * node takes the required array indicees as inputs.
+ * node takes the required array indices as inputs.
  * Adds the node to the block in current_ir_block.
  *
  * @param   *store     The memory in which the object the entity should be selected
  *                     from is allocated.
  * @param   *objptr    A pointer to a compound entity the Sel operation selects a
  *                     single attribute from.
- * @param   *n_index   The number of array indicees needed to select an array element entity.
- * @param   *index[]   If the compound entity is an array the indicees of the selected
+ * @param   *n_index   The number of array indices needed to select an array element entity.
+ * @param   *index[]   If the compound entity is an array the indices of the selected
  *                     element entity.  The constructor copies this array.
  * @param   *ent       The entity to select.
  */
@@ -3590,9 +3603,10 @@ ir_node *new_Alloc  (ir_node *store, ir_node *size, type *alloc_type,
  * @param *ptr        The pointer to the object to free.
  * @param *size       The number of objects of type free_type to free in a sequence.
  * @param *free_type  The type of the freed variable.
+ * @param where       Where the variable was allocated, either heap_alloc or stack_alloc.
  */
 ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
-                    type *free_type);
+                    type *free_type, where_alloc where);
 
 /** Constructor for a  Sync node.
  *
@@ -3601,7 +3615,7 @@ ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
  * value in all memories where it occurs.
  * Adds the node to the block in current_ir_block.
  *
- * @param  arity    The number of memories to syncronize.
+ * @param  arity    The number of memories to synchronize.
  * @param  **in     An array of pointers to nodes that produce an output of type
  *                  memory.  The constructor copies this array.
  */
@@ -3704,6 +3718,17 @@ ir_node *new_Unknown(ir_mode *m);
  */
 ir_node *new_NoMem  (void);
 
+/** Constructor for a Mux node.
+ *
+ * Adds the node to the block in current_ir_block.
+ *
+ * @param *sel      The ir_node that calculates the boolean select.
+ * @param *ir_true  The ir_node that calculates the true result.
+ * @param *ir_false The ir_node that calculates the false result.
+ * @param *mode     The mode of the node (and it_true and ir_false).
+ */
+ir_node *new_Mux  (ir_node *sel, ir_node *ir_false, ir_node *ir_true, ir_mode *mode);
+
 /*---------------------------------------------------------------------*/
 /* The comfortable interface.                                          */
 /* Supports automatic Phi node construction.                           */
@@ -3788,23 +3813,31 @@ type *get_cur_frame_type(void);
 /* --- initialize and finalize ir construction --- */
 
 /** Puts the graph into state "phase_high" */
-void finalize_cons (ir_graph *irg);
+void irg_finalize_cons (ir_graph *irg);
+
+/** Puts the program and all graphs into state phase_high.
+ *
+ * This also remarks, the construction of types is finished,
+ * e.g., that no more subtypes will be added.  */
+void irp_finalize_cons(void);
 
 /* --- Initialization --- */
 
 /**
  * This function is called, whenever a local variable is used before definition
  *
- * @parameter mode      the mode of the local var
- * @pos                 position choosen be the frontend for this var
+ * @param irg       the IR graph on which this happens
+ * @param mode      the mode of the local var
+ * @param pos       position chosen be the frontend for this variable (n_loc)
  *
- * @return a firm node of mode @p mode that initialises the var at position pos
+ * @return a firm node of mode @p mode that initializes the var at position pos
  *
  * @note
  *      Do not return NULL
- *      If this function is not set, FIRM will create a const node with tarval BAD
+ *      If this function is not set, FIRM will create a const node with tarval BAD.
+ *      Use set_irg_loc_description()/get_irg_loc_description() to assign additional
+ *      informations to local variables.
  */
-typedef ir_node *default_initialize_local_variable_func_t(ir_mode *mode, int pos);
-
+typedef ir_node *uninitialized_local_variable_func_t(ir_graph *irg, ir_mode *mode, int pos);
 
 # endif /* _IRCONS_H_ */