* if 2 parties try to use the flags.
*/
#ifndef NDEBUG
-void set_using_block_visited(ir_graph *irg);
-void clear_using_block_visited(ir_graph *irg);
-int using_block_visited(const ir_graph *irg);
-void set_using_irn_visited(ir_graph *irg);
-void clear_using_irn_visited(ir_graph *irg);
-int using_irn_visited(const ir_graph *irg);
-void set_using_irn_link(ir_graph *irg);
-void clear_using_irn_link(ir_graph *irg);
-int using_irn_link(const ir_graph *irg);
-void set_using_block_mark(ir_graph *irg);
-void clear_using_block_mark(ir_graph *irg);
-int using_block_mark(const ir_graph *irg);
+enum ir_resources_enum_t {
+ IR_RESOURCE_BLOCK_VISITED = 1 << 0,
+ IR_RESOURCE_BLOCK_MARK = 1 << 1,
+ IR_RESOURCE_IRN_VISITED = 1 << 2,
+ IR_RESOURCE_IRN_LINK = 1 << 3,
+ IR_RESOURCE_LOOP_LINK = 1 << 4,
+};
+typedef unsigned ir_resources_t;
+
+void ir_reserve_resources(ir_graph *irg, ir_resources_t resources);
+void ir_free_resources(ir_graph *irg, ir_resources_t resources);
+ir_resources_t ir_resources_reserved(const ir_graph *irg);
#else
-#define set_using_block_visited(irg)
-#define clear_using_block_visited(irg)
-#define using_block_visited(irg) 0
-#define set_using_irn_visited(irg)
-#define clear_using_irn_visited(irg)
-#define using_irn_visited(irg) 0
-#define set_using_irn_link(irg)
-#define clear_using_irn_link(irg)
-#define using_irn_link(irg) 0
-#define set_using_block_mark(irg)
-#define clear_using_block_mark(irg)
-#define using_block_mark(irg) 0
+#define ir_reserve_resources(irg,resources)
+#define ir_free_resources(irg,resources)
+#define ir_resources_reserved(irg) 0
#endif
/** Normalization: Move Proj nodes into the same block as its predecessors */
eset_insert(free_set, ent);
}
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
/* Find all method entities that gets "visible" through this graphs,
* for instance because their address is stored. */
irg_walk_graph(irg, firm_clear_link, free_ana_walker, free_set);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
}
/* insert all methods that are used in global variables initializers */
ir_node *startblock = get_irg_start_block(irg);
blocksched_entry_t *entry = get_irn_link(startblock);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(irg);
env->worklist = new_pdeq();
assert(pdeq_empty(env->worklist));
del_pdeq(env->worklist);
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
return entry;
}
list.end = NULL;
list.n_blks = 0;
- set_using_irn_link(irg);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
inc_irg_block_visited(irg);
create_block_list(get_irg_start_block(irg), &list);
blk_list[i] = b;
}
- clear_using_irn_link(irg);
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
return blk_list;
}
if(remat == NULL)
remat = &default_remat;
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
irg_block_walk_graph(irg, fix_flags_walker, NULL, birg->lv);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
if(changed) {
be_remove_dead_nodes_from_schedule(birg);
blocks_removed = 0;
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(irg);
remove_empty_block(get_irg_end_block(irg));
end = get_irg_end(irg);
continue;
remove_empty_block(pred);
}
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
if (blocks_removed) {
/* invalidate analysis info */
{
ir_graph *irg = be_get_birg_irg(birg);
- cls = ncls;
- n_regs = cls->n_regs - be_put_ignore_regs(birg, cls, NULL);
+ cls = ncls;
+ n_regs = cls->n_regs - be_put_ignore_regs(birg, cls, NULL);
- if(n_regs == 0)
+ /* shortcut for register classes with ignore regs only */
+ if (n_regs == 0)
return;
- arch_env = be_get_birg_arch_env(birg);
- exec_freq = be_get_birg_exec_freq(birg);
+ arch_env = be_get_birg_arch_env(birg);
+ exec_freq = be_get_birg_exec_freq(birg);
be_clear_links(irg);
- set_using_irn_link(irg);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
inc_irg_visited(irg);
obstack_init(&obst);
senv = be_new_spill_env(birg);
+ assure_cf_loop(irg);
+
/* do a post-order walk over the CFG to make sure we have a maximum number
* of preds processed before entering a block */
tentative_mode = 1;
tentative_mode = 0;
irg_block_edges_walk(get_irg_start_block(irg), NULL, process_block, NULL);
- clear_using_irn_link(irg);
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
be_insert_spills_reloads(senv);
env->new_phis = NEW_ARR_F(ir_node*, 0);
env->worklist = new_waitq();
- 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");
ir_nodemap_init(&env.spill_infos);
assure_doms(irg);
- set_using_irn_visited(irg);
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
inc_irg_visited(irg);
/* process blocks */
/* fix block end_states that don't match the next blocks start_state */
irg_block_walk_graph(irg, fix_block_borders, NULL, &env);
- clear_using_irn_visited(irg);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED | IR_RESOURCE_IRN_LINK);
/* reconstruct ssa-form */
info = env.spills;
void be_clear_links(ir_graph *irg)
{
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
irg_walk_graph(irg, firm_clear_link, NULL, NULL);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
}
void be_collect_phis(ir_graph *irg)
be_gas_emit_function_prolog(entity, ia32_cg_config.function_alignment);
/* we use links to point to target blocks */
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
irg_block_walk_graph(irg, ia32_gen_labels, NULL, &exc_list);
/* initialize next block links */
be_emit_char('\n');
be_emit_write_line();
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
/* Sort the exception table using the exception label id's.
Those are ascending with ascending addresses. */
#ifdef INTERPROCEDURAL_VIEW
int rem_view = get_interprocedural_view();
#endif
- int walk_flag = using_irn_visited(irg);
+ int walk_flag = ir_resources_reserved(irg) & IR_RESOURCE_IRN_VISITED;
ir_graph *rem = current_ir_graph;
current_ir_graph = irg;
if(walk_flag)
- clear_using_irn_visited(current_ir_graph);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
for (i = get_irp_n_irgs() - 1; i >= 0; --i)
ird_set_irg_link(get_irp_irg(i), NULL);
#endif
if(walk_flag)
- set_using_irn_visited(current_ir_graph);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
current_ir_graph = rem;
return ird_get_irg_link(irg);
assert(edges_activated(current_ir_graph));
assert(is_Block(node));
- set_using_block_visited(current_ir_graph);
+ ir_reserve_resources(current_ir_graph, IR_RESOURCE_BLOCK_VISITED);
inc_irg_block_visited(current_ir_graph);
irg_block_edges_walk2(node, pre, post, env);
- clear_using_block_visited(current_ir_graph);
+ ir_free_resources(current_ir_graph, IR_RESOURCE_BLOCK_VISITED);
}
set_irg_doms_inconsistent(irg);
set_irg_loopinfo_inconsistent(irg);
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
end = get_irg_end(irg);
n_ka = get_End_n_keepalives(end);
del_pdeq(waitq);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
if (! state)
edges_deactivate(irg);
res->phase_state = irg->phase_state;
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
/* copy all nodes from the graph irg to the new graph res */
irg_walk_anchors(irg, copy_all_nodes, set_all_preds, res);
is different from the original one. */
res->estimated_node_count = irg->estimated_node_count;
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
return res;
}
}
#ifndef NDEBUG
-void set_using_block_visited(ir_graph *irg) {
- assert(irg->using_block_visited == 0);
- irg->using_block_visited = 1;
+void ir_reserve_resources(ir_graph *irg, ir_resources_t resources)
+{
+ assert((irg->reserved_resources & resources) == 0);
+ irg->reserved_resources |= resources;
}
-void clear_using_block_visited(ir_graph *irg) {
- assert(irg->using_block_visited == 1);
- irg->using_block_visited = 0;
+void ir_free_resources(ir_graph *irg, ir_resources_t resources)
+{
+ assert((irg->reserved_resources & resources) == resources);
+ irg->reserved_resources &= ~resources;
}
-int using_block_visited(const ir_graph *irg) {
- return irg->using_block_visited;
-}
-
-
-void set_using_irn_visited(ir_graph *irg) {
- assert(irg->using_irn_visited == 0);
- irg->using_irn_visited = 1;
-}
-
-void clear_using_irn_visited(ir_graph *irg) {
- assert(irg->using_irn_visited == 1);
- irg->using_irn_visited = 0;
-}
-
-int using_irn_visited(const ir_graph *irg) {
- return irg->using_irn_visited;
-}
-
-
-void set_using_irn_link(ir_graph *irg) {
- assert(irg->using_irn_link == 0);
- irg->using_irn_link = 1;
-}
-
-void clear_using_irn_link(ir_graph *irg) {
- assert(irg->using_irn_link == 1);
- irg->using_irn_link = 0;
-}
-
-int using_irn_link(const ir_graph *irg) {
- return irg->using_irn_link;
-}
-
-void set_using_block_mark(ir_graph *irg) {
- assert(irg->using_block_mark == 0);
- irg->using_block_mark = 1;
-}
-
-void clear_using_block_mark(ir_graph *irg) {
- assert(irg->using_block_mark == 1);
- irg->using_block_mark = 0;
-}
-
-int using_block_mark(const ir_graph *irg) {
- return irg->using_block_mark;
+ir_resources_t ir_resources_reserved(const ir_graph *irg)
+{
+ return irg->reserved_resources;
}
#endif /* NDEBUG */
pset_new_destroy(&irg_set);
} else {
#endif
- set_using_irn_visited(current_ir_graph);
+ ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(current_ir_graph);
nodes_touched = irg_walk_2(node, pre, post, env);
- clear_using_irn_visited(current_ir_graph);
+ ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
#ifdef INTERPROCEDURAL_VIEW
}
#endif
if (get_interprocedural_view()) {
assert(0 && "This is not yet implemented.");
} else {
- set_using_irn_visited(current_ir_graph);
+ ir_reserve_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(current_ir_graph);
nodes_touched = irg_walk_in_or_dep_2(node, pre, post, env);
- clear_using_irn_visited(current_ir_graph);
+ ir_free_resources(current_ir_graph, IR_RESOURCE_IRN_VISITED);
}
}
flag, so that it can be interleaved with the other walker. */
void irg_block_walk(ir_node *node, irg_walk_func *pre, irg_walk_func *post, void *env)
{
+ ir_graph *irg = current_ir_graph;
ir_node *block, *pred;
int i;
- hook_irg_block_walk(current_ir_graph, node, (generic_func *)pre, (generic_func *)post);
+ hook_irg_block_walk(irg, node, (generic_func *)pre, (generic_func *)post);
assert(node);
assert(!get_interprocedural_view()); /* interprocedural_view not implemented, because it
* interleaves with irg_walk */
- set_using_block_visited(current_ir_graph);
- inc_irg_block_visited(current_ir_graph);
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_VISITED);
+ inc_irg_block_visited(irg);
block = is_Block(node) ? node : get_nodes_block(node);
assert(get_irn_op(block) == op_Block);
irg_block_walk_2(block, pre, post, env);
}
}
- clear_using_block_visited(current_ir_graph);
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_VISITED);
}
/*
blks.follow_deps = follow_deps != 0;
/* first step: traverse the graph and fill the lists */
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(irg);
collect_walk(end_node, &blks);
#ifdef INTERPROCEDURAL_VIEW
set_interprocedural_view(old_view);
#endif
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
}
void irg_walk_blkwise_graph(ir_graph *irg, irg_walk_func *pre, irg_walk_func *post, void *env)
#endif
#ifndef NDEBUG
- unsigned using_irn_visited : 1; /**< set to 1 if we are currently using the visited flag */
- unsigned using_block_visited : 1; /**< set to 1 if we are currently using the block_visited flag */
- unsigned using_irn_link : 1; /**< set to 1 if we are currently using the irn_link fields */
- unsigned using_block_mark : 1; /**< set to 1 if we are currently using the block mark flags */
+ ir_resources_t reserved_resources;
#endif
};
{
config = *nconfig;
lowered_nodes = new_pdeq();
- set_using_irn_link(irg);
+
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
irg_walk_graph(irg, clear_links, NULL, NULL);
irg_walk_graph(irg, lower_mode_b_walker, NULL, NULL);
}
del_pdeq(lowered_nodes);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
}
{
irg_walk_graph(irg, NULL, bool_walk, NULL);
- set_using_block_mark(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK);
irg_walk_graph(irg, clear_block_infos, collect_phis, NULL);
set_irg_extblk_inconsistent(irg);
set_irg_loopinfo_inconsistent(irg);
- clear_using_block_mark(irg);
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_MARK);
}
edges_deactivate(irg);
/* we use the mark flag to mark removable blocks */
- set_using_block_mark(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK);
restart:
env.changed = 0;
env.phis_moved = 0;
}
}
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
env.list = plist_new();
irg_walk(end, merge_blocks, collect_nodes, &env);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
if (env.changed) {
/* Handle graph state if was changed. */
/* in rare cases a node may be kept alive more than once, use the visited flag to detect this */
inc_irg_visited(irg);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
/* fix the keep alive */
for (i = j = 0; i < n; i++) {
env.changed = 1;
}
- clear_using_block_mark(irg);
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_MARK | IR_RESOURCE_IRN_VISITED);
if (env.phis_moved) {
/* Bad: when we moved Phi's, we might produce dead Phi nodes
ir_node *mux = node->node;
node_t *t = get_irn_node(get_Mux_true(mux));
node_t *f = get_irn_node(get_Mux_false(mux));
- node_t *sel;
+ /*node_t *sel; */
if (t->part == f->part)
return t;
normalize_proj_nodes(irg);
edges_assure(irg);
- set_using_irn_link(irg);
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_IRN_VISITED);
changed = 0;
do {
changed |= rerun;
} while (rerun);
- clear_using_irn_visited(irg);
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_IRN_VISITED);
if (changed) {
/* control flow changed, some blocks may become dead */
compute_cdep(irg);
assure_doms(irg);
- set_using_block_mark(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_BLOCK_MARK);
irg_block_walk_graph(irg, init_block_link, NULL, NULL);
irg_walk_graph(irg, collect_phis, NULL, NULL);
irg_block_walk_graph(irg, NULL, if_conv_walker, &p);
- clear_using_block_mark(irg);
+ ir_free_resources(irg, IR_RESOURCE_BLOCK_MARK);
local_optimize_graph(irg);
ir_node *node = get_irg_end(irg);
/* collect calls */
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
irg_walk_graph(irg, firm_clear_link, collect_call, node);
/* iterate calls */
}
}
}
- clear_using_irn_link(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
}
}
DEL_ARR_F(marked);
ir_node *end = get_irg_end(irg);
int i, n;
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
current_ir_graph = irg;
inc_irg_visited(irg);
dfs(ka, env);
}
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
current_ir_graph = rem;
}
int i;
int res = 0;
- set_using_irn_visited(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED);
inc_irg_visited(irg);
/*
}
}
- clear_using_irn_visited(irg);
+ ir_free_resources(irg, IR_RESOURCE_IRN_VISITED);
return res;
}
current_ir_graph = irg;
- set_using_irn_link(irg);
+ ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK);
if (opt_tail_rec_irg(irg))
++n_opt_applications;
- clear_using_irn_link(irg);
+
+ ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
}
DB((dbg, LEVEL_1, "Performed tail recursion for %d of %d graphs\n",