X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firtypes.h;h=73b44cb6e4aa951f089318619f63c7b35c07beaf;hb=4483fd1671b94b61ed147d0247b313ee9b19f754;hp=96da35bcf11ece239b8dcf062edd4e14cd9fcfb5;hpb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;p=libfirm diff --git a/ir/ir/irtypes.h b/ir/ir/irtypes.h index 96da35bcf..73b44cb6e 100644 --- a/ir/ir/irtypes.h +++ b/ir/ir/irtypes.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2011 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -34,11 +34,9 @@ #include "iredgekinds.h" #include "irtypeinfo.h" #include "irextbb.h" -#include "execution_frequency.h" #include "irmemory.h" #include "callgraph.h" #include "irprog.h" -#include "field_temperature.h" #include "irphase.h" #include "bitset.h" @@ -61,17 +59,25 @@ ENUM_COUNTABLE(ir_phase_id) /** The type of an ir_op. */ struct ir_op { - unsigned code; /**< The unique opcode of the op. */ - ident *name; /**< The name of the op. */ - size_t attr_size; /**< Space needed in memory for private attributes. */ - op_pin_state pin_state; /**< How to deal with the node in CSE, PRE. */ - op_arity opar; /**< The arity of operator. */ - int op_index; /**< The index of the first data operand, 0 for most cases, 1 for Div etc. */ - unsigned flags; /**< Flags describing the behavior of the ir_op, a bitmasks of irop_flags. */ - unsigned tag; /**< Some custom TAG value the op's creator set to. */ - void *attr; /**< custom pointer where op's creator can attach attribute stuff to. */ - - ir_op_ops ops; /**< The operations of the this op. */ + unsigned code; /**< The unique opcode of the op. */ + ident *name; /**< The name of the op. */ + size_t attr_size; /**< Space needed in memory for private attributes + */ + op_pin_state pin_state; /**< How to deal with the node in CSE, PRE. */ + op_arity opar; /**< The arity of operator. */ + int op_index; /**< The index of the first data operand, 0 for + most cases, 1 for Div etc. */ + int fragile_mem_index; /**< index of memory input for fragile nodes */ + int pn_x_regular; /**< for fragile ops the position of the + X_regular output */ + int pn_x_except; /**< for fragile ops the position of the + X_except output */ + unsigned flags; /**< Flags describing the behavior of the ir_op, + a bitmasks of irop_flags. */ + unsigned tag; /**< Some custom TAG value the op's creator set */ + void *attr; /**< custom pointer where op's creator can attach + attribute stuff to. */ + ir_op_ops ops; /**< The operations of the this op. */ }; /** @@ -148,7 +154,6 @@ typedef struct block_attr { ir_visited_t block_visited; /**< For the walker that walks over all blocks. */ /* Attributes private to construction: */ unsigned is_matured:1; /**< If set, all in-nodes of the block are fixed. */ - unsigned is_dead:1; /**< If set, the block is dead (and could be replace by a Bad. */ unsigned marked:1; /**< Can be set/unset to temporary mark a block. */ ir_node **graph_arr; /**< An array to store all parameters. */ /* Attributes holding analyses information */ @@ -164,7 +169,6 @@ typedef struct block_attr { bitset_t *backedge; /**< Bitfield n set to true if pred n is backedge.*/ bitset_t *cg_backedge; /**< Bitfield n set to true if pred n is interprocedural backedge. */ ir_extblk *extblk; /**< The extended basic block this block belongs to. */ - ir_region *region; /**< The immediate structural region this block belongs to. */ ir_entity *entity; /**< entitiy representing this block */ ir_node *phis; /**< The list of Phi nodes in this block. */ @@ -195,9 +199,12 @@ typedef struct sel_attr { /** Exception attributes. */ typedef struct except_attr { - op_pin_state pin_state; /**< the pin state for operations that might generate a exception: - If it's know that no exception will be generated, could be set to - op_pin_state_floats. */ + unsigned pin_state : 2; /**< the pin state for operations with + variable pinned state. Contains a + op_pin_state */ + unsigned throws_exception : 1; /**< if true a fragile op throws and + must produce X_except and X_regular + values */ } except_attr; /** Call attributes. */ @@ -243,7 +250,7 @@ typedef struct cast_attr { typedef struct load_attr { except_attr exc; /**< The exception attribute. MUST be the first one. */ unsigned volatility:1; /**< The volatility of this Load operation. */ - unsigned aligned:1; /**< The align attribute of this Load operation. */ + unsigned unaligned:1; /**< The align attribute of this Load operation. */ ir_mode *mode; /**< The mode of this Load operation. */ } load_attr; @@ -251,7 +258,7 @@ typedef struct load_attr { typedef struct store_attr { except_attr exc; /**< the exception attribute. MUST be the first one. */ unsigned volatility:1; /**< The volatility of this Store operation. */ - unsigned aligned:1; /**< The align attribute of this Store operation. */ + unsigned unaligned:1; /**< The align attribute of this Store operation. */ } store_attr; typedef struct phi_attr { @@ -267,10 +274,14 @@ typedef struct phi_attr { } u; } phi_attr; +/**< Cmp attribute. */ +typedef struct cmp_attr { + ir_relation relation; /**< comparison condition. */ +} cmp_attr; /**< Confirm attribute. */ typedef struct confirm_attr { - pn_Cmp cmp; /**< The compare operation. */ + ir_relation relation; /**< relation between value and bound */ } confirm_attr; /** CopyB attribute. */ @@ -289,12 +300,18 @@ typedef struct conv_attr { char strict; /**< If set, this is a strict Conv that cannot be removed. */ } conv_attr; -/** Div/Mod/DivMod/Quot attribute. */ -typedef struct divmod_attr { +/** Div attribute. */ +typedef struct div_attr { except_attr exc; /**< The exception attribute. MUST be the first one. */ ir_mode *resmode; /**< Result mode for the division. */ char no_remainder; /**< Set, if known that a division can be done without a remainder. */ -} divmod_attr; +} div_attr; + +/** Mod attribute. */ +typedef struct mod_attr { + except_attr exc; /**< The exception attribute. MUST be the first one. */ + ir_mode *resmode; /**< Result mode for the division. */ +} mod_attr; /** Inline Assembler support attribute. */ typedef struct asm_attr { @@ -306,6 +323,10 @@ typedef struct asm_attr { ident **clobbers; /**< List of clobbered registers. */ } asm_attr; +typedef struct proj_attr { + long proj; /**< position of tuple sub-value which is projected */ +} proj_attr; + /** Some IR-nodes just have one attribute, these are stored here, some have more. Their name is 'irnodename_attr' */ typedef union ir_attr { @@ -313,6 +334,7 @@ typedef union ir_attr { bad_attr bad; /**< for Bads: irg reference */ anchor_attr anchor; /**< for Anchor: irg reference */ block_attr block; /**< For Block: Fields needed to construct it */ + cmp_attr cmp; /**< For Cmp. */ cond_attr cond; /**< For Cond. */ const_attr con; /**< For Const: contains the value of the constant and a type */ symconst_attr symc; /**< For SymConst. */ @@ -326,13 +348,14 @@ typedef union ir_attr { load_attr load; /**< For Load. */ store_attr store; /**< For Store. */ phi_attr phi; /**< For Phi. */ - long proj; /**< For Proj: contains the result position to project */ + proj_attr proj; /**< For Proj. */ confirm_attr confirm; /**< For Confirm: compare operation and region. */ except_attr except; /**< For Phi node construction in case of exceptions */ copyb_attr copyb; /**< For CopyB operation */ bound_attr bound; /**< For Bound operation */ conv_attr conv; /**< For Conv operation */ - divmod_attr divmod; /**< For Div/Mod/DivMod operation */ + div_attr div; /**< For Div operation */ + mod_attr mod; /**< For Mod operation */ asm_attr assem; /**< For ASM operation. */ } ir_attr; @@ -415,12 +438,8 @@ enum irg_anchors { anchor_start, /**< start node of this ir_graph */ anchor_initial_exec, /**< methods initial control flow */ anchor_frame, /**< methods frame */ - anchor_tls, /**< pointer to the thread local storage containing all - thread local data. */ anchor_initial_mem, /**< initial memory of this graph */ anchor_args, /**< methods arguments */ - anchor_bad, /**< bad node of this ir_graph, the one and - only in this graph */ anchor_no_mem, /**< NoMem node of this ir_graph, the one and only in this graph */ anchor_last }; @@ -429,7 +448,7 @@ enum irg_anchors { typedef struct cg_callee_entry { ir_graph *irg; /**< The called irg. */ ir_node **call_list; /**< The list of all calls to the irg. */ - int max_depth; /**< Maximum depth of all Call nodes to irg. */ + size_t max_depth; /**< Maximum depth of all Call nodes to irg. */ } cg_callee_entry; /** @@ -457,16 +476,9 @@ struct ir_graph { ir_graph_state_t state; irg_phase_state phase_state; /**< Compiler phase. */ op_pin_state irg_pinned_state; /**< Flag for status of nodes. */ - irg_outs_state outs_state; /**< Out edges. */ - irg_dom_state dom_state; /**< Dominator state information. */ - irg_dom_state pdom_state; /**< Post Dominator state information. */ ir_typeinfo_state typeinfo_state; /**< Validity of type information. */ irg_callee_info_state callee_info_state; /**< Validity of callee information. */ - irg_loopinfo_state loopinfo_state; /**< State of loop information. */ ir_class_cast_state class_cast_state; /**< Kind of cast operations in code. */ - irg_extblk_info_state extblk_state; /**< State of extended basic block info. */ - exec_freq_state execfreq_state; /**< Execution frequency state. */ - ir_entity_usage_computed_state entity_usage_state; unsigned mem_disambig_opt; /**< Options for the memory disambiguator. */ unsigned fp_model; /**< floating point model of the graph. */ @@ -489,8 +501,8 @@ struct ir_graph { cg_callee_entry **callees; /**< For callgraph analysis: list of callee calls */ unsigned *callee_isbe; /**< For callgraph analysis: raw bitset if backedge info calculated. */ ir_loop *l; /**< For callgraph analysis. */ - int callgraph_loop_depth; /**< For callgraph analysis */ - int callgraph_recursion_depth; /**< For callgraph analysis */ + size_t callgraph_loop_depth; /**< For callgraph analysis */ + size_t callgraph_recursion_depth; /**< For callgraph analysis */ double method_execution_frequency; /**< For callgraph analysis */ @@ -508,7 +520,7 @@ struct ir_graph { irg_edges_info_t edge_info; /**< edge info for automatic outs */ ir_node **idx_irn_map; /**< Array mapping node indexes to nodes. */ - int index; /**< a unique number for each graph */ + size_t index; /**< a unique number for each graph */ ir_phase *phases[PHASE_LAST+1]; /**< Phase information. */ void *be_data; /**< backend can put in private data here */ @@ -558,10 +570,8 @@ struct ir_prog { /* -- states of and access to generated information -- */ irg_phase_state phase_state; /**< The state of construction. */ - irg_outs_state outs_state; /**< The state of out edges of ir nodes. */ ir_node **ip_outedges; /**< A huge Array that contains all out edges in interprocedural view. */ - irg_outs_state trouts_state; /**< The state of out edges of type information. */ irg_callee_info_state callee_info_state; /**< Validity of callee information. Contains the lowest value or all irgs. */ @@ -572,20 +582,19 @@ struct ir_prog { irp_callgraph_state callgraph_state; /**< The state of the callgraph. */ ir_loop *outermost_cg_loop; /**< For callgraph analysis: entry point to looptree over callgraph. */ - int max_callgraph_loop_depth; /**< needed in callgraph. */ - int max_callgraph_recursion_depth; /**< needed in callgraph. */ + size_t max_callgraph_loop_depth; /**< needed in callgraph. */ + size_t max_callgraph_recursion_depth; /**< needed in callgraph. */ double max_method_execution_frequency; /**< needed in callgraph. */ - irp_temperature_state temperature_state; /**< accumulated temperatures computed? */ - exec_freq_state execfreq_state; /**< The state of execution frequency information */ loop_nesting_depth_state lnd_state; /**< The state of loop nesting depth information. */ ir_class_cast_state class_cast_state; /**< The state of cast operations in code. */ ir_entity_usage_computed_state globals_entity_usage_state; ir_exc_region_t last_region_nr; /**< The last exception region number that was assigned. */ ir_label_t last_label_nr; /**< The highest label number for generating unique labels. */ - int max_irg_idx; /**< highest unused irg index */ + size_t max_irg_idx; /**< highest unused irg index */ long max_node_nr; /**< to generate unique numbers for nodes. */ unsigned dump_nr; /**< number of program info dumps */ + unsigned optimization_dumps :1; /**< dump irg on each optimization */ #ifndef NDEBUG ir_resources_t reserved_resources; /**< Bitset for tracking used global resources. */ #endif