DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
-/**
- * Checks that low <= what < hi.
- */
-static INLINE int is_inside(unsigned what, unsigned low, unsigned hi)
-{
- return what - low < hi;
-}
-
/**
* Calculates the iterated dominance frontier of a set of blocks. Marks the
* blocks as visited. Sets the link fields of the blocks in the dominance
if (Block_block_visited(y))
continue;
- /*
- * It makes no sense to add phi-functions to blocks
- * that are not dominated by any definition;
- * all uses are dominated, hence the paths reaching the uses
- * have to stay in the dominance subtrees of the given definitions.
- */
-
- if (!is_inside(get_Block_dom_tree_pre_num(y), env->min_dom, env->max_dom))
- continue;
-
if (!irn_visited(y)) {
set_irn_link(y, NULL);
waitq_put(env->worklist, y);
return get_def_at_idom(env, block);
}
-static
-void update_domzone(be_ssa_construction_env_t *env, const ir_node *bl)
-{
- int start = get_Block_dom_tree_pre_num(bl);
- int end = get_Block_dom_max_subtree_pre_num(bl) + 1;
-
- env->min_dom = MIN(env->min_dom, start);
- env->max_dom = MAX(env->max_dom, end);
-}
-
/**
* Adds a definition into the link field of the block. The definitions are
* sorted by dominance. A non-visited block means no definition has been
env->domfronts = be_get_birg_dom_front(birg);
env->new_phis = NEW_ARR_F(ir_node*, 0);
env->worklist = new_waitq();
- env->min_dom = INT_MAX;
- env->max_dom = 0;
- set_using_irn_visited(irg);
- set_using_block_visited(irg);
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED
+ | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK);
/* we use the visited flag to indicate blocks in the dominance frontier
* and blocks that already have the relevant value at the end calculated */
del_waitq(env->worklist);
DEL_ARR_F(env->new_phis);
- clear_using_irn_visited(env->irg);
- clear_using_block_visited(env->irg);
- clear_using_irn_link(env->irg);
+ ir_free_resources(env->irg, IR_RESOURCE_IRN_VISITED
+ | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK);
stat_ev_tim_pop("bessaconstr_total_time");
stat_ev_ctx_pop("bessaconstr");
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
- update_domzone(env, block);
}
void be_ssa_construction_add_copies(be_ssa_construction_env_t *env,
waitq_put(env->worklist, block);
}
introduce_def_at_block(block, copy);
- update_domzone(env, block);
}
}
env->iterated_domfront_calculated = 1;
}
- stat_ev_int("bessaconstr_domzone", env->max_dom - env->min_dom);
stat_ev_tim_push();
for(i = 0; i < nodes_len; ++i) {
ir_node *value = nodes[i];
def = search_def(env, at);
if(def == NULL) {
- panic("no definition found for %+F at position %d\n", use, pos);
+ panic("no definition found for %+F at position %d", use, pos);
}
DBG((dbg, LEVEL_2, "\t%+F(%d) -> %+F\n", use, pos, def));