* definition is close to the operations specified in UKA Tech-Report
* 1999-14
*/
-#ifndef _IROP_H_
-#define _IROP_H_
+#ifndef _FIRM_IR_IROP_H_
+#define _FIRM_IR_IROP_H_
#include "firm_types.h"
oparity_trinary, /**< an trinary operator -- considering 'numeric' arguments.*/
oparity_zero, /**< no operators, as e.g. Const. */
oparity_variable, /**< arity not fixed by opcode, but statically
- known. E.g., number of arguments to call. */
+ known. E.g., number of arguments to call. */
oparity_dynamic, /**< arity depends on state of firm representation.
- Can change by optimizations...
- We must allocate a dynamic in array for the node! */
+ Can change by optimizations...
+ We must allocate a dynamic in array for the node! */
oparity_any /**< other arity */
} op_arity;
/** The irop flags */
typedef enum {
irop_flag_none = 0x00000000, /**< nothing */
- irop_flag_labeled = 0x00000001, /**< if set, Output edge labels on in-edges in vcg graph */
- irop_flag_commutative = 0x00000002, /**< operation is commutative */
+ irop_flag_labeled = 0x00000001, /**< if set, Output edge labels on in-edges in vcg graph */
+ irop_flag_commutative = 0x00000002, /**< operation is commutative */
irop_flag_cfopcode = 0x00000004, /**< is a control flow operation */
- irop_flag_ip_cfopcode = 0x00000008, /**< operation manipulates interprocedural control flow */
- irop_flag_fragile = 0x00000010, /**< set if the operation can change the control flow because
- of an exception */
+ irop_flag_ip_cfopcode = 0x00000008, /**< operation manipulates interprocedural control flow */
+ irop_flag_fragile = 0x00000010, /**< set if the operation can change the control flow because
+ of an exception */
irop_flag_forking = 0x00000020, /**< the operation is a forking control flow */
irop_flag_highlevel = 0x00000040, /**< the operation is a pure high-level one and can be
skipped in low-level optimizations */
irop_flag_constlike = 0x00000080, /**< the operation has no arguments and is some
kind of a constant */
- irop_flag_keep = 0x00000100, /**< this operation can be kept in End's keep-alive list */
- irop_flag_machine = 0x00000200 /**< this operation is a machine operation, all higher flags are machine flags */
+ irop_flag_always_opt = 0x00000100, /**< this operation must always be optimized */
+ irop_flag_keep = 0x00000200, /**< this operation can be kept in End's keep-alive list */
+ irop_flag_machine = 0x00000400, /**< this operation is a machine operation */
+ irop_flag_machine_op = 0x00000800, /**< this operation is a machine operand */
+ irop_flag_user = 0x00001000 /**< this flag and all higher one are free for machine user */
} irop_flags;
/** The opcodes of the libFirm predefined operations. */
iro_Unknown, iro_Filter, iro_Break, iro_CallBegin, iro_EndReg, iro_EndExcept,
iro_NoMem, iro_Mux, iro_Psi, iro_CopyB,
iro_InstOf, iro_Raise, iro_Bound,
+ iro_Pin,
iro_MaxOpcode
} opcode;
+#ifndef _IR_OP_TYPEDEF_
+#define _IR_OP_TYPEDEF_
typedef struct ir_op ir_op;
+#endif
extern ir_op *op_Block; ir_op *get_op_Block (void);
extern ir_op *op_Raise; ir_op *get_op_Raise (void);
extern ir_op *op_Bound; ir_op *get_op_Bound (void);
+extern ir_op *op_Pin; ir_op *get_op_Pin (void);
+
/** Returns the ident for the opcode name */
ident *get_op_ident(const ir_op *op);
/** op_pin_state_pinned states */
typedef enum {
op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any basic block. */
- op_pin_state_pinned, /**< Nodes must remain in this basic block. */
+ op_pin_state_pinned = 1, /**< Nodes must remain in this basic block. */
op_pin_state_exc_pinned, /**< Node must be remain in this basic block if it can throw an
exception, else can float. Used internally. */
op_pin_state_mem_pinned /**< Node must be remain in this basic block if it can throw an
* io_op Operations.
*/
typedef struct {
- computed_value_func computed_value; /**< evaluates a node into a tarval if possible. */
+ computed_value_func computed_value; /**< evaluates a node into a tarval if possible. */
equivalent_node_func equivalent_node; /**< optimizes the node by returning an equivalent one. */
transform_node_func transform_node; /**< optimizes the node by transforming it. */
node_cmp_attr_func node_cmp_attr; /**< compares two node attributes. */
/** Returns the ir_op_ops of an ir_op. */
const ir_op_ops *get_op_ops(const ir_op *op);
-#endif /* _IROP_H_ */
+#endif /* _FIRM_IR_IROP_H_ */