- fixed comment: bs cannot be NULL anymore (and was never NULL previously)
[libfirm] / ir / be / bessaconstr.c
index 1724b25..38b486e 100644 (file)
  * to their closest copy while introducing phis as necessary.
  *
  * Algorithm: Mark all blocks in the iterated dominance frontiers of the value
- * and it's copies. Link the copies ordered by dominance to the blocks.  The
- * we search for each use all all definitions in the current block, if none is
+ * and it's copies. Link the copies ordered by dominance to the blocks.  Then
+ * we search for each use all definitions in the current block, if none is
  * found, then we search one in the immediate dominator. If we are in a block
- * of the dominance frontier, create a phi and search do the same search for
- * the phi arguments.
+ * of the dominance frontier, create a phi and do the same search for all
+ * phi arguments.
  *
  * A copy in this context means, that you want to introduce several new
  * abstract values (in Firm: nodes) for which you know, that they
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
-static INLINE int is_inside(unsigned what, unsigned low, unsigned hi)
-{
-       return what - low < hi;
-}
-
 /**
  * Calculates the iterated dominance frontier of a set of blocks. Marks the
  * blocks as visited. Sets the link fields of the blocks in the dominance
@@ -84,7 +79,7 @@ void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env)
        stat_ev_cnt_decl(blocks);
        DBG((dbg, LEVEL_3, "Dominance Frontier:"));
        stat_ev_tim_push();
-       while (!pdeq_empty(env->worklist)) {
+       while (!waitq_empty(env->worklist)) {
                int i;
                ir_node *block = waitq_get(env->worklist);
                ir_node **domfront = be_get_dominance_frontier(env->domfronts, block);
@@ -95,16 +90,6 @@ void mark_iterated_dominance_frontiers(const be_ssa_construction_env_t *env)
                        if (Block_block_visited(y))
                                continue;
 
-                       /*
-                        * It makes no sense to add phi-functions to blocks
-                        * that are not dominated by any definition;
-                        * all uses are dominated, hence the paths reaching the uses
-                        * have to stay in the dominance subtrees of the given definitions.
-                        */
-
-                       if (!is_inside(get_Block_dom_tree_pre_num(y), env->min_dom, env->max_dom))
-                               continue;
-
                        if (!irn_visited(y)) {
                                set_irn_link(y, NULL);
                                waitq_put(env->worklist, y);
@@ -226,16 +211,6 @@ ir_node *search_def(be_ssa_construction_env_t *env, ir_node *at)
        return get_def_at_idom(env, block);
 }
 
-static
-void update_domzone(be_ssa_construction_env_t *env, const ir_node *bl)
-{
-       int start = get_Block_dom_tree_pre_num(bl);
-       int end   = get_Block_dom_max_subtree_pre_num(bl) + 1;
-
-       env->min_dom = MIN(env->min_dom, start);
-       env->max_dom = MAX(env->max_dom, end);
-}
-
 /**
  * Adds a definition into the link field of the block. The definitions are
  * sorted by dominance. A non-visited block means no definition has been
@@ -289,12 +264,9 @@ void be_ssa_construction_init(be_ssa_construction_env_t *env, be_irg_t *birg)
        env->domfronts = be_get_birg_dom_front(birg);
        env->new_phis  = NEW_ARR_F(ir_node*, 0);
        env->worklist  = new_waitq();
-       env->min_dom   = INT_MAX;
-       env->max_dom   = 0;
 
-       set_using_visited(irg);
-       set_using_block_visited(irg);
-       set_using_irn_link(irg);
+       ir_reserve_resources(irg, IR_RESOURCE_IRN_VISITED
+                       | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK);
 
        /* we use the visited flag to indicate blocks in the dominance frontier
         * and blocks that already have the relevant value at the end calculated */
@@ -310,9 +282,8 @@ void be_ssa_construction_destroy(be_ssa_construction_env_t *env)
        del_waitq(env->worklist);
        DEL_ARR_F(env->new_phis);
 
-       clear_using_visited(env->irg);
-       clear_using_block_visited(env->irg);
-       clear_using_irn_link(env->irg);
+       ir_free_resources(env->irg, IR_RESOURCE_IRN_VISITED
+                       | IR_RESOURCE_BLOCK_VISITED | IR_RESOURCE_IRN_LINK);
 
        stat_ev_tim_pop("bessaconstr_total_time");
        stat_ev_ctx_pop("bessaconstr");
@@ -337,7 +308,6 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env,
                waitq_put(env->worklist, block);
        }
        introduce_def_at_block(block, copy);
-       update_domzone(env, block);
 }
 
 void be_ssa_construction_add_copies(be_ssa_construction_env_t *env,
@@ -360,7 +330,6 @@ void be_ssa_construction_add_copies(be_ssa_construction_env_t *env,
                        waitq_put(env->worklist, block);
                }
                introduce_def_at_block(block, copy);
-               update_domzone(env, block);
        }
 }
 
@@ -389,7 +358,6 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env,
                env->iterated_domfront_calculated = 1;
        }
 
-       stat_ev_int("bessaconstr_domzone", env->max_dom - env->min_dom);
        stat_ev_tim_push();
        for(i = 0; i < nodes_len; ++i) {
                ir_node *value = nodes[i];
@@ -418,7 +386,7 @@ void be_ssa_construction_fix_users_array(be_ssa_construction_env_t *env,
                        def = search_def(env, at);
 
                        if(def == NULL) {
-                               panic("no definition found for %+F at position %d\n", use, pos);
+                               panic("no definition found for %+F at position %d", use, pos);
                        }
 
                        DBG((dbg, LEVEL_2, "\t%+F(%d) -> %+F\n", use, pos, def));