-
-
-
-/*--------------------------------------------------------------------------- */
-
-
-
-typedef struct _verify_out_dead_nodes_env {
- ir_graph *irg;
- bitset_t *reachable;
- int problem_found;
-} verify_out_dead_nodes_env;
-
-static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) {
- ir_graph *irg = env->irg;
- const ir_edge_t* edge;
-
- if(irn_visited(node))
- return;
- mark_irn_visited(node);
-
- /* we find too many (uncritical) dead nodes in block out edges */
- if(is_Block(node))
- return;
-
- foreach_out_edge(node, edge) {
- ir_node* src = get_edge_src_irn(edge);
-
- if(!bitset_is_set(env->reachable, get_irn_idx(src)) && !is_Block(src)) {
- ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) only reachable through out edges from %+F\n",
- src, get_nodes_block(src), get_irg_dump_name(irg), node);
- env->problem_found = 1;
- continue;
- }
-
- check_out_edges(src, env);
- }
-}
-
-static void set_reachable(ir_node *node, void* data)
-{
- bitset_t* reachable = data;
- bitset_set(reachable, get_irn_idx(node));
-}
-
-int be_verify_out_edges(ir_graph *irg) {
- verify_out_dead_nodes_env env;
-
- env.irg = irg;
- env.reachable = bitset_alloca(get_irg_last_idx(irg));
- env.problem_found = edges_verify(irg);
-
- irg_walk_in_or_dep_graph(irg, set_reachable, NULL, env.reachable);
- irg_walk_anchors(irg, set_reachable, NULL, env.reachable);
- inc_irg_visited(irg);
- check_out_edges(get_irg_start(irg), &env);
-
- return ! env.problem_found;
-}