}
return changed;
}
-
-typedef struct _be_dead_out_env_t {
- ir_graph *irg;
- bitset_t *reachable;
- DEBUG_ONLY(firm_dbg_module_t *dbg);
-} be_dead_out_env_t;
-
-/**
- * Check all block out edges and kill all unreachable nodes.
- */
-static void kill_dead_outs(ir_node *block, void *wenv) {
- be_dead_out_env_t *env = wenv;
- ir_graph *irg = env->irg;
- ir_node *globs = get_irg_globals(irg);
- ir_node *tls = get_irg_tls(irg);
- const ir_edge_t *edge, *tmp_edge;
-
- /* check all out edges */
- foreach_out_edge_safe(block, edge, tmp_edge) {
- ir_node *src = get_edge_src_irn(edge);
-
- if (! bitset_is_set(env->reachable, get_irn_idx(src))) {
- /* BEWARE: do not kill anchors or TLS */
- if (src != globs && src != tls) {
- DBG((env->dbg, LEVEL_1, "killing %+F, only reachable from %+F\n", src, block));
- be_kill_node(src);
- }
- }
- }
-}
-
-static void set_reachable(ir_node *node, void *data) {
- bitset_t *reachable = data;
- bitset_set(reachable, get_irn_idx(node));
-}
-
-/**
- * Set input of all nodes only reachable via out edges to BAD.
- */
-void be_kill_dead_nodes(ir_graph *irg) {
- be_dead_out_env_t env;
-
- env.irg = irg;
- env.reachable = bitset_alloca(get_irg_last_idx(irg));
- FIRM_DBG_REGISTER(env.dbg, "firm.be.killdead");
-
- /* collect all reachable nodes */
- irg_walk_in_or_dep_graph(irg, set_reachable, NULL, env.reachable);
-
- /* go over out edges of block and kill all unreachable nodes */
- irg_block_walk_graph(irg, kill_dead_outs, NULL, &env);
-}