X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=569178f93b4791bbfb7a409cb2d1ac7c474542c3;hb=cb91bddc9cacdab7c28e4336847bd3dc248aa549;hp=560476563dd159f81acc1290ced9c6af67ce36b6;hpb=df9f7454bdc1add95a34ad34464ab91ba5f719a0;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 560476563..569178f93 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -37,8 +37,6 @@ # include "irloop.h" # include "array.h" -# include "exc.h" - #include "set.h" #include "entity_t.h" #include "type_t.h" @@ -153,6 +151,28 @@ typedef struct { type *totype; } cast_attr; +/** Load attributes */ +typedef struct { + ir_mode *load_mode; /**< the mode of this Load operation */ + ent_volatility volatility; /**< the volatility of a Load/Store operation */ +#if PRECISE_EXC_CONTEXT + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +#endif +} load_attr; + +/** Store attributes */ +typedef struct { + ent_volatility volatility; /**< the volatility of a Store operation */ +#if PRECISE_EXC_CONTEXT + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +#endif +} store_attr; + +/** Exception attributes */ +typedef struct { + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +} except_attr; + typedef pn_Cmp confirm_attr; /** Attribute to hold compare operation */ /** Some irnodes just have one attribute, these are stored here, @@ -170,6 +190,8 @@ typedef union { io_attr io; /**< For InstOf */ type *f; /**< For Free. */ cast_attr cast; /**< For Cast. */ + load_attr load; /**< For Load. */ + store_attr store; /**< For Store. */ 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 @@ -184,8 +206,7 @@ typedef union { 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. */ + except_attr except; /**< For Phi node construction in case of exceptions */ #endif } attr; @@ -201,16 +222,16 @@ 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 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 */ @@ -223,6 +244,7 @@ struct ir_node { Must be last field of 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 @@ -240,11 +262,14 @@ INLINE long get_irn_proj_attr (ir_node *node); 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); +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); +load_attr get_irn_load_attr (ir_node *node); +store_attr get_irn_store_attr (ir_node *node); +except_attr get_irn_except_attr (ir_node *node); /** @} */ /*-------------------------------------------------------------------*/ @@ -316,7 +341,6 @@ __get_irn_inter_arity (const ir_node *node) { */ 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); } @@ -326,7 +350,7 @@ __get_irn_arity (const ir_node *node) { */ static INLINE ir_node * __get_irn_intra_n (ir_node *node, int n) { - return (node->in[n + 1] = skip_nop(node->in[n + 1])); + return (node->in[n + 1] = skip_Id(node->in[n + 1])); } /** @@ -337,9 +361,9 @@ __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])); + return (node->attr.filter.in_cg[n + 1] = skip_Id(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 (node->attr.block.in_cg[n + 1] = skip_Id(node->attr.block.in_cg[n + 1])); } return __get_irn_intra_n (node, n);