X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=742e6a8e8b0b2c7e93f76bb62b2c91fc68d65ed1;hb=5f8ddee6b08c8040c0a304a347d65045c1141d52;hp=4fef58e77f8724dc4ec06181a88469938c852947;hpb=c201fe69b5fcb5a8430afafe2e15946cab4e45c4;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 4fef58e77..742e6a8e8 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -13,6 +13,8 @@ # include "irgmod.h" # include "irvrfy.h" # include "tv.h" +# include "tune.h" +# include "debinfo.h" /* Make types visible to allow most efficient access */ # include "entity_t.h" @@ -373,6 +375,8 @@ equivalent_node (ir_node *n) themselves. */ int i, n_preds; + + ir_node *block = NULL; /* to shutup gcc */ ir_node *first_val = NULL; /* to shutup gcc */ ir_node *scnd_val = NULL; /* to shutup gcc */ @@ -411,6 +415,7 @@ equivalent_node (ir_node *n) } } #endif + /* Find first non-self-referencing input */ for (i = 0; i < n_preds; ++i) { first_val = follow_Id(get_Phi_pred(n, i)); @@ -424,7 +429,7 @@ equivalent_node (ir_node *n) } /* A totally Bad or self-referencing Phi (we didn't break the above loop) */ - if (i > n_preds) { n = new_Bad(); break; } + if (i >= n_preds) { n = new_Bad(); break; } scnd_val = NULL; @@ -443,8 +448,8 @@ equivalent_node (ir_node *n) } /* Fold, if no multiple distinct non-self-referencing inputs */ - if (i > n_preds) { - n = a; + if (i >= n_preds) { + n = first_val; } else { /* skip the remaining Ids. */ while (++i < n_preds) { @@ -870,11 +875,20 @@ gigo (ir_node *node) if ( op != op_Block && op != op_Phi && op != op_Tuple) { for (i = -1; i < get_irn_arity(node); i++) { if (is_Bad(get_irn_n(node, i))) { - node = new_Bad(); - break; + return new_Bad(); } } } +#if 0 + /* If Block has only Bads as predecessors it's garbage. */ + /* If Phi has only Bads as predecessors it's garbage. */ + if (op == op_Block || op == op_Phi) { + for (i = 0; i < get_irn_arity(node); i++) { + if (!is_Bad(get_irn_n(node, i))) break; + } + if (i = get_irn_arity(node)) node = new_Bad(); + } +#endif return node; } @@ -963,6 +977,8 @@ optimize_in_place (ir_node *n) tarval *tv; ir_node *old_n = n; + if (!get_optimize()) return n; + /* if not optimize return n */ if (n == NULL) { /* Here this is possible. Why? */ @@ -977,15 +993,17 @@ optimize_in_place (ir_node *n) tv = computed_value (n); if (tv != NULL) { /* evaluation was succesful -- replace the node. */ - return new_Const (get_tv_mode (tv), tv); + n = new_Const (get_tv_mode (tv), tv); + deb_info_copy(n, old_n, id_from_str("const_eval", 10)); + return n; /* xprintf("* optimize: computed node %I\n", n->op->name);*/ } } } /* remove unnecessary nodes */ - if (get_opt_constant_folding()) - // if (get_opt_constant_folding() || get_irn_op(n) == op_Phi) + //if (get_opt_constant_folding()) + if (get_opt_constant_folding() || get_irn_op(n) == op_Phi) n = equivalent_node (n); /** common subexpression elimination **/