* 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
+ 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_keep = 0x00000100, /**< this operation can be kept in End's keep-alive list */
+ irop_flag_machine = 0x00000200, /**< this operation is a machine operation */
+ irop_flag_machine_op = 0x00000400, /**< this operation is a machine operand */
+ irop_flag_user = 0x00000800 /**< this flag and all higher one are free for machine user */
} irop_flags;
/** The opcodes of the libFirm predefined operations. */
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_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_NoMem; ir_op *get_op_NoMem (void);
extern ir_op *op_Mux; ir_op *get_op_Mux (void);
+extern ir_op *op_Psi; ir_op *get_op_Psi (void);
extern ir_op *op_CopyB; ir_op *get_op_CopyB (void);
extern ir_op *op_InstOf; ir_op *get_op_InstOf (void);
* 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_ */