/*
- * 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.
*
#include "irprog.h"
#include "field_temperature.h"
#include "irphase.h"
+#include "bitset.h"
#include "pset.h"
#include "set.h"
* this gets too tedious)
*/
typedef enum ir_phase_id {
- PHASE_VRP,
+ PHASE_FIRST,
+ PHASE_VRP = PHASE_FIRST,
PHASE_LAST = PHASE_VRP
} ir_phase_id;
+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. */
};
/**
of all bits and must be dividable by vector_elem */
/* ----------------------------------------------------------------------- */
- tarval *min; /**< the minimum value that can be expressed */
- tarval *max; /**< the maximum value that can be expressed */
- tarval *null; /**< the value 0 */
- tarval *one; /**< the value 1 */
- tarval *minus_one; /**< the value -1 */
- tarval *all_one; /**< the value ~0 */
+ ir_tarval *min; /**< the minimum value that can be expressed */
+ ir_tarval *max; /**< the maximum value that can be expressed */
+ ir_tarval *null; /**< the value 0 */
+ ir_tarval *one; /**< the value 1 */
+ ir_tarval *minus_one; /**< the value -1 */
+ ir_tarval *all_one; /**< the value ~0 */
ir_mode *eq_signed; /**< For pointer modes, the equivalent signed integer one. */
ir_mode *eq_unsigned; /**< For pointer modes, the equivalent unsigned integer one. */
void *link; /**< To store some intermediate information */
/* ir node attributes */
/** first attribute of Bad, Block, Anchor nodes */
-typedef struct {
+typedef struct irg_attr {
ir_graph *irg; /**< The graph this block like node belongs to. */
} irg_attr;
-typedef struct {
+typedef struct bad_attr {
irg_attr irg;
} bad_attr;
+typedef struct anchor_attr {
+ irg_attr irg;
+} anchor_attr;
+
/** Block attributes */
-typedef struct {
+typedef struct block_attr {
/* General attributes */
irg_attr irg; /**< The graph this block belongs to. */
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 */
ir_node ** in_cg; /**< array with predecessors in
* interprocedural_view, if they differ
* from intraprocedural predecessors */
- unsigned *backedge; /**< Raw Bitfield n set to true if pred n is backedge.*/
- unsigned *cg_backedge; /**< Raw Bitfield n set to true if pred n is interprocedural backedge. */
+ 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 */
} block_attr;
/** Cond attributes. */
-typedef struct {
+typedef struct cond_attr {
long default_proj; /**< only for non-binary Conds: biggest Proj number, i.e. the one used for default. */
cond_jmp_predicate jmp_pred; /**< only for binary Conds: The jump predication. */
} cond_attr;
/** Const attributes. */
-typedef struct {
- tarval *tarval; /**< the target value */
- ir_type *tp; /**< the source type, for analyses. default: type_unknown. */
+typedef struct const_attr {
+ ir_tarval *tarval; /**< the target value */
} const_attr;
/** SymConst attributes. */
-typedef struct {
+typedef struct symconst_attr {
symconst_symbol sym; // old tori
symconst_kind kind;
- ir_type *tp; /**< the source type, for analyses. default: type_unknown. */
} symconst_attr;
/** Sel attributes. */
-typedef struct {
+typedef struct sel_attr {
ir_entity *entity; /**< entity to select */
} sel_attr;
/** Exception attributes. */
-typedef struct {
- 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. */
+typedef struct except_attr {
+ 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. */
-typedef struct {
+typedef struct call_attr {
except_attr exc; /**< the exception attribute. MUST be the first one. */
ir_type *type; /**< type of called procedure */
ir_entity **callee_arr; /**< result of callee analysis */
} call_attr;
/** Builtin attributes. */
-typedef struct {
+typedef struct builtin_attr {
except_attr exc; /**< the exception attribute. MUST be the first one. */
ir_builtin_kind kind; /**< kind of the called builtin procedure */
ir_type *type; /**< type of called builtin procedure */
} builtin_attr;
/** Alloc attributes. */
-typedef struct {
+typedef struct alloc_attr {
except_attr exc; /**< the exception attribute. MUST be the first one. */
ir_where_alloc where; /**< stack, heap or other managed part of memory */
ir_type *type; /**< Type of the allocated object. */
} alloc_attr;
/** Free attributes. */
-typedef struct {
+typedef struct free_attr {
ir_type *type; /**< Type of the allocated object. */
ir_where_alloc where; /**< stack, heap or other managed part of memory */
} free_attr;
/** InstOf attributes. */
-typedef struct {
+typedef struct io_attr {
except_attr exc; /**< the exception attribute. MUST be the first one. */
ir_type *type; /**< the type of which the object pointer must be */
} io_attr;
/** Cast attributes. */
-typedef struct {
+typedef struct cast_attr {
ir_type *type; /**< Type of the casted node. */
} cast_attr;
/** Load attributes. */
-typedef struct {
+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;
/** Store attributes. */
-typedef struct {
+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 {
+typedef struct phi_attr {
ir_node *next; /**< Points to the next Phi in the Phi list of a block. */
union {
- unsigned *backedge; /**< Raw Bitfield: bit n is set to true if pred n is backedge. */
+ bitset_t *backedge; /**< Raw Bitfield: bit n is set to true if pred n is backedge. */
int pos; /**< For Phi0. 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
} u;
} phi_attr;
+/**< Cmp attribute. */
+typedef struct cmp_attr {
+ ir_relation relation; /**< comparison condition. */
+} cmp_attr;
/**< Confirm attribute. */
-typedef struct {
- pn_Cmp cmp; /**< The compare operation. */
+typedef struct confirm_attr {
+ ir_relation relation; /**< relation between value and bound */
} confirm_attr;
/** CopyB attribute. */
-typedef struct {
+typedef struct copyb_attr {
except_attr exc; /**< The exception attribute. MUST be the first one. */
ir_type *type; /**< Type of the copied entity. */
} copyb_attr;
/** Bound attribute. */
-typedef struct {
+typedef struct bound_attr {
except_attr exc; /**< The exception attribute. MUST be the first one. */
} bound_attr;
/** Conv attribute. */
-typedef struct {
+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 {
+/** 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 {
+typedef struct asm_attr {
/* BEWARE: pin state MUST be the first attribute */
op_pin_state pin_state; /**< the pin state for operations that might generate a exception */
ident *text; /**< The inline assembler text. */
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 {
+typedef union ir_attr {
irg_attr irg; /**< For Blocks and Bad: its belonging irg */
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. */
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. */
-} attr;
+} ir_attr;
/**
* Edge info to put into an irn.
irn_edges_info_t edge_info; /**< Everlasting out edges. */
/* ------- Opcode depending fields -------- */
- attr attr; /**< The set of attributes of this node. Depends on opcode.
+ ir_attr attr; /**< The set of attributes of this node. Depends on opcode.
Must be last field of struct ir_node. */
};
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
};
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;
/**
struct obstack *extbb_obst; /**< The obstack for extended basic block info. */
/* -- Fields for graph properties -- */
- irg_inline_property inline_property; /**< How to handle inlineing. */
- unsigned additional_properties; /**< Additional graph properties. */
+ irg_inline_property inline_property; /**< How to handle inlineing. */
+ mtp_additional_properties additional_properties; /**< Additional graph properties. */
/* -- Fields indicating different states of irgraph -- */
ir_graph_state_t state;
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 */
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 */
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 */
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 */
#ifndef NDEBUG