affinity_edge_t **affinity_edges;
set *memperms;
set_frame_entity_func set_frame_entity;
+ bool at_begin; /**< frame entities should be allocate at
+ the beginning of the stackframe */
};
/** Compare 2 affinity edges (used in quicksort) */
const ir_mode *mode, int align)
{
ir_node *spillnode = get_memory_edge(node);
- spill_t *spill;
assert(spillnode != NULL);
/* walk upwards and collect all phis and spills on this way */
if (is_Phi(spillnode)) {
- spill = collect_memphi(env, spillnode, mode, align);
+ collect_memphi(env, spillnode, mode, align);
} else {
- spill = collect_spill(env, spillnode, mode, align);
+ collect_spill(env, spillnode, mode, align);
}
ARR_APP1(ir_node *, env->reloads, node);
DEBUG_ONLY(
memset(spilllist, 0, spillcount * sizeof(spilllist[0]));
- );
+ )
i = 0;
foreach_set(env->spills, spill_t*, spill) {
static ir_entity* create_stack_entity(be_fec_env_t *env, spill_slot_t *slot)
{
- ir_graph *irg = env->irg;
- ir_type *frame = get_irg_frame_type(irg);
- /* TODO: backend should be able to specify wether we want spill slots
- * at begin or end of frame */
- int at_start = 1;
- ir_entity *res = frame_alloc_area(frame, slot->size, slot->align, at_start);
-
- /* adjust size of the entity type... */
- ir_type *enttype = get_entity_type(res);
- set_type_size_bytes(enttype, slot->size);
-
+ ir_graph *irg = env->irg;
+ ir_type *frame = get_irg_frame_type(irg);
+ ir_entity *res = frame_alloc_area(frame, slot->size, slot->align,
+ env->at_begin);
slot->entity = res;
return res;
ir_node *block = get_nodes_block(node);
/* should be a PhiM */
- assert(is_Phi(node));
+ assert(get_irn_mode(node) == mode_M);
for (i = 0, arity = get_irn_arity(node); i < arity; ++i) {
ir_node *arg = get_irn_n(node, i);
}
void be_assign_entities(be_fec_env_t *env,
- set_frame_entity_func set_frame_entity)
+ set_frame_entity_func set_frame_entity,
+ bool alloc_entities_at_begin)
{
env->set_frame_entity = set_frame_entity;
+ env->at_begin = alloc_entities_at_begin;
stat_ev_dbl("spillslots", set_count(env->spills));
create_memperms(env);
}
-/**
- * This walker function searches for reloads and collects all the spills
- * and memphis attached to them.
- */
-static void collect_spills_walker(ir_node *node, void *data)
-{
- be_fec_env_t *env = (be_fec_env_t*)data;
- const ir_mode *mode;
- const arch_register_class_t *cls;
- int align;
- ir_graph *irg;
- const arch_env_t *arch_env;
-
- if (! (arch_irn_classify(node) & arch_irn_class_reload))
- return;
-
- mode = get_irn_mode(node);
- cls = arch_get_irn_reg_class_out(node);
- irg = get_irn_irg(node);
- arch_env = be_get_irg_arch_env(irg);
- align = arch_env_get_reg_class_alignment(arch_env, cls);
-
- be_node_needs_frame_entity(env, node, mode, align);
-}
-
-void be_coalesce_spillslots(ir_graph *irg)
-{
- be_fec_env_t *env = be_new_frame_entity_coalescer(irg);
-
- /* collect reloads */
- irg_walk_graph(irg, NULL, collect_spills_walker, env);
-
- be_assign_entities(env, be_node_set_frame_entity);
-
- be_free_frame_entity_coalescer(env);
-}
-
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_spillslots)
void be_init_spillslots(void)
{
FIRM_DBG_REGISTER(dbg, "firm.be.spillslots");