X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbera_t.h;h=6d88f6a96c378fdca8f4741570a8c7721df2adc6;hb=321ae93c651a24f17e2b7540e67a959db803c40d;hp=3c36ca83351c00ab69091596a9eddfd35d6f8092;hpb=9b060a71a2667ced8d103023eda0ff710e799867;p=libfirm diff --git a/ir/be/bera_t.h b/ir/be/bera_t.h index 3c36ca833..6d88f6a96 100644 --- a/ir/be/bera_t.h +++ b/ir/be/bera_t.h @@ -4,27 +4,41 @@ * @date 8.12.2004 */ -#ifndef _BERA_H -#define _BERA_H +#ifndef _BERA_T_H +#define _BERA_T_H #include "firm_config.h" +#include "bitset.h" + +#include "bera.h" + +#define DBG_BERA "firm.be.ra" + +typedef struct _ra_node_info_t { + int pressure; /**< Register pressure at this node. */ + int color; /**< The color assigned to this node. */ +} ra_node_info_t; + +typedef struct _ra_block_info_t { + bitset_t *used_colors; /**< A bitmask containing all colors used in the block. */ +} ra_block_info_t; /** * Register allocation data for a node. */ typedef struct _ra_info_t { - int pressure; /**< Register pressure at this node. */ - int color; /**< The color assigned to this node. */ - int sim_live_phi_n; /**< The number of simulatenously live phi operand. - This is only used if the ir node occurs as an - operand to a phi function. */ - int *sim_live_phi; /**< The array of simultaneously live nodes. Same restrictions - like @c sim_live_phi hold here. */ + union { + ra_node_info_t node; + ra_block_info_t block; + } v; } ra_info_t; -#define get_irn_ra_info(irn) get_irn_data(irn, ra_info_t, ra_irn_data_offset) +#define get_ra_irn_info(irn) get_irn_data(irn, ra_info_t, ra_irn_data_offset) #define get_ra_info_irn(inf) get_irn_data_base(inf, ra_irn_data_offset) +#define get_ra_node_info(the_node) (&get_ra_irn_info(the_node)->v.node) +#define get_ra_block_info(the_block) (&get_ra_irn_info(the_block)->v.block) + extern size_t ra_irn_data_offset; extern size_t ra_irg_data_offset; @@ -52,16 +66,19 @@ void be_ra_init(void); static INLINE int __get_irn_color(const ir_node *irn) { - return get_irn_ra_info(irn)->color; + assert(!is_Block(irn) && "No block allowed here"); + return get_ra_node_info(irn)->color; } static INLINE void __set_irn_color(const ir_node *irn, int color) { - get_irn_ra_info(irn)->color = color; + assert(!is_Block(irn) && "No block allowed here"); + get_ra_node_info(irn)->color = color; } static INLINE int __is_allocatable_irn(const ir_node *irn) { + assert(!is_Block(irn) && "No block allowed here"); return mode_is_datab(get_irn_mode(irn)); }