const ir_node *bl = get_block(from);
ir_node *curr;
- if (is_Block(from))
- from = forward ? sched_next(from) : sched_prev(from);
-
- for(curr = from; curr != bl && predicator(curr, data); curr = forward ? sched_next(curr) : sched_prev(curr));
+ if (forward) {
+ if (is_Block(from))
+ from = sched_next(from);
+ for (curr = from; curr != bl && predicator(curr, data); curr = sched_next(curr)) {
+ }
+ } else {
+ if (is_Block(from))
+ from = sched_prev(from);
+ for (curr = from; curr != bl && predicator(curr, data); curr = sched_prev(curr)) {
+ }
+ }
return curr;
}
bitset_t *reachable;
} remove_dead_nodes_env_t;
+/**
+ * Post-walker: remember all visited nodes in a bitset.
+ */
static void mark_dead_nodes_walker(ir_node *node, void *data)
{
remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data;
bitset_set(env->reachable, get_irn_idx(node));
}
+/**
+ * Post-block-walker:
+ * Walk through the schedule of every block and remove all dead nodes from it.
+ */
static void remove_dead_nodes_walker(ir_node *block, void *data)
{
remove_dead_nodes_env_t *env = (remove_dead_nodes_env_t*) data;
ir_node *node, *next;
for (node = sched_first(block); ! sched_is_end(node); node = next) {
- int i;
-
/* get next node now, as after calling sched_remove it will be invalid */
next = sched_next(node);
if (is_Bad(node))
continue;
- for (i = get_irn_arity(node) - 1; i >= 0; --i)
- set_irn_n(node, i, new_r_Bad(env->irg));
+ be_kill_node(node);
}
}