sparc: split128 bit float loads into 2x64bit load
[libfirm] / ir / opt / tailrec.c
index 4fb6726..a9bb369 100644 (file)
@@ -45,7 +45,6 @@
 #include "irhooks.h"
 #include "ircons_t.h"
 #include "irpass.h"
-#include "opt_manage.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg;)
 
@@ -73,7 +72,7 @@ static void collect_data(ir_node *node, void *env)
        case iro_Proj:
                pred = get_Proj_pred(node);
 
-               opcode = get_irn_opcode(pred);
+               opcode = (ir_opcode)get_irn_opcode(pred);
                if (opcode == iro_Proj) {
                        ir_node *start = get_Proj_pred(pred);
 
@@ -559,20 +558,27 @@ static tail_rec_variants find_variant(ir_node *irn, ir_node *call)
 /*
  * convert simple tail-calls into loops
  */
-static ir_graph_properties_t do_tailrec(ir_graph *irg)
+void opt_tail_rec_irg(ir_graph *irg)
 {
-       tr_env            env;
-       ir_node           *end_block;
-       int               i, n_ress, n_tail_calls = 0;
-       ir_node           *rets = NULL;
-       ir_type           *mtd_type, *call_type;
-       ir_entity         *ent;
-       ir_graph          *rem;
+       tr_env    env;
+       ir_node   *end_block;
+       int       i, n_ress, n_tail_calls = 0;
+       ir_node   *rets = NULL;
+       ir_type   *mtd_type, *call_type;
+       ir_entity *ent;
+       ir_graph  *rem;
+
+       assure_irg_properties(irg,
+               IR_GRAPH_PROPERTY_MANY_RETURNS
+               | IR_GRAPH_PROPERTY_NO_BADS
+               | IR_GRAPH_PROPERTY_CONSISTENT_OUTS);
 
        FIRM_DBG_REGISTER(dbg, "firm.opt.tailrec");
 
-       if (! check_lifetime_of_locals(irg))
-               return 0;
+       if (! check_lifetime_of_locals(irg)) {
+               confirm_irg_properties(irg, IR_GRAPH_PROPERTIES_ALL);
+               return;
+       }
 
        rem = current_ir_graph;
        current_ir_graph = irg;
@@ -651,10 +657,11 @@ static ir_graph_properties_t do_tailrec(ir_graph *irg)
                                /* cannot be transformed */
                                break;
                        }
-                       if (var == TR_DIRECT)
-                       var = env.variants[j];
-                       else if (env.variants[j] == TR_DIRECT)
+                       if (var == TR_DIRECT) {
+                               var = env.variants[j];
+                       } else if (env.variants[j] == TR_DIRECT) {
                                env.variants[j] = var;
+                       }
                        if (env.variants[j] != var) {
                                /* not compatible */
                                DB((dbg, LEVEL_3, "  tail recursion fails for %d return value of %+F\n", j, ret));
@@ -684,26 +691,12 @@ static ir_graph_properties_t do_tailrec(ir_graph *irg)
                env.n_tail_calls = n_tail_calls;
                env.rets         = rets;
                do_opt_tail_rec(irg, &env);
+               confirm_irg_properties(irg, IR_GRAPH_PROPERTIES_NONE);
+       } else {
+               confirm_irg_properties(irg, IR_GRAPH_PROPERTIES_ALL);
        }
        ir_free_resources(irg, IR_RESOURCE_IRN_LINK);
        current_ir_graph = rem;
-       return 0;
-}
-
-
-/*
- * This tail recursion optimization works best
- * if the Returns are normalized.
- */
-static optdesc_t opt_tailrec = {
-       "tail-recursion",
-       IR_GRAPH_PROPERTY_MANY_RETURNS | IR_GRAPH_PROPERTY_NO_BADS | IR_GRAPH_PROPERTY_CONSISTENT_OUTS,
-       do_tailrec,
-};
-
-void opt_tail_rec_irg(ir_graph *irg)
-{
-       perform_irg_optimization(irg, &opt_tailrec);
 }
 
 ir_graph_pass_t *opt_tail_rec_irg_pass(const char *name)