#include "typerep.h"
#include "irop.h"
#include "irmode.h"
-#include "dbginfo.h"
/**
* @file irnode.h
*/
/**
- * you can work on the graph without considering the different types
- * of nodes, it's just a big graph.
+ * Some projection numbers must be always equal to support automatic phi construction
*/
+enum pn_generic {
+ pn_Generic_M_regular = 0, /**< The memory result. */
+ pn_Generic_X_regular = 1, /**< Execution result if no exception occurred. */
+ pn_Generic_X_except = 2, /**< The control flow result branching to the exception handler */
+ pn_Generic_other = 3 /**< First free projection number */
+};
/**
* Checks whether a pointer points to a ir node.
void add_irn_deps(ir_node *tgt, ir_node *src);
/**
-* Get the length of the dependency array.
-* @param node The node.
-* @return The length of the dependency array or 0 if it has not yet been allocated.
-*/
+ * Get the length of the dependency array.
+ * @param node The node.
+ * @return The length of the dependency array or 0 if it has not yet been allocated.
+ */
int get_irn_deps(const ir_node *node);
/**
-* Get an entry of the dependency array.
-* @param node The node.
-* @param pos The position.
-* @return The node at that position.
-*/
+ * Get an entry of the dependency array.
+ * @param node The node.
+ * @param pos The position.
+ * @return The node at that position.
+ */
ir_node *get_irn_dep(const ir_node *node, int pos);
/**
-* Set an entry of the dependency array.
-* @param node The node.
-* @param pos The position.
-* @param dep The dependency target.
-*/
+ * Set an entry of the dependency array.
+ * @param node The node.
+ * @param pos The position.
+ * @param dep The dependency target.
+ */
void set_irn_dep(ir_node *node, int pos, ir_node *dep);
/** Sets the opcode struct of the node. */
void set_irn_op(ir_node *node, ir_op *op);
/** Gets the opcode-enum of the node. */
-ir_opcode get_irn_opcode(const ir_node *node);
+unsigned get_irn_opcode(const ir_node *node);
/** Get the string representation of the opcode. */
const char *get_irn_opname(const ir_node *node);
/** Get the ident for a string representation of the opcode. */
/** Returns the link of a node. */
void *get_irn_link(const ir_node *node);
-/** Returns the ir_graph this node belongs to. Only valid if irg
- * is in state op_pin_state_pinned (irg is only stored in the block. */
+/** Returns the ir_graph this node belongs to. */
ir_graph *get_irn_irg(const ir_node *node);
/** Outputs a unique number for this node if libFIRM is compiled for
/** Sets the Block of a node. */
void set_nodes_block (ir_node *node, ir_node *block);
+/**
+ * Return the MacroBlock the node belongs to. This is only
+ * possible for pinned nodes or if the graph is in pinned state.
+ * Otherwise the MacroBlock may be incorrect. This condition is
+ * now checked by an assertion.
+ *
+ * This works for all except Block. It can return Blocks or the Bad node.
+ *
+ * To express the difference to access routines that work for all
+ * nodes we use infix "nodes" and do not name this function
+ * get_irn_MacroBlock(). */
+ir_node *get_nodes_MacroBlock(const ir_node *node);
+
/**
* @function get_irn_block()
* @see get_nodes_block()
* Projection numbers for result of Start node: use for Proj nodes!
*/
typedef enum {
- pn_Start_X_initial_exec, /**< Projection on the initial control flow. */
- pn_Start_M, /**< Projection on the initial memory. */
- pn_Start_P_frame_base, /**< Projection on the frame base pointer. */
- pn_Start_P_globals, /**< Projection on the pointer to the data segment
- containing _all_ global entities. Use for
- position independent data/code access. */
- pn_Start_P_tls, /**< Projection on the pointer to the thread local store
- segment containing _all_thread local variables. */
- pn_Start_T_args, /**< Projection on all arguments. */
- pn_Start_P_value_arg_base, /**< Pointer to region of compound value arguments as defined by
- type of this method. */
- pn_Start_max /**< number of projections from a Start */
+ pn_Start_X_initial_exec, /**< Projection on the initial control flow. */
+ pn_Start_M, /**< Projection on the initial memory. */
+ pn_Start_P_frame_base, /**< Projection on the frame base pointer. */
+ pn_Start_P_globals, /**< Projection on the pointer to the data segment
+ containing _all_ global entities. Use for
+ position independent data/code access. */
+ pn_Start_P_tls, /**< Projection on the pointer to the thread local store
+ segment containing _all_thread local variables. */
+ pn_Start_T_args, /**< Projection on all arguments. */
+ pn_Start_P_value_arg_base, /**< Pointer to region of compound value arguments as defined by
+ type of this method. */
+ pn_Start_max /**< number of projections from a Start */
} pn_Start; /* Projection numbers for Start. */
/** Test whether arbitrary node is frame pointer.
/* @@@ no more supported */
ir_node **get_Block_cfgpred_arr(ir_node *node);
int get_Block_n_cfgpreds(const ir_node *node);
-ir_node *get_Block_cfgpred(ir_node *node, int pos);
+ir_node *get_Block_cfgpred(const ir_node *node, int pos);
void set_Block_cfgpred(ir_node *node, int pos, ir_node *pred);
/** Get the predecessor block.
*
* - If we encounter the Bad node, this function does not return
* Start, but the Bad node.
*/
-ir_node *get_Block_cfgpred_block(ir_node *node, int pos);
-int get_Block_matured(ir_node *node);
+ir_node *get_Block_cfgpred_block(const ir_node *node, int pos);
+int get_Block_matured(const ir_node *node);
void set_Block_matured(ir_node *node, int matured);
/** A visited flag only for block nodes.
int Block_not_block_visited(const ir_node *node);
int Block_block_visited(const ir_node *node);
+#ifdef INTERPROCEDURAL_VIEW
/* Set and remove interprocedural predecessors. If the interprocedural
* predecessors are removed, the node has the same predecessors in
* both views.
ir_node *get_Block_cg_cfgpred(ir_node *node, int pos);
/** Frees the memory allocated for interprocedural predecessors. */
void remove_Block_cg_cfgpred_arr(ir_node *node);
+#endif
/** Returns the extended basic block a block belongs to. */
ir_extblk *get_Block_extbb(const ir_node *block);
/** Sets the extended basic block a block belongs to. */
void set_Block_extbb(ir_node *block, ir_extblk *extblk);
-
/** Get the Macro Block header of a (sub-) block. */
ir_node *get_Block_MacroBlock(const ir_node *block);
+/** Returns the ir_graph this Block belongs to. */
+ir_graph *get_Block_irg(const ir_node *block);
+/** Returns non-zero if the block has an assigned label. */
+int has_Block_label(const ir_node *block);
+/** Returns the label of a Block. */
+ir_label_t get_Block_label(const ir_node *block);
+/** Sets a label to a block. */
+void set_Block_label(ir_node *block, ir_label_t label);
/** Return the number of Keep alive node. */
int get_End_n_keepalives(ir_node *end);
-
/** Return the Keep alive node a position pos. */
ir_node *get_End_keepalive(ir_node *end, int pos);
-
/** Keep alive dedicated nodes. These must be either PhiM or Block nodes. */
-void add_End_keepalive (ir_node *end, ir_node *ka);
-
+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 */
+/** Set new keep-alives. */
void set_End_keepalives(ir_node *end, int n, ir_node *in[]);
-
-/* Set new keep-alives from old keep-alives, skipping irn */
+/** Set new keep-alives from old keep-alives, skipping irn. */
void remove_End_keepalive(ir_node *end, ir_node *irn);
/** Some parts of the End node are allocated separately -- their memory
/** Return the target address of an IJmp */
ir_node *get_IJmp_target(ir_node *ijmp);
-
/** Sets the target address of an IJmp */
void set_IJmp_target(ir_node *ijmp, ir_node *tgt);
Default flavor is "dense"
*/
typedef enum {
- dense, /**< Default. Missing Proj nodes are dead control flow. */
- fragmentary /**< Special. No control flow optimizations allowed. Missing
- Proj nodes mean default control flow, i.e., Proj(n). */
+ dense, /**< Default. Missing Proj nodes are dead control flow. */
+ fragmentary /**< Special. No control flow optimizations allowed. Missing
+ Proj nodes mean default control flow, i.e., Proj(n). */
} cond_kind;
ir_node *get_Cond_selector(ir_node *node);
* Projection numbers for conditions.
*/
typedef enum {
- pn_Cond_false, /**< Control flow if operand is "false". */
- pn_Cond_true, /**< Control flow if operand is "true". */
- pn_Cond_max /**< number of projections from a Cond */
+ pn_Cond_false, /**< Control flow if operand is "false". */
+ pn_Cond_true, /**< Control flow if operand is "true". */
+ pn_Cond_max /**< number of projections from a Cond */
} pn_Cond; /* Projection numbers for Cond. */
ir_node *get_Return_mem(ir_node *node);
ir_node *get_Return_res(ir_node *node, int pos);
void set_Return_res(ir_node *node, int pos, ir_node *res);
-/**
- * Possible classes for constant classification.
- */
-typedef enum {
- CNST_NULL = 0, /**< The node is a const(0). */
- CNST_ONE = +1, /**< The node is a const(1). */
- CNST_ALL_ONE = -1, /**< The node is a const(11111...). */
- CNST_OTHER = 2, /**< The tarval of the const has another value. */
- CNST_SYMCONST = 3, /**< The node is symconst. */
- CNST_NO_CONST = 4 /**< The node is no const at all. */
-} cnst_classify_t;
-
tarval *get_Const_tarval(const ir_node *node);
void set_Const_tarval(ir_node *node, tarval *con);
-/**
- * Classify a node concerning constant properties.
- * @param irn A node to check for.
- * @return Constant properties of that node.
- */
-cnst_classify_t classify_Const(ir_node *irn);
+/** Return non-zero if the given Const node represents the 0 constant. */
+int is_Const_null(const ir_node *node);
+
+/** Return non-zero if the given Const node represents the 1 constant. */
+int is_Const_one(const ir_node *node);
+
+/** Return non-zero if the given Const node represents the constant with all bits set. */
+int is_Const_all_one(const ir_node *node);
/** Returns the source language type of a Const node.
* Must be an atomic type. Mode of type must be mode of node.
depends on this tag. Use the proper access routine after testing
this flag. */
typedef enum {
- symconst_type_tag, /**< The SymConst is a type tag for the given type.
- symconst_symbol is type *. */
- symconst_type_size, /**< The SymConst is the size of the given type.
- symconst_symbol is type *. */
- symconst_type_align, /**< The SymConst is the alignment of the given type.
- symconst_symbol is type *. */
- symconst_addr_name, /**< The SymConst is a symbolic pointer to be filled in
- by the linker. The pointer is represented by a string.
- symconst_symbol is ident *. */
- symconst_addr_ent, /**< The SymConst is a symbolic pointer to be filled in
- by the linker. The pointer is represented by an entity.
- symconst_symbol is entity *. */
- symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities
- owner type. */
- symconst_enum_const /**< The SymConst is a enumeration constant of an
- enumeration type. */
+ symconst_type_tag, /**< The SymConst is a type tag for the given type.
+ symconst_symbol is type *. */
+ symconst_type_size, /**< The SymConst is the size of the given type.
+ symconst_symbol is type *. */
+ symconst_type_align, /**< The SymConst is the alignment of the given type.
+ symconst_symbol is type *. */
+ symconst_addr_name, /**< The SymConst is a symbolic pointer to be filled in
+ by the linker. The pointer is represented by a string.
+ symconst_symbol is ident *. */
+ symconst_addr_ent, /**< The SymConst is a symbolic pointer to be filled in
+ by the linker. The pointer is represented by an entity.
+ symconst_symbol is entity *. */
+ symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities
+ owner type. */
+ symconst_enum_const, /**< The SymConst is a enumeration constant of an
+ enumeration type. */
+ symconst_label /**< The SymConst is a label address. */
} symconst_kind;
/** Returns non-zero if s symconst kind has a type attribute */
/** Returns non-zero if s symconst kind has an enum_const attribute */
#define SYMCONST_HAS_ENUM(kind) ((kind) == symconst_enum_const)
+/** Returns non-zero if s symconst kind has a label attribute */
+#define SYMCONST_HAS_LABEL(kind) ((kind) == symconst_label)
+
/** SymConst attribute.
*
* This union contains the symbolic information represented by the node.
*/
typedef union symconst_symbol {
- ir_type *type_p; /**< the type of a symconst */
- ident *ident_p; /**< the ident of a symconst */
- ir_entity *entity_p; /**< the entity of a symconst */
- ir_enum_const *enum_p; /**< the enumeration constant of a symconst */
+ ir_type *type_p; /**< The type of a SymConst. */
+ ident *ident_p; /**< The ident of a SymConst. */
+ ir_entity *entity_p; /**< The entity of a SymConst. */
+ ir_enum_const *enum_p; /**< The enumeration constant of a SymConst. */
+ ir_label_t label; /**< The label of a SymConst. */
} symconst_symbol;
/** Get the kind of the SymConst. */
void set_SymConst_symbol(ir_node *node,
union symconst_symbol sym);
+/** Only to access SymConst of kind symconst_label. Else assertion: */
+ir_label_t get_SymConst_label(const ir_node *node);
+void set_SymConst_label(ir_node *node, ir_label_t label);
+
+
/** Access the type of the value represented by the SymConst.
*
* Example: primitive type int for SymConst size. */
* Projection numbers for result of Call node: use for Proj nodes!
*/
typedef enum {
- pn_Call_M_regular = 0, /**< The memory result. */
- pn_Call_X_regular = 1, /**< The control flow result when no exception occurs. */
- pn_Call_X_except = 2, /**< The control flow result branching to the exception handler. */
- pn_Call_T_result = 3, /**< The tuple containing all (0, 1, 2, ...) results. */
- pn_Call_M_except = 4, /**< The memory result in case the called method terminated with
- an exception. */
- pn_Call_P_value_res_base = 5,/**< A pointer to the memory region containing copied results
- passed by value (for compound result types). */
- pn_Call_max = 6 /**< number of projections from a Call */
+ pn_Call_M_regular = pn_Generic_M_regular, /**< The memory result. */
+ pn_Call_X_regular = pn_Generic_X_regular, /**< The control flow result when no exception occurs. */
+ pn_Call_X_except = pn_Generic_X_except, /**< The control flow result branching to the exception handler. */
+ pn_Call_T_result = pn_Generic_other, /**< The tuple containing all (0, 1, 2, ...) results. */
+ pn_Call_M_except, /**< The memory result in case the called method terminated with
+ an exception. */
+ pn_Call_P_value_res_base, /**< A pointer to the memory region containing copied results
+ passed by value (for compound result types). */
+ pn_Call_max /**< number of projections from a Call */
} pn_Call; /* Projection numbers for Call. */
#define pn_Call_M pn_Call_M_regular
ir_node *get_Mul_right(const ir_node *node);
void set_Mul_right(ir_node *node, ir_node *right);
+ir_node *get_Mulh_left(const ir_node *node);
+void set_Mulh_left(ir_node *node, ir_node *left);
+ir_node *get_Mulh_right(const ir_node *node);
+void set_Mulh_right(ir_node *node, ir_node *right);
+
ir_node *get_Quot_left(const ir_node *node);
void set_Quot_left(ir_node *node, ir_node *left);
ir_node *get_Quot_right(const ir_node *node);
* Projection numbers for Quot: use for Proj nodes!
*/
typedef enum {
- pn_Quot_M, /**< Memory result. */
- pn_Quot_X_regular, /**< Execution result if no exception occurred. */
- pn_Quot_X_except, /**< Execution result if exception occurred. */
- pn_Quot_res, /**< Result of computation. */
- pn_Quot_max /**< number of projections from a Quot */
+ pn_Quot_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Quot_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Quot_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Quot_res = pn_Generic_other, /**< Result of computation. */
+ pn_Quot_max /**< number of projections from a Quot */
} pn_Quot; /* Projection numbers for Quot. */
ir_node *get_DivMod_left(const ir_node *node);
* Projection numbers for DivMod: use for Proj nodes!
*/
typedef enum {
- pn_DivMod_M, /**< Memory result. */
- pn_DivMod_X_regular, /**< Execution result if no exception occurred. */
- pn_DivMod_X_except, /**< Execution result if exception occurred. */
- pn_DivMod_res_div, /**< Result of computation a / b. */
- pn_DivMod_res_mod, /**< Result of computation a % b. */
- pn_DivMod_max /**< number of projections from a DivMod */
+ pn_DivMod_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_DivMod_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_DivMod_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_DivMod_res_div = pn_Generic_other, /**< Result of computation a / b. */
+ pn_DivMod_res_mod, /**< Result of computation a % b. */
+ pn_DivMod_max /**< number of projections from a DivMod */
} pn_DivMod; /* Projection numbers for DivMod. */
ir_node *get_Div_left(const ir_node *node);
* Projection numbers for Div: use for Proj nodes!
*/
typedef enum {
- pn_Div_M, /**< Memory result. */
- pn_Div_X_regular, /**< Execution result if no exception occurred. */
- pn_Div_X_except, /**< Execution result if exception occurred. */
- pn_Div_res, /**< Result of computation. */
- pn_Div_max /**< number of projections from a Div */
+ pn_Div_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Div_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Div_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Div_res = pn_Generic_other, /**< Result of computation. */
+ pn_Div_max /**< number of projections from a Div */
} pn_Div; /* Projection numbers for Div. */
ir_node *get_Mod_left(const ir_node *node);
* Projection numbers for Mod: use for Proj nodes!
*/
typedef enum {
- pn_Mod_M, /**< Memory result. */
- pn_Mod_X_regular, /**< Execution result if no exception occurred. */
- pn_Mod_X_except, /**< Execution result if exception occurred. */
- pn_Mod_res, /**< Result of computation. */
- pn_Mod_max /**< number of projections from a Mod */
+ pn_Mod_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Mod_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Mod_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Mod_res = pn_Generic_other, /**< Result of computation. */
+ pn_Mod_max /**< number of projections from a Mod */
} pn_Mod; /* Projection numbers for Mod. */
ir_node *get_Abs_op(const ir_node *node);
* Note that the encoding is imported, so do NOT change the order.
*/
typedef enum {
- pn_Cmp_False = 0, /**< false */
- pn_Cmp_Eq = 1, /**< equal */
- pn_Cmp_Lt = 2, /**< less */
- pn_Cmp_Le = pn_Cmp_Eq|pn_Cmp_Lt, /**< less or equal */
- pn_Cmp_Gt = 4, /**< greater */
- pn_Cmp_Ge = pn_Cmp_Eq|pn_Cmp_Gt, /**< greater or equal */
- pn_Cmp_Lg = pn_Cmp_Lt|pn_Cmp_Gt, /**< less or greater */
- pn_Cmp_Leg = pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt, /**< less, equal or greater = ordered */
- pn_Cmp_Uo = 8, /**< unordered */
- pn_Cmp_Ue = pn_Cmp_Uo|pn_Cmp_Eq, /**< unordered or equal */
- pn_Cmp_Ul = pn_Cmp_Uo|pn_Cmp_Lt, /**< unordered or less */
- pn_Cmp_Ule = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Lt, /**< unordered, less or equal */
- pn_Cmp_Ug = pn_Cmp_Uo|pn_Cmp_Gt, /**< unordered or greater */
- pn_Cmp_Uge = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Gt, /**< unordered, greater or equal */
- pn_Cmp_Ne = pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt, /**< unordered, less or greater = not equal */
- pn_Cmp_True = 15 /**< true */
- /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for JNI interface */
+ pn_Cmp_False = 0, /**< false */
+ pn_Cmp_Eq = 1, /**< equal */
+ pn_Cmp_Lt = 2, /**< less */
+ pn_Cmp_Le = pn_Cmp_Eq|pn_Cmp_Lt, /**< less or equal */
+ pn_Cmp_Gt = 4, /**< greater */
+ pn_Cmp_Ge = pn_Cmp_Eq|pn_Cmp_Gt, /**< greater or equal */
+ pn_Cmp_Lg = pn_Cmp_Lt|pn_Cmp_Gt, /**< less or greater */
+ pn_Cmp_Leg = pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt, /**< less, equal or greater = ordered */
+ pn_Cmp_Uo = 8, /**< unordered */
+ pn_Cmp_Ue = pn_Cmp_Uo|pn_Cmp_Eq, /**< unordered or equal */
+ pn_Cmp_Ul = pn_Cmp_Uo|pn_Cmp_Lt, /**< unordered or less */
+ pn_Cmp_Ule = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Lt, /**< unordered, less or equal */
+ pn_Cmp_Ug = pn_Cmp_Uo|pn_Cmp_Gt, /**< unordered or greater */
+ pn_Cmp_Uge = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Gt, /**< unordered, greater or equal */
+ pn_Cmp_Ne = pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt, /**< unordered, less or greater = not equal */
+ pn_Cmp_True = 15 /**< true */
+ /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for JNI interface */
} pn_Cmp; /* Projection numbers for Cmp */
/* #define not_mask pn_Cmp_Leg */
/** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
int get_inversed_pnc(int pnc);
+/** An alternative name for get_inversed_pnc() that can be better memorized. */
+#define get_mirrored_pnc(pnc) get_inversed_pnc(pnc)
+
ir_node *get_Cmp_left(const ir_node *node);
void set_Cmp_left(ir_node *node, ir_node *left);
ir_node *get_Cmp_right(const ir_node *node);
ir_node *get_Conv_op(const ir_node *node);
void set_Conv_op(ir_node *node, ir_node *op);
-int get_Conv_strict(ir_node *node);
+int get_Conv_strict(const ir_node *node);
void set_Conv_strict(ir_node *node, int flag);
/* Does Cast need a mem operator?
Returns false if irg in phase building and the Phi has zero
predecessors: it's a Phi0. */
int is_Phi(const ir_node *n);
-/** Returns true if irg in phase building and the Phi has zero
- predecessors: it's a Phi0. */
+/** Returns true if irg in phase building and the Phi has zero
+ predecessors. It's a Phi0 then. */
int is_Phi0(const ir_node *n);
/* These routines also work for Filter nodes in interprocedural view. */
ir_node **get_Phi_preds_arr(ir_node *node);
* Projection numbers for Load: use for Proj nodes!
*/
typedef enum {
- pn_Load_M, /**< Memory result. */
- pn_Load_X_regular, /**< Execution result if no exception occurred. */
- pn_Load_X_except, /**< Execution result if exception occurred. */
- pn_Load_res, /**< Result of load operation. */
- pn_Load_max /**< number of projections from a Load */
+ pn_Load_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Load_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Load_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Load_res = pn_Generic_other, /**< Result of load operation. */
+ pn_Load_max /**< number of projections from a Load */
} pn_Load; /* Projection numbers for Load. */
ir_node *get_Load_mem(ir_node *node);
void set_Load_mode(ir_node *node, ir_mode *mode);
ir_volatility get_Load_volatility(ir_node *node);
void set_Load_volatility(ir_node *node, ir_volatility volatility);
+ir_align get_Load_align(ir_node *node);
+void set_Load_align(ir_node *node, ir_align align);
/**
* Projection numbers for Store: use for Proj nodes!
*/
typedef enum {
- pn_Store_M, /**< Memory result. */
- pn_Store_X_regular, /**< Execution result if no exception occurred. */
- pn_Store_X_except, /**< Execution result if exception occurred. */
- pn_Store_max /**< number of projections from a Store */
+ pn_Store_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Store_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Store_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Store_max = pn_Generic_other /**< number of projections from a Store */
} pn_Store; /* Projection numbers for Store. */
ir_node *get_Store_mem(ir_node *node);
void set_Store_value(ir_node *node, ir_node *value);
ir_volatility get_Store_volatility(ir_node *node);
void set_Store_volatility(ir_node *node, ir_volatility volatility);
+ir_align get_Store_align(ir_node *node);
+void set_Store_align(ir_node *node, ir_align align);
/**
* Projection numbers for Alloc: use for Proj nodes!
*/
typedef enum {
- pn_Alloc_M, /**< Memory result. */
- pn_Alloc_X_regular, /**< Execution result if no exception occurred. */
- pn_Alloc_X_except, /**< Execution result if exception occurred. */
- pn_Alloc_res, /**< Result of allocation. */
- pn_Alloc_max /**< number of projections from an Alloc */
+ pn_Alloc_M = pn_Generic_M_regular, /**< Memory result. */
+ pn_Alloc_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Alloc_X_except = pn_Generic_X_except, /**< Execution result if exception occurred. */
+ pn_Alloc_res = pn_Generic_other, /**< Result of allocation. */
+ pn_Alloc_max /**< number of projections from an Alloc */
} pn_Alloc; /* Projection numbers for Alloc. */
ir_node *get_Alloc_mem(ir_node *node);
/** Return the projection number of a Proj node. */
long get_Proj_proj(const ir_node *node);
void set_Proj_proj(ir_node *node, long proj);
-long get_VProj_proj(const ir_node *node);
-void set_VProj_proj(ir_node *node, long value);
-
ir_node **get_Tuple_preds_arr(ir_node *node);
int get_Tuple_n_preds(ir_node *node);
/** Confirm has a single result and returns 'value' unchanged.
* The node expresses a restriction on 'value':
* 'value' 'cmp' 'bound' == true. */
-ir_node *get_Confirm_value(ir_node *node);
-void set_Confirm_value(ir_node *node, ir_node *value);
-ir_node *get_Confirm_bound(ir_node *node);
-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);
+ir_node *get_Confirm_value(ir_node *node);
+void set_Confirm_value(ir_node *node, ir_node *value);
+ir_node *get_Confirm_bound(ir_node *node);
+void set_Confirm_bound(ir_node *node, ir_node *bound);
+pn_Cmp get_Confirm_cmp(const 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
* Projection numbers for result of CopyB node: use for Proj nodes!
*/
typedef enum {
- pn_CopyB_M_regular = 0, /**< The memory result. */
- pn_CopyB_X_regular = 1, /**< Execution result if no exception occurred. */
- pn_CopyB_X_except = 2, /**< The control flow result branching to the exception handler */
- pn_CopyB_M_except = 3, /**< The memory result in case the runtime function terminated with
- an exception */
- pn_CopyB_max = 4 /**< number of projections from a CopyB */
+ pn_CopyB_M_regular = pn_Generic_M_regular, /**< The memory result. */
+ pn_CopyB_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_CopyB_X_except = pn_Generic_X_except, /**< The control flow result branching to the exception handler */
+ pn_CopyB_M_except = pn_Generic_other, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_CopyB_max /**< number of projections from a CopyB */
} pn_CopyB; /* Projection numbers for CopyB. */
#define pn_CopyB_M pn_CopyB_M_regular
* Projection numbers for result of InstOf node: use for Proj nodes!
*/
typedef enum {
- pn_InstOf_M_regular = 0, /**< The memory result. */
- pn_InstOf_X_regular = 1, /**< Execution result if no exception occurred. */
- pn_InstOf_X_except = 2, /**< The control flow result branching to the exception handler */
- pn_InstOf_res = 3, /**< The checked object pointer. */
- pn_InstOf_M_except = 4, /**< The memory result in case the runtime function terminated with
- an exception */
- pn_InstOf_max = 5 /**< number of projections from an InstOf */
+ pn_InstOf_M_regular = pn_Generic_M_regular, /**< The memory result. */
+ pn_InstOf_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_InstOf_X_except = pn_Generic_X_except, /**< The control flow result branching to the exception handler */
+ pn_InstOf_res = pn_Generic_other, /**< The checked object pointer. */
+ pn_InstOf_M_except, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_InstOf_max /**< number of projections from an InstOf */
} pn_InstOf;
#define pn_InstOf_M pn_InstOf_M_regular
* Projection numbers for Raise.
*/
typedef enum {
- 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_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);
* Projection numbers for result of Bound node: use for Proj nodes!
*/
typedef enum {
- pn_Bound_M = 0, /**< The memory result. */
- pn_Bound_X_regular = 1, /**< Execution result if no exception occurred. */
- pn_Bound_X_except = 2, /**< The control flow result branching to the exception handler */
- pn_Bound_res = 3, /**< The checked index. */
- pn_Bound_max = 4 /**< number of projections from a Bound */
+ pn_Bound_M = pn_Generic_M_regular, /**< The memory result. */
+ pn_Bound_X_regular = pn_Generic_X_regular, /**< Execution result if no exception occurred. */
+ pn_Bound_X_except = pn_Generic_X_except, /**< The control flow result branching to the exception handler */
+ pn_Bound_res = pn_Generic_other, /**< The checked index. */
+ pn_Bound_max /**< number of projections from a Bound */
} pn_Bound;
/** Returns the memory input of a Bound operation. */
typedef struct {
unsigned pos; /**< The inputs/output position for this constraint. */
ident *constraint; /**< The constraint for this input/output. */
+ ir_mode *mode; /**< The mode of the constraint. */
} ir_asm_constraint;
/** Return the assembler text of an ASM pseudo node. */
int is_Const(const ir_node *node);
/** Returns true if a node is a Conv node. */
int is_Conv(const ir_node *node);
+/** Returns true if a node is a strictConv node. */
+int is_strictConv(const ir_node *node);
+/** Returns true if a node is a Cast node. */
+int is_Cast(const ir_node *node);
/** Returns true if node is a Bad node. */
int is_Bad(const ir_node *node);
/** Returns true if node is a NoMem node. */
int is_NoMem(const ir_node *node);
/** Returns true if node is a Start node. */
int is_Start(const ir_node *node);
+/** Returns true if node is a Minus node. */
+int is_Minus(const ir_node *node);
/** Returns true if node is a Mod node. */
int is_Mod(const ir_node *node);
/** Returns true if node is a Div node. */
int is_Quot(const ir_node *node);
/** Returns true if node is an Add node. */
int is_Add(const ir_node *node);
+/** Returns true if node is an And node. */
+int is_And(const ir_node *node);
+/** Returns true if node is an Or node. */
+int is_Or(const ir_node *node);
+/** Returns true if node is an Eor node. */
+int is_Eor(const ir_node *node);
/** Returns true if node is a Sub node. */
int is_Sub(const ir_node *node);
+/** Returns true if node is a Not node. */
+int is_Not(const ir_node *node);
+/** Returns true if node is a Shl node. */
+int is_Shl(const ir_node *node);
+/** Returns true if node is a Shr node. */
+int is_Shr(const ir_node *node);
+/** Returns true if node is a Shrs node. */
+int is_Shrs(const ir_node *node);
+/** Returns true if node is a Rot node. */
+int is_Rot(const ir_node *node);
+/** Returns true if node is a Psi node. */
+int is_Psi(const ir_node *node);
+/** Returns true if node is a Tuple node. */
+int is_Tuple(const ir_node *node);
/** Returns true if the node is not a Block */
int is_no_Block(const ir_node *node);
/** Returns true if the node is a Block */
int is_Sel(const ir_node *node);
/** Returns true if node is a Mul node. */
int is_Mul(const ir_node *node);
+/** Returns true if node is a Mulh node. */
+int is_Mulh(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 Load node. */
* A type to express conditional jump predictions.
*/
typedef enum {
- COND_JMP_PRED_NONE, /**< No jump prediction. Default. */
- COND_JMP_PRED_TRUE, /**< The True case is predicted. */
- COND_JMP_PRED_FALSE /**< The False case is predicted. */
+ COND_JMP_PRED_NONE, /**< No jump prediction. Default. */
+ COND_JMP_PRED_TRUE, /**< The True case is predicted. */
+ COND_JMP_PRED_FALSE /**< The False case is predicted. */
} cond_jmp_predicate;
/** Gets the string representation of the jump prediction .*/
* must be passed to the access macro get_irn_data(), 0 if the
* registration failed.
*/
-unsigned register_additional_node_data(unsigned size);
+unsigned firm_register_additional_node_data(unsigned size);
/**
* Return a pointer to the node attributes.
*/
unsigned get_irn_idx(const ir_node *node);
+/**
+ * Sets the debug information of a node.
+ *
+ * @param n The node.
+ * @param db The debug info.
+ */
+void set_irn_dbg_info(ir_node *n, dbg_info *db);
+
+/**
+ * Returns the debug information of an node.
+ *
+ * @param n The node.
+ */
+dbg_info *get_irn_dbg_info(const ir_node *n);
+
/*-----------------------------------------------------------------*/
/** Debug aides **/
/*-----------------------------------------------------------------*/