Fixed optimization of Div/Mod/DivMod nodes
[libfirm] / ir / ir / ircons.h
index e4eda0d..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);
  *    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)
  *    ------------------------------
  *
  *    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
  *
  *
  *
  *      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.
@@ -1081,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.
@@ -1587,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.
  *
@@ -1820,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
@@ -1873,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.
@@ -2228,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.
  *
@@ -2480,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.
@@ -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.
  *
@@ -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.
@@ -3228,6 +3315,19 @@ ir_node *new_Raise  (ir_node *store, ir_node *obj);
  */
 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. */
@@ -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.
  *
@@ -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 chosen 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 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_ */