for (irn = pset_first(copies); irn; irn = pset_next(copies)) {
const ir_edge_t *edge;
foreach_out_edge(irn, edge) {
- if (!pset_find_ptr(ignore_uses, get_edge_src_irn(edge))) {
+ ir_node *src = get_edge_src_irn(edge);
+ /* ignore all users from ignore_uses or keep-alives (user is End node) */
+ if (! pset_find_ptr(ignore_uses, src) && ! is_End(src)) {
struct out tmp;
- tmp.irn = get_edge_src_irn(edge);
+ tmp.irn = src;
tmp.pos = get_edge_src_pos(edge);
obstack_grow(&obst, &tmp, sizeof(tmp));
n_outs++;
sched_remove(irn);
}
}
-#endif
+#endif /* if 0 */
void be_ssa_constr_phis_ignore(be_dom_front_info_t *info, be_lv_t *lv, int n, ir_node *nodes[], pset *phis, pset *ignore_uses)
{
}
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 if @p node has dead users, i.e. they are reachable only via outedges from @p node.
- * Set all ins of those users to BAD.
- */
-static void kill_dead_out(ir_node *node, be_dead_out_env_t *env) {
- ir_graph *irg = env->irg;
- const ir_edge_t *edge, *tmp_edge;
-
- if (irn_visited(node))
- return;
- mark_irn_visited(node);
-
- /* check all out edges */
- foreach_out_edge_safe(node, 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 != get_irg_globals(irg) && src != get_irg_tls(irg)) {
- DBG((env->dbg, LEVEL_1, "killing %+F, only reachable from %+F\n", src, node));
- be_kill_node(src);
- }
- continue;
- }
-
- /* descent */
- if (! is_Block(src)) {
- kill_dead_out(src, env);
- }
- }
-}
-
-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);
-
- /* this is a forward walk (start -> end) */
- inc_irg_visited(irg);
- kill_dead_out(get_irg_start(irg), &env);
-}