BugFix: equivalent_node_Bound() was too greedy, reduced to a safe minimum (now mostly...
[libfirm] / ir / ir / irtypes.h
index 4dbe313..df8915b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
 #include "irmemory.h"
 #include "callgraph.h"
 #include "field_temperature.h"
+#include "irphases_t.h"
 
 #include "pset.h"
 #include "set.h"
 #include "list.h"
 
+struct ir_phase;
+
 /** 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 op_pin_state_pinned; /**< How to deal with the node in CSE, PRE. */
+       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. */
        void *tag;              /**< Some custom pointer the op's creator can attach stuff to. */
+       void *attr;             /**< custom pointer where op's creator can attach attribute stuff to. */
 
        ir_op_ops ops;          /**< The operations of the this op. */
 };
@@ -89,7 +93,7 @@ struct ir_mode {
                                           int, float, reference ...
                                           (see irmode.h) */
        mode_arithmetic   arithmetic;    /**< different arithmetic operations possible with a mode */
-       int               size;          /**< size of the mode in Bits. */
+       unsigned          size;          /**< size of the mode in Bits. */
        unsigned          sign:1;        /**< signedness of this mode */
        unsigned int      modulo_shift;  /**< number of bits a values of this mode will be shifted */
        unsigned          vector_elem;   /**< if this is not equal 1, this is a vector mode with
@@ -132,10 +136,8 @@ typedef struct {
        ir_node ** in_cg;           /**< array with predecessors in
                                     * interprocedural_view, if they differ
                                     * from intraprocedural predecessors */
-       int *backedge;              /**< Field n set to true if pred n is backedge.
-                                        @@@ @todo Ev. replace by bit field! */
-       int *cg_backedge;           /**< Field n set to true if pred n is interprocedural backedge.
-                                        @@@ @todo Ev. replace by bit field! */
+       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. */
        ir_extblk *extblk;          /**< The extended basic block this block belongs to. */
        ir_region *region;          /**< The immediate structural region this block belongs to. */
        unsigned mb_depth;          /**< The macroblock depth: A distance from the macroblock header */
@@ -190,13 +192,13 @@ typedef struct {
 typedef struct {
        except_attr    exc;           /**< the exception attribute. MUST be the first one. */
        ir_type *type;                /**< Type of the allocated object.  */
-       where_alloc where;            /**< stack, heap or other managed part of memory */
+       ir_where_alloc where;         /**< stack, heap or other managed part of memory */
 } alloc_attr;
 
 /** Free attributes. */
 typedef struct {
        ir_type *type;                /**< Type of the allocated object.  */
-       where_alloc where;            /**< stack, heap or other managed part of memory */
+       ir_where_alloc where;         /**< stack, heap or other managed part of memory */
 } free_attr;
 
 /** InstOf attributes. */
@@ -208,9 +210,8 @@ typedef struct {
 /** Filter attributes. */
 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! */
+       ir_node **in_cg;           /**< array with interprocedural predecessors (Phi) */
+       unsigned *backedge;        /**< Raw Bitfield n set to true if pred n is backedge. */
 } filter_attr;
 
 /** CallBegin attributes. */
@@ -300,9 +301,8 @@ typedef union {
        load_attr      load;          /**< For Load. */
        store_attr     store;         /**< For Store. */
        phi0_attr      phi0;          /**< for Phi0 nodes. */
-       int            *phi_backedge; /**< For Phi after construction.
-                                          Field n set to true if pred n is backedge.
-                                          @todo Ev. replace by bitfield! */
+       unsigned       *phi_backedge; /**< For Phi after construction.
+                                          Raw Bitfield n set to true if pred n is backedge. */
        long           proj;          /**< For Proj: contains the result position to project */
        confirm_attr   confirm;       /**< For Confirm: compare operation and region. */
        filter_attr    filter;        /**< For Filter */
@@ -345,8 +345,8 @@ struct ir_node {
        struct dbg_info *dbi;    /**< A pointer to information for debug support. */
        /* ------- For debugging ------- */
 #ifdef DEBUG_libfirm
-       unsigned flags;
-       int out_valid;
+       unsigned out_valid : 1;
+       unsigned flags     : 31;
        long node_nr;            /**< A unique node number for each node to make output
                                      readable. */
 #endif
@@ -415,8 +415,7 @@ struct ir_graph {
                                            class it belongs to. */
        ir_type *frame_type;           /**< A class type representing the stack frame.
                                            Can include "inner" methods. */
-       ir_node *anchor;               /**< The anchor node. */
-       ir_node **proj_args;           /**< Projs of the methods arguments. */
+       ir_node *anchor;               /**< Pointer to the anchor node of this graph. */
        struct obstack *obst;          /**< The obstack where all of the ir_nodes live. */
        ir_node *current_block;        /**< Current block for newly gen_*()-erated ir_nodes. */
        struct obstack *extbb_obst;    /**< The obstack for extended basic block info. */
@@ -461,9 +460,9 @@ struct ir_graph {
                                                the node. */
 
        ir_graph **callers;                /**< For callgraph analysis: list of caller graphs. */
-       unsigned char *caller_isbe;        /**< For callgraph analysis: set if backedge. */
+       unsigned *caller_isbe;             /**< For callgraph analysis: raw bitset if backedge info calculated. */
        cg_callee_entry **callees;         /**< For callgraph analysis: list of callee calls */
-       unsigned char *callee_isbe;        /**< For callgraph analysis: set if backedge. */
+       unsigned *callee_isbe;             /**< For callgraph analysis: raw bitset if backedge info calculated. */
        int        callgraph_loop_depth;         /**< For callgraph analysis */
        int        callgraph_recursion_depth;    /**< For callgraph analysis */
        double     method_execution_frequency;   /**< For callgraph analysis */
@@ -482,10 +481,12 @@ 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 */
+       ir_phase *phases[PHASE_LAST];      /**< Phase information. */
 #ifdef DEBUG_libfirm
-       int             n_outs;            /**< Size wasted for outs */
-       long graph_nr;                     /**< a unique graph number for each graph to make output
-                                               readable. */
+       int   n_outs;                      /**< Size wasted for outs */
+       long graph_nr;                     /**< a unique graph number for each
+                                               graph to make output readable. */
 #endif
 
 #ifndef NDEBUG
@@ -545,10 +546,10 @@ struct ir_prog {
 
        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 */
 #ifdef DEBUG_libfirm
        long max_node_nr;                    /**< to generate unique numbers for nodes. */
 #endif
 };
 
-
 #endif