changed ir_printf call into DBG output
[libfirm] / ir / be / bespillremat.c
index c4ed341..7de9864 100644 (file)
 #define LPP_SERVER "i44pc52"
 #define LPP_SOLVER "cplex"
 
-#define COST_LOAD      10
+#define COST_LOAD      8
 #define COST_STORE     50
 #define COST_REMAT     1
 
+#define LOOP_WEIGHT    12
+
 #define ILP_TIMEOUT    120
 
 #define ILP_UNDEF              -1
@@ -289,21 +291,21 @@ cmp_keyval(const void *a, const void *b, size_t size)
 }
 
 static double
-execution_frequency(const spill_ilp_t * si, const ir_node * irn)
+execution_frequency(const ir_node * irn)
 {
 #define FUDGE 0.001
-       if(si->execfreqs) {
-               if(is_Block(irn)) {
-                       return get_block_execfreq(si->execfreqs, irn) + FUDGE;
-               } else {
-                       return get_block_execfreq(si->execfreqs, get_nodes_block(irn)) + FUDGE;
-               }
+#ifndef EXECFREQ_LOOPDEPH
+       if(is_Block(irn)) {
+               return get_block_execfreq(irn) + FUDGE;
        } else {
-               if(is_Block(irn))
-                       return exp(get_loop_depth(get_irn_loop(irn)) * log(10)) + FUDGE;
-               else
-                       return exp(get_loop_depth(get_irn_loop(get_nodes_block(irn))) * log(10)) + FUDGE;
+               return get_block_execfreq(get_nodes_block(irn)) + FUDGE;
        }
+#else
+       if(is_Block(irn))
+               return exp(get_loop_depth(get_irn_loop(irn)) * log(10)) + FUDGE;
+       else
+               return exp(get_loop_depth(get_irn_loop(get_nodes_block(irn))) * log(10)) + FUDGE;
+#endif
 }
 
 static double
@@ -764,7 +766,7 @@ insert_remat_after(spill_ilp_t * si, const remat_t * remat, const ir_node * pos,
                op->is_remat = 1;
                op->attr.remat.remat = remat;
                op->attr.remat.pre = 0;
-               op->attr.remat.ilp = lpp_add_var(si->lpp, buf, lpp_binary, remat->cost*execution_frequency(si, pos));
+               op->attr.remat.ilp = lpp_add_var(si->lpp, buf, lpp_binary, remat->cost*execution_frequency(pos));
 
                set_irn_link(copy, op);
                pset_insert_ptr(si->all_possible_remats, copy);
@@ -802,7 +804,7 @@ insert_remat_before(spill_ilp_t * si, const remat_t * remat, const ir_node * pos
                op->is_remat = 1;
                op->attr.remat.remat = remat;
                op->attr.remat.pre = 1;
-               op->attr.remat.ilp = lpp_add_var(si->lpp, buf, lpp_binary, remat->cost*execution_frequency(si, pos));
+               op->attr.remat.ilp = lpp_add_var(si->lpp, buf, lpp_binary, remat->cost*execution_frequency(pos));
 
                set_irn_link(copy, op);
                pset_insert_ptr(si->all_possible_remats, copy);
@@ -1196,7 +1198,7 @@ luke_endwalker(ir_node * bb, void * data)
                query.irn = irn;
                spill = set_insert(spill_bb->ilp, &query, sizeof(query), HASH_PTR(irn));
 
-               spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(si, bb);
+               spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(bb);
 
                ir_snprintf(buf, sizeof(buf), "reg_out_%N_%N", irn, bb);
                spill->reg_out = lpp_add_var(si->lpp, buf, lpp_binary, 0.0);
@@ -1213,7 +1215,7 @@ luke_endwalker(ir_node * bb, void * data)
                        ilp_cst_t   rel_cst;
 
                        ir_snprintf(buf, sizeof(buf), "reload_%N_%N", bb, irn);
-                       reload = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(si, bb));
+                       reload = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(bb));
                        set_insert_keyval(spill_bb->reloads, irn, INT_TO_PTR(reload));
 
                        /* reload <= mem_out */
@@ -1237,7 +1239,7 @@ luke_endwalker(ir_node * bb, void * data)
                query.irn = irn;
                spill = set_insert(spill_bb->ilp, &query, sizeof(query), HASH_PTR(irn));
 
-               spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(si, bb);
+               spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(bb);
 
                ir_snprintf(buf, sizeof(buf), "reg_out_%N_%N", irn, bb);
                spill->reg_out = lpp_add_var(si->lpp, buf, lpp_binary, 0.0);
@@ -1251,7 +1253,7 @@ luke_endwalker(ir_node * bb, void * data)
                spill->spill = lpp_add_var(si->lpp, buf, lpp_binary, spill_cost);
 
                ir_snprintf(buf, sizeof(buf), "reload_%N_%N", bb, irn);
-               reload = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(si, bb));
+               reload = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(bb));
                set_insert_keyval(spill_bb->reloads, irn, INT_TO_PTR(reload));
 
                /* reload <= mem_out */
