X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbechordal_t.h;h=071990dfb9a17b68a535e949ac0464afcca0353b;hb=7ce0bb4ead9ca9c526a3a26bb8469915bf966f12;hp=3ec3527ab20e43c657dbc2c7c430be8366e940b1;hpb=d3574fcc5c50023d68c5588e8a2a20378121e39e;p=libfirm diff --git a/ir/be/bechordal_t.h b/ir/be/bechordal_t.h index 3ec3527ab..071990dfb 100644 --- a/ir/be/bechordal_t.h +++ b/ir/be/bechordal_t.h @@ -19,7 +19,9 @@ #include "irnode.h" #include "irgraph.h" -#include "bechordal.h" + +#include "be_t.h" +#include "bearch.h" /** Defines an invalid register index. */ #define NO_COLOR (-1) @@ -50,8 +52,8 @@ typedef struct _border_t { */ 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. */ + const be_main_session_env_t *session_env; /**< The current session. */ + pmap *border_heads; /**< Maps blocks to border heads. */ #ifdef BUILD_GRAPH set *nodes; /**< The interference graph nodes. */ @@ -62,15 +64,14 @@ struct _be_chordal_env_t { 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 + 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) -{ +typedef struct _be_chordal_env_t be_chordal_env_t; + +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); } @@ -90,6 +91,7 @@ typedef struct _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) @@ -99,4 +101,41 @@ int ifg_has_edge(const be_chordal_env_t *env, const if_node_t *n1, const if_node extern void be_ra_chordal_spill(be_chordal_env_t *env); +/** + * Allocate registers for an ir graph. + * @param irg The graph. + * @return Some internal data to be freed with be_ra_chordal_done(). + */ +be_chordal_env_t *be_ra_chordal( + const be_main_session_env_t *env, + const arch_register_class_t *cls); + +/** + * Check current register allocation for correctness. + * Interfering nodes have different colors + * Register constraints + * O(n^2) + */ +void be_ra_chordal_check(be_chordal_env_t *chordal_env); + +/** + * Free data from the chordal register allocation. + * @param irg The graph. + */ +void be_ra_chordal_done(be_chordal_env_t *info); + +/** + * Init some things for the chordal register allocator. + * This must be called before Firm is inited. + */ +void be_ra_chordal_init(void); + +/** + * Check the register pressure in a graph. + * @param env The sesion env. + * @param cls The register class to consider. + */ +void be_check_pressure(const be_main_session_env_t *env, const arch_register_class_t *cls); + + #endif /* _BECHORDAL_T_H */