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
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
- 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_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_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_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 */
iro_Load, iro_Store, iro_Alloc, iro_Free, iro_Sync,
iro_Proj, iro_Tuple, iro_Id, iro_Bad, iro_Confirm,
iro_Unknown, iro_Filter, iro_Break, iro_CallBegin, iro_EndReg, iro_EndExcept,
iro_Load, iro_Store, iro_Alloc, iro_Free, iro_Sync,
iro_Proj, iro_Tuple, iro_Id, iro_Bad, iro_Confirm,
iro_Unknown, iro_Filter, iro_Break, iro_CallBegin, iro_EndReg, iro_EndExcept,
- iro_NoMem, iro_Mux, iro_CopyB,
+ iro_NoMem, iro_Mux, iro_Psi, iro_CopyB,
iro_InstOf, iro_Raise, iro_Bound,
iro_InstOf, iro_Raise, iro_Bound,
extern ir_op *op_CopyB; ir_op *get_op_CopyB (void);
extern ir_op *op_InstOf; ir_op *get_op_InstOf (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_CopyB; ir_op *get_op_CopyB (void);
extern ir_op *op_InstOf; ir_op *get_op_InstOf (void);
extern ir_op *op_Raise; ir_op *get_op_Raise (void);
extern ir_op *op_Bound; ir_op *get_op_Bound (void);
/** 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 states */
typedef enum {
op_pin_state_floats = 0, /**< Nodes of this opcode can be placed in any 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
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
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. */
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. */