@@ -1358,7 +1360,7 @@ add_to_spill_bb(spill_ilp_t * si, ir_node * bb, ir_node * irn)
        query.irn = irn;
        spill = set_find(spill_bb->ilp, &query, sizeof(query), HASH_PTR(irn));
        if(!spill) {
-               double   spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(si, bb);
+               double   spill_cost = is_Unknown(irn)?0.0001:COST_STORE*execution_frequency(bb);
 
                spill = set_insert(spill_bb->ilp, &query, sizeof(query), HASH_PTR(irn));
 
@@ -1497,7 +1499,7 @@ insert_mem_copy_position(spill_ilp_t * si, pset * live, const ir_node * block)
                        }
                }
 
-               ir_snprintf(buf, sizeof(buf), "copyreq_%N_%N", block, to_copy);
+               ir_snprintf(buf, sizeof(buf), "copyreg_%N_%N", block, to_copy);
                cst = lpp_add_cst(si->lpp, buf, lpp_less, 0.0);
 
                /* copy - reg_out - copyreg <= 0 */
@@ -1790,7 +1792,7 @@ luke_blockwalker(ir_node * bb, void * data)
 
                                /* only for values in L\U (TODO and D?), the others are handled with post_use */
                                if(!pset_find_ptr(used, remat_arg)) {
-                                       /* remat <= live_rang(remat_arg) */
+                                       /* remat <= live_range(remat_arg) */
                                        ir_snprintf(buf, sizeof(buf), "req_remat2_%N_arg_%N", tmp, remat_arg);
                                        cst = lpp_add_cst(si->lpp, buf, lpp_less, 0.0);
 
@@ -1962,7 +1964,7 @@ luke_blockwalker(ir_node * bb, void * data)
                        assert(spill);
 
                        ir_snprintf(buf, sizeof(buf), "reload_%N_%N", arg, irn);
-                       op->attr.live_range.args.reloads[i] = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(si, bb));
+                       op->attr.live_range.args.reloads[i] = lpp_add_var(si->lpp, buf, lpp_binary, COST_LOAD*execution_frequency(bb));
 
                        /* reload <= mem_out */
                        ir_snprintf(buf, sizeof(buf), "req_reload_%N_%N", arg, irn);
@@ -2103,7 +2105,7 @@ luke_blockwalker(ir_node * bb, void * data)
                                                const ir_node  *arg2 = get_irn_n(spill->irn, m);
 
                                                if(arg==arg2) {
-                                                       freq += execution_frequency(si, get_Block_cfgpred_block(bb, m));
+                                                       freq += execution_frequency(get_Block_cfgpred_block(bb, m));
                                                }
                                        }
 
