/** Set the Keep alive node at position pos. */
void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
+/** Set new keep-alives */
+void set_End_keepalives(ir_node *end, int n, ir_node *in[]);
+
/** Some parts of the End node are allocated separately -- their memory
is not recovered by dead_node_elimination if a End node is dead.
free_End() frees these data structures. */
ir_node *get_Return_res (ir_node *node, int pos);
void set_Return_res (ir_node *node, int pos, ir_node *res);
-ir_node *get_Raise_mem (ir_node *node);
-void set_Raise_mem (ir_node *node, ir_node *mem);
-ir_node *get_Raise_exo_ptr (ir_node *node); /* PoinTeR to EXception Object */
-void set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
-
-/**
- * Projection numbers for Raise.
- */
-typedef enum {
- pn_Raise_X, /**< Execution result. */
- pn_Raise_M, /**< Memory result. */
- pn_Raise_max /**< number of projections from a Raise */
-} pn_Raise; /* Projection numbers for Raise. */
-
typedef enum {
CNST_NULL = 0, /**< The node is a const(0). */
CNST_ONE = +1, /**< The node is a const(1). */
entity *get_Sel_entity (ir_node *node); /* entity to select */
void set_Sel_entity (ir_node *node, entity *ent);
-/**
- * Projection numbers for result of InstOf node: use for Proj nodes!
- */
-typedef enum {
- pn_InstOf_M_regular = 0, /**< The memory result. */
- pn_InstOf_X_except = 1, /**< The control flow result branching to the exception handler */
- pn_InstOf_res = 2, /**< The checked object pointer. */
- pn_InstOf_M_except = 3, /**< The memory result in case the runtime function terminated with
- an exception */
- pn_InstOf_max = 4 /**< number of projections from an InstOf */
-} pn_InstOf;
-#define pn_InstOf_M pn_InstOf_M_regular
-
-/** InstOf access */
-ir_type *get_InstOf_type (ir_node *node);
-void set_InstOf_type (ir_node *node, ir_type *type);
-ir_node *get_InstOf_store (ir_node *node);
-void set_InstOf_store (ir_node *node, ir_node *obj);
-ir_node *get_InstOf_obj (ir_node *node);
-void set_InstOf_obj (ir_node *node, ir_node *obj);
-
/**
* Projection numbers for result of Call node: use for Proj nodes!
*/
pn_Cmp get_Confirm_cmp (ir_node *node);
void set_Confirm_cmp (ir_node *node, pn_Cmp cmp);
+/*
+ * Mux Support: Note that Psi nodes with one condition can be handled
+ * like Mux nodes, and the access functions work as expected.
+ */
ir_node *get_Mux_sel (ir_node *node);
void set_Mux_sel (ir_node *node, ir_node *sel);
ir_node *get_Mux_false (ir_node *node);
ir_node *get_Mux_true (ir_node *node);
void set_Mux_true (ir_node *node, ir_node *ir_true);
+ir_node *get_Psi_cond (ir_node *node, int pos);
+void set_Psi_cond (ir_node *node, int pos, ir_node *cond);
+ir_node *get_Psi_val (ir_node *node, int pos);
+void set_Psi_val (ir_node *node, int pos, ir_node *val);
+ir_node *get_Psi_default(ir_node *node);
+void set_Psi_default(ir_node *node, ir_node *val);
+int get_Psi_n_conds(ir_node *node);
+
/**
* Projection numbers for result of CopyB node: use for Proj nodes!
*/
typedef enum {
- pn_CopyB_M_regular = pn_Call_M_regular, /**< The memory result. */
- pn_CopyB_X_except = pn_Call_X_except, /**< The control flow result branching to the exception handler */
- pn_CopyB_M_except = pn_Call_M_except, /**< The memory result in case the runtime function terminated with
+ pn_CopyB_M_regular = 0, /**< The memory result. */
+ pn_CopyB_X_except = 1, /**< The control flow result branching to the exception handler */
+ pn_CopyB_M_except = 2, /**< The memory result in case the runtime function terminated with
an exception */
- pn_CopyB_max = pn_Call_max /**< number of projections from a CopyB */
+ pn_CopyB_max = 3 /**< number of projections from a CopyB */
} pn_CopyB; /* Projection numbers for CopyB. */
#define pn_CopyB_M pn_CopyB_M_regular
ir_type *get_CopyB_type(ir_node *node);
void set_CopyB_type(ir_node *node, ir_type *data_type);
+/**
+ * Projection numbers for result of InstOf node: use for Proj nodes!
+ */
+typedef enum {
+ pn_InstOf_M_regular = 0, /**< The memory result. */
+ pn_InstOf_X_except = 1, /**< The control flow result branching to the exception handler */
+ pn_InstOf_res = 2, /**< The checked object pointer. */
+ pn_InstOf_M_except = 3, /**< The memory result in case the runtime function terminated with
+ an exception */
+ pn_InstOf_max = 4 /**< number of projections from an InstOf */
+} pn_InstOf;
+#define pn_InstOf_M pn_InstOf_M_regular
+
+/** InstOf access */
+ir_type *get_InstOf_type (ir_node *node);
+void set_InstOf_type (ir_node *node, ir_type *type);
+ir_node *get_InstOf_store (ir_node *node);
+void set_InstOf_store (ir_node *node, ir_node *obj);
+ir_node *get_InstOf_obj (ir_node *node);
+void set_InstOf_obj (ir_node *node, ir_node *obj);
+
+/**
+ * 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; /* Projection numbers for Raise. */
+
+ir_node *get_Raise_mem (ir_node *node);
+void set_Raise_mem (ir_node *node, ir_node *mem);
+ir_node *get_Raise_exo_ptr (ir_node *node); /* PoinTeR to EXception Object */
+void set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
+
/**
* Projection numbers for result of Bound node: use for Proj nodes!
*/
int is_no_Block (const ir_node *node);
/** returns true if the node is a Block */
int is_Block (const ir_node *node);
-/** returns true if node is a Unknown node. */
+/** returns true if node is an Unknown node. */
int is_Unknown (const ir_node *node);
+/** returns true if node is a Return node. */
+int is_Return (const ir_node *node);
+/** returns true if node is a Call node. */
+int is_Call (const ir_node *node);
+/** returns true if node is a Sel node. */
+int is_Sel (const ir_node *node);
+/** returns true if node is a Mux node or a Psi with only one condition. */
+int is_Mux (const ir_node *node);
/** returns true if node is a Proj node or a Filter node in
* intraprocedural view */
int is_Proj (const ir_node *node);
/** Return the type associated with the value produced by n
* if the node remarks this type as it is the case for
- * Cast, Const, SymConst and some Proj nodes. */
+ * Cast, Const, SymConst and some Proj nodes or unknown_type. */
ir_type *get_irn_type(ir_node *n);
/** Return the type attribute of a node n (SymConst, Call, Alloc, Free,
/** Returns non-zero for constant-like nodes. */
int is_irn_constlike(const ir_node *node);
+/**
+ * Returns non-zero for nodes that are allowed to have keep-alives and
+ * are neither Block nor PhiM.
+ */
+int is_irn_keep(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that are machine operations.
+ */
+int is_irn_machine_op(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that are machine operands.
+ */
+int is_irn_machine_operand(const ir_node *node);
+
+/**
+ * Returns non-zero for nodes that have the n'th user machine flag set.
+ */
+int is_irn_machine_user(const ir_node *node, unsigned n);
+
/**
* A type to express conditional jump predictions.
*/
*/
void *get_irn_generic_attr(ir_node *node);
+/**
+ * Returns the unique node index for the node in its graph.
+ * This index is used to access phase information for this node.
+ */
+unsigned get_irn_idx(const ir_node *node);
+
/*-----------------------------------------------------------------*/
/** Debug aides **/
/*-----------------------------------------------------------------*/