Use block walk for ssa_cons_start
authorAndreas Zwinkau <zwinkau@kit.edu>
Fri, 15 Apr 2011 13:58:44 +0000 (15:58 +0200)
committerAndreas Zwinkau <zwinkau@kit.edu>
Fri, 15 Apr 2011 14:14:42 +0000 (16:14 +0200)
The node walk used before was inefficient,
since everything but blocks was ignored.

Additionally, this fixes a bug, because ssa_cons_finish already used a
block walk already, such that unreachable blocks were immatured,
but not matured in the scalar-replace optimization. This bug could
also be avoided by ensuring cfopt before scalar-replace, but keeping
ssacons start and finish symmetric seems to be more robust.

ir/ir/irssacons.c

index e6b382c..d3982c8 100644 (file)
  * Post-walker: prepare the graph nodes for new SSA construction cycle by
  * allocation new arrays.
  */
-static void prepare_nodes(ir_node *irn, void *env)
+static void prepare_blocks(ir_node *irn, void *env)
 {
        (void)env;
-
-       if (is_Block(irn)) {
-               unsigned        n_loc = current_ir_graph->n_loc;
-               struct obstack *obst  = current_ir_graph->obst;
-               /* reset mature flag */
-               set_Block_matured(irn, 0);
-               irn->attr.block.graph_arr  = NEW_ARR_D(ir_node *, obst, n_loc);
-               memset(irn->attr.block.graph_arr, 0, sizeof(ir_node*) * n_loc);
-               irn->attr.block.phis       = NULL;
-       }
+       unsigned        n_loc = current_ir_graph->n_loc;
+       struct obstack *obst  = current_ir_graph->obst;
+       /* reset mature flag */
+       set_Block_matured(irn, 0);
+       irn->attr.block.graph_arr  = NEW_ARR_D(ir_node *, obst, n_loc);
+       memset(irn->attr.block.graph_arr, 0, sizeof(ir_node*) * n_loc);
+       irn->attr.block.phis       = NULL;
 }
 
 /*
@@ -75,7 +72,7 @@ void ssa_cons_start(ir_graph *irg, int n_loc)
         * seems worth to do this.  First, we have to check if they really exists and
         * then clear them.  We do not expect SSA construction is used often.
         */
-       irg_walk_graph(irg, NULL, prepare_nodes, NULL);
+       irg_block_walk_graph(irg, NULL, prepare_blocks, NULL);
 }
 
 /**