X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firop_t.h;h=df27ec690980ec1b6b3289b2470d5ce600d20395;hb=265829494264529c53e5180a56cc9f1196346385;hp=b5e5c702a34694ead2d7a08bd5f88c777502308c;hpb=ae298d4a4c367832cdfaac98464ce341f30f6f4f;p=libfirm diff --git a/ir/ir/irop_t.h b/ir/ir/irop_t.h index b5e5c702a..df27ec690 100644 --- a/ir/ir/irop_t.h +++ b/ir/ir/irop_t.h @@ -79,6 +79,19 @@ typedef ir_node *(*transform_node_func)(ir_node *n); */ typedef int (*node_cmp_attr_func)(ir_node *a, ir_node *b); +/** + * The reassociation operation. + * Called from a walker. Returns non-zero if + * a reassociation rule was applied. + */ +typedef int (*reassociate_func)(ir_node *n); + +/** + * The copy attribute operation. + * Copy the node attributes from a 'old' node to a 'new' one. + */ +typedef void (*copy_attr_func)(const ir_node *old_node, ir_node *new_node); + /** The type of an ir_op. */ struct ir_op { opcode code; /**< the unique opcode of the op */ @@ -94,6 +107,8 @@ struct ir_op { 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. */ + reassociate_func reassociate; /**< reassociate a tree */ + copy_attr_func copy_attr; /**< copy node attributes */ }; /** @@ -124,6 +139,12 @@ void init_op(void); /** Free memory used by irop module. */ void finish_op(void); +/** + * Copies simply all attributes stored in the old node to the new node. + * Assumes both have the same opcode and sufficient size. + */ +void default_copy_attr(const ir_node *old_node, ir_node *new_node); + /** Returns the attribute size of nodes of this opcode. @note Use not encouraged, internal feature. */ static INLINE int get_op_attr_size (const ir_op *op) {