void mark_irn_visited(ir_node *node);
/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */
int irn_visited(const ir_node *node);
+/** Returns 1 if visited >= get_irg_visited(current_ir_graph). Marks the node
+ * visited, if it was not. */
+int irn_visited_else_mark(ir_node *node);
/**
* Sets the link of a node.
assert(is_Block(n));
- if (irn_visited(n)) return;
- mark_irn_visited(n);
+ if (irn_visited_else_mark(n)) return;
/* Initialize the node */
set_irn_dfn(n, current_dfn); /* Depth first number for this node */
*/
ir_node *cf_op = skip_Proj(get_Block_cfgpred(block, 0));
- if (!irn_visited(cf_op)) {
+ if (!irn_visited_else_mark(cf_op)) {
ir_node *pred_bl = get_nodes_block(cf_op);
if (get_block_n_succs(pred_bl) > 2) {
/* More than two successors means we have a jump table.
*/
set_Block_extbb(block, NULL);
}
- mark_irn_visited(cf_op);
} else {
/* already marked, so begin a new extended block here */
allocate_extblk(block, env);
{
ir_extblk *extblk;
- if (irn_visited(block))
+ if (irn_visited_else_mark(block))
return;
extblk = allocate_extblk(block, env);
- mark_irn_visited(block);
pick_successor(block, extblk, env);
}
even if they are not visible. */
for (i = anchor_last - 1; i >= 0; --i) {
n = get_irg_anchor(irg, i);
- if (!irn_visited(n)) {
- mark_irn_visited(n);
-
+ if (!irn_visited_else_mark(n)) {
n->out = INT_TO_PTR(1);
++res;
}
/* handle anchored nodes */
for (i = anchor_last - 1; i >= 0; --i) {
n = get_irg_anchor(irg, i);
- if (!irn_visited(n)) {
- mark_irn_visited(n);
-
+ if (!irn_visited_else_mark(n)) {
n_outs = PTR_TO_INT(n->out);
n->out = free;
#ifdef DEBUG_libfirm
* @param n node to start
*/
static void scc(ir_node *n) {
- if (irn_visited(n))
+ if (irn_visited_else_mark(n))
return;
- mark_irn_visited(n);
/* Initialize the node */
set_irn_dfn(n, current_dfn); /* Depth first number for this node */
#ifdef INTERPROCEDURAL_VIEW
static void my_scc(ir_node *n) {
int i;
- if (irn_visited(n))
+ if (irn_visited_else_mark(n))
return;
- mark_irn_visited(n);
/* Initialize the node */
set_irn_dfn(n, current_dfn); /* Depth first number for this node */
const ir_edge_t *edge;
double best_succ_execfreq;
- if (irn_visited(block))
+ if (irn_visited_else_mark(block))
return;
env->blockcount++;
- mark_irn_visited(block);
DBG((dbg, LEVEL_1, "Pick succ of %+F\n", block));
ir_node *succ_block;
ir_node *jump = NULL;
- if (irn_visited(block))
+ if (irn_visited_else_mark(block))
return;
- mark_irn_visited(block);
if (get_Block_n_cfgpreds(block) != 1)
goto check_preds;
int arity = get_irn_arity(irn);
int i;
- if (irn_visited(irn)) return sched;
- if (is_End(irn)) return sched;
+ if (irn_visited_else_mark(irn)) return sched;
+ if (is_End(irn)) return sched;
if (!is_Phi(irn) && !be_is_Keep(irn)) {
for (i = 0; i < arity; ++i) {
}
}
- mark_irn_visited(irn);
ARR_APP1(ir_node*, sched, irn);
return sched;
}
continue;
}
- if (irn_visited(value))
+ if (irn_visited_else_mark(value))
continue;
new_entry = obstack_alloc(&obst, sizeof(new_entry[0]));
list_add_tail(&new_entry->head, &new_worklist->live_values);
++n_live_values;
- mark_irn_visited(value);
set_irn_link(value, new_entry);
new_worklist->n_live_values++;
}
static
void introduce_def_at_block(ir_node *block, ir_node *def)
{
- if(irn_visited(block)) {
+ if (irn_visited_else_mark(block)) {
ir_node *node = block;
ir_node *current_def;
} else {
set_irn_link(block, def);
set_irn_link(def, NULL);
- mark_irn_visited(block);
}
}
assert(node_is_in_irgs_storage(env.irg, node));
- if (irn_visited(node))
+ if (irn_visited_else_mark(node))
return;
- mark_irn_visited(node);
-
changed = 0;
if (! is_Block(node)) {
ir_node *block = get_nodes_block(node);
ir_graph *irg = env->irg;
const ir_edge_t* edge;
- if(irn_visited(node))
+ if (irn_visited_else_mark(node))
return;
- mark_irn_visited(node);
/* we find too many (uncritical) dead nodes in block out edges */
if(is_Block(node))
return _irn_visited(node);
}
+int (irn_visited_else_mark)(ir_node *node) {
+ return _irn_visited_else_mark(node);
+}
+
void (set_irn_link)(ir_node *node, void *link) {
_set_irn_link(node, link);
}
return (node->visited >= current_ir_graph->visited);
}
+static INLINE int
+_irn_visited_else_mark(ir_node *node) {
+ if (_irn_visited(node))
+ return 1;
+ _mark_irn_visited(node);
+ return 0;
+}
+
/**
* Sets the link of a node.
* Intern version of libFirm.
#define set_irn_visited(node, v) _set_irn_visited(node, v)
#define mark_irn_visited(node) _mark_irn_visited(node)
#define irn_visited(node) _irn_visited(node)
+#define irn_visited_else_mark(node) _irn_visited_else_mark(node)
#define set_irn_link(node, link) _set_irn_link(node, link)
#define get_irn_link(node) _get_irn_link(node)
#define get_irn_pinned(node) _get_irn_pinned(node)
{
ir_node *block = get_nodes_block(jump);
- if (irn_visited(value))
+ if (irn_visited_else_mark(value))
return NULL;
- mark_irn_visited(value);
if (is_Const_or_Confirm(value)) {
if (eval_cmp(env, value) <= 0) {
{
ir_node *block = get_nodes_block(jump);
- if(irn_visited(value)) {
+ if (irn_visited_else_mark(value)) {
return NULL;
}
- mark_irn_visited(value);
if (is_Const_or_Confirm(value)) {
tarval *tv = get_Const_or_Confirm_tarval(value);
* visited more than once causing a ring here, so we use the
* node flag to mark linked nodes
*/
- if (irn_visited(sel))
+ if (irn_visited_else_mark(sel))
return;
/*
*/
set_irn_link(sel, get_entity_link(ent));
set_entity_link(ent, sel);
-
- mark_irn_visited(sel);
}
/* we need a special address that serves as an address taken marker */
if (mode == mtp_no_property)
return mtp_no_property;
- if (irn_visited(node))
+ if (irn_visited_else_mark(node))
return mode;
- mark_irn_visited(node);
-
switch (get_irn_opcode(node)) {
case iro_Proj:
node = get_Proj_pred(node);
* visited more than once causing a ring here, so we use the
* node flag to mark linked nodes
*/
- if (irn_visited(sel))
+ if (irn_visited_else_mark(sel))
return;
/* we know we are at a leave, because this function is only
*/
set_irn_link(sel, get_entity_link(ent));
set_entity_link(ent, sel);
-
- mark_irn_visited(sel);
}
}