Fixed optimization of Div/Mod/DivMod nodes
[libfirm] / ir / ir / ircons.h
index ad8346d..8f4acec 100644 (file)
  *    constructors and at the paragraph COPING WITH DATA OBJECTS at the
  *    end of this documentation.
  *
 *    The comfortable interface contains the following routines further explained
+ *    The comfortable interface contains the following routines further explained
  *    below:
  *
  *    ir_node *new_immBlock (void);
  *    ir_node *new_Start    (void);
  *    ir_node *new_End      (void);
  *    ir_node *new_Jmp      (void);
+ *    ir_node *new_IJmp     (ir_node *tgt);
  *    ir_node *new_Cond     (ir_node *c);
  *    ir_node *new_Return   (ir_node *store, int arity, ir_node **in);
  *    ir_node *new_Raise    (ir_node *store, ir_node *obj);
  *    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);
  *    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
  *    Output:
  *      Control flow to the next block.
  *
+ *    ir_node *new_IJmp (ir_node *tgt)
+ *    -----------------------
+ *
+ *    Creates an IJmp node.
+ *
+ *    Inputs:
+ *      The node that represents the target jump address
+ *    Output:
+ *      Control flow to an unknown target, must be pinned by
+ *      the End node.
+ *
  *    ir_node *new_Cond (ir_node *c)
  *    ------------------------------
  *
  *                      ------------
  *
  *    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
  *      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
@@ -1080,6 +1096,18 @@ ir_node *new_rd_End    (dbg_info *db, ir_graph *irg, ir_node *block);
  */
 ir_node *new_rd_Jmp    (dbg_info *db, ir_graph *irg, ir_node *block);
 
+/** Constructor for an IJmp node.
+ *
+ * IJmp represents control flow to a single control successor not
+ * statically known i.e. an indirect Jmp.
+ *
+ * @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 *tgt    The ir node representing the target address.
+ */
+ir_node *new_rd_IJmp   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *tgt);
+
 /** Constructor for a Break node.
  *
  * Break represents control flow to a single control successor just as Jmp.
@@ -1143,7 +1171,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.
  */
@@ -1159,7 +1187,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,
@@ -1209,28 +1237,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.
@@ -1239,7 +1267,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.
@@ -1248,8 +1276,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.
  */
@@ -1586,9 +1614,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.
  *
@@ -1599,7 +1628,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.
  */
@@ -1610,7 +1639,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.
@@ -1819,6 +1848,17 @@ ir_node *new_r_End    (ir_graph *irg, ir_node *block);
  */
 ir_node *new_r_Jmp    (ir_graph *irg, ir_node *block);
 
+/** Constructor for an IJmp node.
+ *
+ * IJmp represents control flow to a single control successor not
+ * statically known i.e. an indirect Jmp.
+ *
+ * @param *irg    The ir graph the node belongs to.
+ * @param *block  The ir block the node belongs to.
+ * @param *tgt    The ir node representing the target address.
+ */
+ir_node *new_r_IJmp   (ir_graph *irg, ir_node *block, ir_node *tgt);
+
 /** Constructor for a Cond node.
  *
  * If c is mode_b represents a conditional branch (if/else). If c is
@@ -1842,7 +1882,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,
@@ -1872,6 +1912,34 @@ 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 Const_type node.
+ *
+ * The constant represents a target value.  This constructor sets high
+ * level type information for the constant value.
+ *
+ * @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 results.
+ * @param *con   Points to an entry in the constant table.
+ * @param *tp    The type of the constant.
+ */
+ir_node *new_r_Const_type(ir_graph *irg, ir_node *block,
+           ir_mode *mode, tarval *con, type *tp);
+
 /** Constructor for a SymConst node.
  *
  *  This is the constructor for a symbolic constant.
@@ -1895,7 +1963,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,
@@ -1907,7 +1975,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.
@@ -1915,8 +1983,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.
  */
@@ -2227,9 +2295,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.
  *
@@ -2239,7 +2308,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.
  */
@@ -2328,7 +2397,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.
@@ -2345,7 +2414,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);
 
@@ -2448,7 +2517,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'.
@@ -2479,9 +2548,18 @@ ir_node *new_d_End    (dbg_info* db);
  *
  * @param *db     A pointer for debug information.
  */
-
 ir_node *new_d_Jmp    (dbg_info* db);
 
+/** Constructor for an IJmp node.
+ *
+ * IJmp represents control flow to a single control successor not
+ * statically known i.e. an indirect Jmp.
+ *
+ * @param *db     A pointer for debug information.
+ * @param *tgt    The ir node representing the target address.
+ */
+ir_node *new_d_IJmp   (dbg_info *db, ir_node *tgt);
+
 /** Constructor for a Cond node.
  *
  * Adds the node to the block in current_ir_block.
@@ -2508,7 +2586,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.
  */
 
@@ -2533,12 +2611,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.
@@ -2550,7 +2627,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.
  */
@@ -2613,7 +2690,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.
@@ -2621,8 +2698,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.
  */
@@ -2880,7 +2957,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.
@@ -2934,9 +3011,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.
  *
@@ -2946,7 +3024,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.
  */
@@ -2959,7 +3037,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.
@@ -3002,7 +3080,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().
@@ -3027,7 +3105,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.
@@ -3042,7 +3120,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);
 
@@ -3054,7 +3132,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.
@@ -3121,7 +3199,7 @@ ir_node *new_d_Mux  (dbg_info *db, ir_node *sel,
 /* 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.
@@ -3172,6 +3250,15 @@ ir_node *new_EndExcept(void);
  */
 ir_node *new_Jmp    (void);
 
+/** Constructor for an IJmp node.
+ *
+ * IJmp represents control flow to a single control successor not
+ * statically known i.e. an indirect Jmp.
+ *
+ * @param *tgt    The ir node representing the target address.
+ */
+ir_node *new_IJmp   (ir_node *tgt);
+
 /** Constructor for a Break node.
  * Break represents control flow to a single control successor just as Jmp.
  * The blocks separated by a break may not be concatenated by an optimization.
@@ -3201,7 +3288,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[]);
@@ -3222,12 +3309,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. */
@@ -3278,15 +3378,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.
  */
@@ -3570,9 +3670,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.
  *
@@ -3581,7 +3682,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.
  */
@@ -3779,23 +3880,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_ */