X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbechordal_t.h;h=45f27c80f68372d33bc49891a9e62ce15ab51f43;hb=77f1eeaeb90f2d231b0ccc2fcbe071a9b457e6c3;hp=3d31e02258b02166bb51d6f4297362144e06826c;hpb=99e7c98691cdd138dfb32e2e040b76dfc4c92b39;p=libfirm diff --git a/ir/be/bechordal_t.h b/ir/be/bechordal_t.h index 3d31e0225..45f27c80f 100644 --- a/ir/be/bechordal_t.h +++ b/ir/be/bechordal_t.h @@ -8,6 +8,26 @@ #ifndef _BECHORDAL_T_H #define _BECHORDAL_T_H +#include + +#include "bitset.h" +#include "list.h" +#include "obst.h" +#include "pset.h" +#include "pmap.h" +#include "set.h" + +#include "irnode.h" +#include "irgraph.h" +#include "bechordal.h" + +/** Defines an invalid register index. */ +#define NO_COLOR (-1) + +#define BUILD_GRAPH + +#define DBG_CHORDAL "firm.be.ra.chordal" + /** * A liveness interval border. */ @@ -17,7 +37,7 @@ typedef struct _border_t { #endif struct list_head list; /**< list head for queuing. */ struct _border_t *other_end; /**< The other end of the border. */ - const ir_node *irn; /**< The node. */ + ir_node *irn; /**< The node. */ unsigned step; /**< The number equal to the interval border. */ unsigned pressure; /**< The pressure at this interval border. (The border itself is counting). */ @@ -27,6 +47,58 @@ typedef struct _border_t { a block, each value has one begin and one end. */ } border_t; -extern void be_ra_chordal_spill(ir_graph *irg); +/** + * Environment for each of the chordal register allocator phases + */ +struct _be_chordal_env_t { + struct obstack obst; /**< An obstack for temporary storage. */ + pmap *border_heads; /**< Maps blocks to border heads. */ + ir_graph *irg; /**< The graph the reg alloc is running on. */ + +#ifdef BUILD_GRAPH + set *nodes; /**< The interference graph nodes. */ + set *edges; /**< The interference graph edges. */ +#endif + + bitset_t *live; /**< A liveness bitset. */ + bitset_t *colors; /**< The color mask. */ + bitset_t *in_colors; /**< Colors used by live in values. */ + int colors_n; /**< The number of colors. */ + const arch_env_t *arch_env; /**< The arch interface environment. */ + const arch_register_class_t *cls; /**< The current register class. */ + void *data; /**< Some pointer, to which different + phases can attach data to. */ +}; + +static INLINE struct list_head * +_get_block_border_head(const be_chordal_env_t *inf, ir_node *bl) +{ + return pmap_get(inf->border_heads, bl); +} + +#define get_block_border_head(info, bl) _get_block_border_head(info, bl) + +int nodes_interfere(const be_chordal_env_t *env, const ir_node *a, const ir_node *b); + +#ifdef BUILD_GRAPH +typedef struct _if_node_t { + int nnr; + pset *neighb; +} if_node_t; + +typedef struct _if_edge_t { + int src, tgt; +} if_edge_t; + +set *be_ra_get_ifg_edges(const be_chordal_env_t *env); +set *be_ra_get_ifg_nodes(const be_chordal_env_t *env); +int ifg_has_edge(const be_chordal_env_t *env, const if_node_t *n1, const if_node_t* n2); + +#define ifn_get_degree(ifnode) pset_count(ifnode->neighb) +#define foreach_neighb(ifnode, curr) \ + for(curr=pset_first(ifnode->neighb); curr; curr=pset_next(ifnode->neighb)) +#endif + +extern void be_ra_chordal_spill(be_chordal_env_t *env); #endif /* _BECHORDAL_T_H */