@@ -2653,24 +2655,6 @@ memcopyhandler(spill_ilp_t * si)
 }
 
 
-
-static void
-memcopyinsertor(spill_ilp_t * si)
-{
-       /* weise Spillkontexte zu. Sorge bei Phis dafuer, dass gleiche
-        * Kontexte zusammenfliessen (Operanden und Ergebnis hat gleichen
-        * Kontext)
-        */
-
-
-
-
-
-}
-
-
-
-
 static INLINE int
 is_zero(double x)
 {
@@ -2738,15 +2722,27 @@ sched_pressure_edge_hook(FILE *F, ir_node *irn)
        return 1;
 }
 
+static int
+sched_block_attr_hook(FILE *F, ir_node *node, ir_node *local)
+{
+    if(is_Block(node)) {
+        fprintf(F, " info3:\"execfreq %g\"", execution_frequency(node));
+    }
+
+    return 0;
+}
+
 static void
 dump_ir_block_graph_sched_pressure(ir_graph *irg, const char *suffix)
 {
-       DUMP_NODE_EDGE_FUNC old = get_dump_node_edge_hook();
+       DUMP_NODE_EDGE_FUNC old_edge_hook = get_dump_node_edge_hook();
 
        dump_consts_local(0);
+    set_dump_node_vcgattr_hook(sched_block_attr_hook);
        set_dump_node_edge_hook(sched_pressure_edge_hook);
        dump_ir_block_graph(irg, suffix);
-       set_dump_node_edge_hook(old);
+    set_dump_node_vcgattr_hook(NULL);
+       set_dump_node_edge_hook(old_edge_hook);
 }
 
 static void
@@ -3470,7 +3466,7 @@ walker_kill_unused(ir_node * bb, void * data)
 
                if(!lc_bitset_is_set(kh->used, get_irn_idx(irn))) {
                        if(be_is_Spill(irn) || be_is_Reload(irn)) {
-                               DBG((kh->si->dbg, LEVEL_1, "\t SUBOPTIMAL! %+F IS UNUSED (cost: %g)\n", irn, get_cost(kh->si, irn)*execution_frequency(kh->si, bb)));
+                               DBG((kh->si->dbg, LEVEL_1, "\t SUBOPTIMAL! %+F IS UNUSED (cost: %g)\n", irn, get_cost(kh->si, irn)*execution_frequency(bb)));
 #if 0
                                assert(lpp_get_sol_state(kh->si->lpp) != lpp_optimal && "optimal solution is suboptimal?");
 #endif
@@ -3762,7 +3758,7 @@ be_spill_remat(const be_chordal_env_t * chordal_env)
        si.spills = pset_new_ptr_default();
        si.inverse_ops = pset_new_ptr_default();
 #ifndef EXECFREQ_LOOPDEPH
-       si.execfreqs = compute_execfreq(chordal_env->irg);
+       compute_execfreq(chordal_env->irg, LOOP_WEIGHT);
 #else
        si.execfreqs = NULL;
 #endif
@@ -3876,8 +3872,8 @@ be_spill_remat(const be_chordal_env_t * chordal_env)
 
        // move reloads upwards
        be_liveness(chordal_env->irg);
-       //irg_block_walk_graph(chordal_env->irg, walker_pressure_annotator, NULL, &si);
-       //move_reloads_upward(&si);
+       irg_block_walk_graph(chordal_env->irg, walker_pressure_annotator, NULL, &si);
+       move_reloads_upward(&si);
 
 #ifndef NO_MEMCOPIES
        verify_phiclasses(&si);
@@ -3896,7 +3892,7 @@ be_spill_remat(const be_chordal_env_t * chordal_env)
        del_pset(si.all_possible_remats);
        del_pset(si.spills);
 #ifndef EXECFREQ_LOOPDEPH
-       free_execfreq(si.execfreqs);
+       free_execfreq();
 #endif
        free_lpp(si.lpp);
        obstack_free(&obst, NULL);