#include "pset.h"
#include "irhooks.h"
#include "array.h"
+#include "hashptr.h"
/**
* Metadata for block walker
return e1->block != e2->block;
}
-/**
- * calculates a hash value for an block address
- * Addresses are typically aligned at 32bit, so we ignore the lowest bits
- */
-static INLINE unsigned block_hash(const ir_node *node) {
- return (unsigned)node >> 3;
-}
-
/**
* Returns the associates block_entry_t for an block
*/
block_entry_t *elem;
key.block = block;
- elem = pset_find(ctx->blk_map, &key, block_hash(block));
+ elem = pset_find(ctx->blk_map, &key, HASH_PTR(block));
if (elem)
return elem;
elem->cf_list = NEW_ARR_F(ir_node *, 0);
elem->entry_list = NEW_ARR_F(ir_node *, 0);
- return pset_insert(ctx->blk_map, elem, block_hash(block));
+ return pset_insert(ctx->blk_map, elem, HASH_PTR(block));
}
/**
block_entry_t *entry;
ir_node *block;
- set_irn_visited(node, current_ir_graph->visited);
+ mark_irn_visited(node);
if (node->op == op_Block) {
/* predecessors of a block are control flow nodes */
ir_node *pred = get_irn_n(node, i);
ir_node *blk = get_nodes_block(pred);
- if (pred->visited < current_ir_graph->visited) {
+ if (irn_not_visited(pred)) {
collect_walk(pred, env);
/* control flow predecessors are always block inputs */
else {
block = get_nodes_block(node);
- if (block->visited < current_ir_graph->visited)
+ if (irn_not_visited(block))
collect_walk(block, env);
is_phi = is_Phi(node);
for (i = get_irn_arity(node) - 1; i >= 0; --i) {
ir_node *pred = get_irn_n(node, i);
- ir_node *blk = get_nodes_block(pred);
- if (pred->visited < current_ir_graph->visited) {
+ if (irn_not_visited(pred)) {
collect_walk(pred, env);
- /*
- * Note that Phi predecessors are always block entries
- * because Phi edges are always "outside" a block
- */
- if (block != blk || is_phi) {
- entry = block_find_entry(blk, env);
- ARR_APP1(ir_node *, entry->entry_list, pred);
+ /* BEWARE: predecessors of End nodes might be blocks */
+ if (is_no_Block(pred)) {
+ ir_node *blk = get_nodes_block(pred);
+
+ /*
+ * Note that Phi predecessors are always block entries
+ * because Phi edges are always "outside" a block
+ */
+ if (block != blk || is_phi) {
+ entry = block_find_entry(blk, env);
+ ARR_APP1(ir_node *, entry->entry_list, pred);
+ }
}
}
}
{
int i;
- set_irn_visited(node, current_ir_graph->visited);
+ mark_irn_visited(node);
/*
* Do not descent into Phi predecessors, these are always
if (! is_Phi(node)) {
for (i = get_irn_arity(node) - 1; i >= 0; --i) {
ir_node *pred = get_irn_n(node, i);
- ir_node *blk = get_nodes_block(pred);
- if (pred->visited < current_ir_graph->visited) {
- if (block != blk)
- continue;
- collect_blks_lists(pred, block, entry, env);
+ /* BEWARE: predecessors of End nodes might be blocks */
+ if (is_no_Block(pred)) {
+ ir_node *blk = get_nodes_block(pred);
+
+ if (irn_not_visited(pred)) {
+ if (block != blk)
+ continue;
+ collect_blks_lists(pred, block, entry, env);
+ }
}
}
}
block_entry_t *entry;
/* switch off interprocedural view */
- set_interprocedural_view(false);
+ set_interprocedural_view(0);
obstack_init(&blks.obst);
blks.blk_map = new_pset(addr_cmp, 1);
{
ir_graph * rem = current_ir_graph;
- hook_irg_walk_blkwise(irg, (void *)pre, (void *)post);
+ hook_irg_walk_blkwise(irg, (generic_func *)pre, (generic_func *)post);
current_ir_graph = irg;
do_irg_walk_blk(irg, pre, post, env);
current_ir_graph = rem;