Undo r16291.
[libfirm] / ir / opt / reassoc.c
index 1d06b2b..de5b6dd 100644 (file)
@@ -479,7 +479,7 @@ static void do_reassociation(walker_t *wenv)
 
 /**
  * Returns the earliest were a,b are available.
- * Note that we know that we know that a, b both dominate
+ * Note that we know that a, b both dominate
  * the block of the previous operation, so one must dominate the other.
  *
  * If the earliest block is the start block, return curr_blk instead
@@ -678,7 +678,7 @@ transform:
        if (ma != mb && mode_is_int(ma) && mode_is_int(mb))
                return 0;
 
-       /* check if a+b can be calculted in the same block is the old instruction */
+       /* check if a+b can be calculated in the same block is the old instruction */
        if (! block_dominates(get_nodes_block(a), blk))
                return 0;
        if (! block_dominates(get_nodes_block(b), blk))
@@ -735,6 +735,7 @@ void optimize_reassociation(ir_graph *irg)
 {
        walker_t env;
        irg_loopinfo_state state;
+       ir_graph *rem;
 
        assert(get_irg_phase_state(irg) != phase_building);
        assert(get_irg_pinned(irg) != op_pin_state_floats &&
@@ -744,6 +745,9 @@ void optimize_reassociation(ir_graph *irg)
        if (!get_opt_reassociation() || !get_opt_constant_folding())
                return;
 
+       rem = current_ir_graph;
+       current_ir_graph = irg;
+
        /* we use dominance to detect dead blocks */
        assure_doms(irg);
 
@@ -761,12 +765,17 @@ void optimize_reassociation(ir_graph *irg)
        env.changes = 0;
        env.wq      = new_waitq();
 
-       /* now we have collected enough information, optimize */
-       irg_walk_graph(irg, NULL, wq_walker, &env);
-       do_reassociation(&env);
+       /* disable some optimizations while reassoc is running to prevent endless loops */
+       set_reassoc_running(1);
+       {
+               /* now we have collected enough information, optimize */
+               irg_walk_graph(irg, NULL, wq_walker, &env);
+               do_reassociation(&env);
 
-       /* reverse those rules that do not result in collapsed constants */
-       irg_walk_graph(irg, NULL, reverse_rules, &env);
+               /* reverse those rules that do not result in collapsed constants */
+               irg_walk_graph(irg, NULL, reverse_rules, &env);
+       }
+       set_reassoc_running(0);
 
        /* Handle graph state */
        if (env.changes) {
@@ -775,6 +784,7 @@ void optimize_reassociation(ir_graph *irg)
        }
 
        del_waitq(env.wq);
+       current_ir_graph = rem;
 }  /* optimize_reassociation */
 
 /* Sets the default reassociation operation for an ir_op_ops. */