fixed precedence constraint
[libfirm] / ir / be / beirgmod.c
index db686fb..28d86e1 100644 (file)
@@ -376,9 +376,11 @@ static void fix_usages(pset *copies, pset *copy_blocks, pset *phi_blocks, pset *
        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++;
@@ -452,7 +454,7 @@ static void remove_odd_phis(pset *copies, pset *unused_copies)
                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)
 {
@@ -720,64 +722,3 @@ int be_remove_empty_blocks(ir_graph *irg) {
        }
        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);
-}