X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=518c63c6db9950725d895dd50af306864e8dd30e;hb=19975388facbb3943fbc2aa2f5f9422350bb5cb3;hp=f8c9c0d1ce67c1e256ee8fb5fe088b85579104ca;hpb=e8fda67a81f7bc1dc7de1d3b5ba7caf0035f7d21;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index f8c9c0d1c..518c63c6d 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -29,9 +29,13 @@ # include "irnode.h" # include "irop_t.h" +# include "irgraph_t.h" +# include "irflag_t.h" # include "firm_common_t.h" # include "irdom_t.h" /* For size of struct dom_info. */ # include "dbginfo.h" +# include "irloop.h" +# include "array.h" # include "exc.h" @@ -47,32 +51,32 @@ typedef struct { struct ir_node **graph_arr; /**< array to store all parameters */ /* Attributes holding analyses information */ struct dom_info dom; /**< Datastructure that holds information about dominators. - @@@ @todo - Eventually overlay with graph_arr as only valid - in different phases. Eventually inline the whole - datastructure. */ - // exc_t exc; /**< role of this block for exception handling */ - // ir_node *handler_entry; /**< handler entry block iff this block is part of a region */ + @@@ @todo + Eventually overlay with graph_arr as only valid + in different phases. Eventually inline the whole + datastructure. */ + /* exc_t exc; */ /**< role of this block for exception handling */ + /* ir_node *handler_entry; */ /**< handler entry block iff this block is part of a region */ ir_node ** in_cg; /**< array with predecessors in - * interprocedural_view, if they differ - * from intraprocedural predecessors */ + * interprocedural_view, if they differ + * from intraprocedural predecessors */ int *backedge; /**< Field n set to true if pred n is backedge. - @@@ @todo Ev. replace by bitfield! */ + @@@ @todo Ev. replace by bitfield! */ int *cg_backedge; /**< Field n set to true if pred n is interprocedural backedge. - @@@ @todo Ev. replace by bitfield! */ + @@@ @todo Ev. replace by bitfield! */ } block_attr; /** Start attributes */ typedef struct { char dummy; - // ir_graph *irg; @@@ now in block + /* ir_graph *irg; @@@ now in block */ } start_attr; /** Cond attributes */ typedef struct { cond_kind kind; /**< flavor of Cond */ long default_proj; /**< for optimization: biggest Proj number, i.e. the one - used for default. */ + used for default. */ } cond_attr; /** Const attributes */ @@ -127,22 +131,22 @@ typedef struct { long proj; /**< contains the result position to project (Proj) */ ir_node ** in_cg; /**< array with interprocedural predecessors (Phi) */ int *backedge; /**< Field n set to true if pred n is backedge. - @todo Ev. replace by bitfield! */ + @todo Ev. replace by bitfield! */ } filter_attr; /** EndReg/EndExcept attributes */ typedef struct { char dummy; - // ir_graph * irg; /**< ir_graph this node belongs to (for - // * navigating in interprocedural graphs) - // @@@ now in block */ + /* ir_graph * irg; */ /**< ir_graph this node belongs to (for */ + /* * navigating in interprocedural graphs) */ + /* @@@ now in block */ } end_attr; /** CallBegin attributes */ typedef struct { - // ir_graph * irg; / **< ir_graph this node belongs to (for - // * navigating in interprocedural graphs) */ - // @@@ now in block + /* ir_graph * irg; */ /**< ir_graph this node belongs to (for */ + /* * navigating in interprocedural graphs) */ + /* @@@ now in block */ ir_node * call; /**< associated Call-operation */ } callbegin_attr; @@ -165,25 +169,25 @@ typedef union { call_attr call; /**< For Call: pointer to the type of the method to call */ callbegin_attr callbegin; /**< For CallBegin */ alloc_attr a; /**< For Alloc. */ - io_attr io; /**< For InstOf */ - type *f; /**< For Free. */ + io_attr io; /**< For InstOf */ + type *f; /**< For Free. */ cast_attr cast; /**< For Cast. */ int phi0_pos; /**< For Phi. Used to remember the value defined by - this Phi node. Needed when the Phi is completed - to call get_r_internal_value to find the - predecessors. If this attribute is set, the Phi - node takes the role of the obsolete Phi0 node, - therefore the name. */ + this Phi node. Needed when the Phi is completed + to call get_r_internal_value to find the + predecessors. If this attribute is set, the Phi + node takes the role of the obsolete Phi0 node, + therefore the name. */ int *phi_backedge; /**< For Phi after construction. - Field n set to true if pred n is backedge. - @todo Ev. replace by bitfield! */ + Field n set to true if pred n is backedge. + @todo Ev. replace by bitfield! */ long proj; /**< For Proj: contains the result position to project */ confirm_attr confirm_cmp; /**< For Confirm: compare operation */ filter_attr filter; /**< For Filter */ end_attr end; /**< For EndReg, EndExcept */ #if PRECISE_EXC_CONTEXT struct ir_node **frag_arr; /**< For Phi node construction in case of exceptions - for nodes Store, Load, Div, Mod, Quot, DivMod. */ + for nodes Store, Load, Div, Mod, Quot, DivMod. */ #endif } attr; @@ -199,16 +203,20 @@ struct ir_node { struct ir_node **in; /**< array with predecessors / operands */ void *link; /**< to attach additional information to the node, e.g. used while construction to link Phi0 nodes and - during optimization to link to nodes that - shall replace a node. */ + during optimization to link to nodes that + shall replace a node. */ /* ------- Fields for optimizations / analysis information ------- */ struct ir_node **out; /**< array of out edges */ struct dbg_info* dbi; /**< A pointer to information for debug support. */ /* ------- For debugging ------- */ #ifdef DEBUG_libfirm + int out_valid; /** < indicate that out edges are valid */ int node_nr; /**< a unique node number for each node to make output - readable. */ + readable. */ #endif + /* ------- For analyses -------- */ + ir_loop *loop; /**< the loop the node is in. Access routines in irloop.h */ + /* ------- Opcode depending fields -------- */ attr attr; /**< attribute of this node. Depends on opcode. Must be last field of struct ir_node. */ }; @@ -216,14 +224,14 @@ struct ir_node { /** Copies all attributes stored in the old node to the new node. Assumes both have the same opcode and sufficient size. */ void -copy_attrs (ir_node *old, ir_node *new); +copy_attrs(const ir_node *old_node, ir_node *new_node); /** Returns the array with the ins. The content of the array may not be changed. */ ir_node **get_irn_in (const ir_node *node); -/*@{*/ +/** @{ */ /** access attributes directly */ INLINE const_attr get_irn_const_attr (ir_node *node); INLINE long get_irn_proj_attr (ir_node *node); @@ -231,9 +239,241 @@ INLINE alloc_attr get_irn_alloc_attr (ir_node *node); INLINE type *get_irn_free_attr (ir_node *node); INLINE symconst_attr get_irn_symconst_attr (ir_node *node); type *get_irn_call_attr (ir_node *node); +type *get_irn_funccall_attr (ir_node *node); sel_attr get_irn_sel_attr (ir_node *node); int get_irn_phi_attr (ir_node *node); block_attr get_irn_block_attr (ir_node *node); -/*@}*/ +/** @} */ + +/*-------------------------------------------------------------------*/ +/* These function are most used in libfirm. Give them as static */ +/* functions so they can be inlined. */ +/*-------------------------------------------------------------------*/ + +/** + * Checks whether a pointer points to a ir node. + * Intern version for libFirm. + */ +static INLINE int +__is_ir_node (const void *thing) { + return (get_kind(thing) == k_ir_node); +} + +/** + * Gets the op of a node. + * Intern version for libFirm. + */ +static INLINE ir_op * +__get_irn_op (const ir_node *node) +{ + assert (node); + return node->op; +} + +/** + * Gets the opcode of a node. + * Intern version for libFirm. + */ +static INLINE opcode +__get_irn_opcode (const ir_node *node) +{ + assert (k_ir_node == get_kind(node)); + assert (node -> op); + return node->op->code; +} + +/** + * Returns the number of predecessors without the block predecessor. + * Intern version for libFirm. + */ +static INLINE int +__get_irn_intra_arity (const ir_node *node) { + assert(node); + return ARR_LEN(node->in) - 1; +} + +/** + * Returns the number of predecessors without the block predecessor. + * Intern version for libFirm. + */ +static INLINE int +__get_irn_inter_arity (const ir_node *node) { + assert(node); + if (__get_irn_opcode(node) == iro_Filter) { + assert(node->attr.filter.in_cg); + return ARR_LEN(node->attr.filter.in_cg) - 1; + } else if (__get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) { + return ARR_LEN(node->attr.block.in_cg) - 1; + } + return __get_irn_intra_arity(node); +} + +/** + * Returns the number of predecessors without the block predecessor. + * Intern version for libFirm. + */ +static INLINE int +__get_irn_arity (const ir_node *node) { + assert(node); + if (interprocedural_view) return __get_irn_inter_arity(node); + return __get_irn_intra_arity(node); +} + +/** + * Intern version for libFirm. + */ +static INLINE ir_node * +__get_irn_intra_n (ir_node *node, int n) { + return (node->in[n + 1] = skip_nop(node->in[n + 1])); +} + +/** + * Intern version for libFirm. + */ +static INLINE ir_node* +__get_irn_inter_n (ir_node *node, int n) { + /* handle Filter and Block specially */ + if (__get_irn_opcode(node) == iro_Filter) { + assert(node->attr.filter.in_cg); + return (node->attr.filter.in_cg[n + 1] = skip_nop(node->attr.filter.in_cg[n + 1])); + } else if (__get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) { + return (node->attr.block.in_cg[n + 1] = skip_nop(node->attr.block.in_cg[n + 1])); + } + + return __get_irn_intra_n (node, n); +} + +/** + * Access to the predecessors of a node. + * To iterate over the operands iterate from 0 to i < get_irn_arity(), + * to iterate including the Block predecessor iterate from i = -1 to + * i < get_irn_arity. + * If it is a block, the entry -1 is NULL. + * Intern version for libFirm. + */ +static INLINE ir_node * +__get_irn_n (ir_node *node, int n) { + assert(node); assert(-1 <= n && n < __get_irn_arity(node)); + if (interprocedural_view) return __get_irn_inter_n (node, n); + return __get_irn_intra_n (node, n); +} + +/** + * Gets the mode of a node. + * Intern version for libFirm. + */ +static INLINE ir_mode * +__get_irn_mode (const ir_node *node) +{ + assert (node); + return node->mode; +} + +/** + * Sets the mode of a node. + * Intern version of libFirm. + */ +static INLINE void +__set_irn_mode (ir_node *node, ir_mode *mode) +{ + assert (node); + node->mode = mode; +} + +/** + * Gets the visited counter of a node. + * Intern version for libFirm. + */ +static INLINE unsigned long +__get_irn_visited (const ir_node *node) +{ + assert (node); + return node->visited; +} + +/** + * Sets the visited counter of a node. + * Intern version for libFirm. + */ +static INLINE void +__set_irn_visited (ir_node *node, unsigned long visited) +{ + assert (node); + node->visited = visited; +} + +/** + * Mark a node as visited in a graph. + * Intern version for libFirm. + */ +static INLINE void +__mark_irn_visited (ir_node *node) { + assert (node); + node->visited = current_ir_graph->visited; +} + +/** + * Returns non-zero if a node of was visited. + * Intern version for libFirm. + */ +static INLINE int +__irn_visited(const ir_node *node) { + assert (node); + return (node->visited >= current_ir_graph->visited); +} + +/** + * Returns non-zero if a node of was NOT visited. + * Intern version for libFirm. + */ +static INLINE int +__irn_not_visited(const ir_node *node) { + assert (node); + return (node->visited < current_ir_graph->visited); +} + +/** + * Sets the link of a node. + * Intern version of libFirm. + */ +static INLINE void +__set_irn_link(ir_node *node, void *link) { + assert (node); + /* Link field is used for Phi construction and various optimizations + in iropt. */ + assert(get_irg_phase_state(current_ir_graph) != phase_building); + + node->link = link; +} + +/** + * Returns the link of a node. + * Intern version of libFirm. + */ +static INLINE void * +__get_irn_link(const ir_node *node) { + assert (node); + return node->link; +} + +/* this section MUST contain all inline functions */ +#define is_ir_node(thing) __is_ir_node(thing) +#define get_irn_intra_arity(node) __get_irn_intra_arity(node) +#define get_irn_inter_arity(node) __get_irn_inter_arity(node) +#define get_irn_arity(node) __get_irn_arity(node) +#define get_irn_intra_n(node, n) __get_irn_intra_n(node, n) +#define get_irn_inter_n(node, n) __get_irn_inter_n(node, n) +#define get_irn_n(node, n) __get_irn_n(node, n) +#define get_irn_mode(node) __get_irn_mode(node) +#define set_irn_mode(node, mode) __set_irn_mode(node, mode) +#define get_irn_op(node) __get_irn_op(node) +#define get_irn_opcode(node) __get_irn_opcode(node) +#define get_irn_visited(node) __get_irn_visited(node) +#define set_irn_visited(node, v) __set_irn_visited(node, v) +#define mark_irn_visited(node) __mark_irn_visited(node) +#define irn_visited(node) __irn_visited(node) +#define irn_not_visited(node) __irn_not_visited(node) +#define set_irn_link(node, link) __set_irn_link(node, link) +#define get_irn_link(node) __get_irn_link(node) # endif /* _IRNODE_T_H_ */