*** empty log message ***
authorDaniel Grund <grund@cs.uni-saarland.de>
Fri, 30 Sep 2005 10:46:43 +0000 (10:46 +0000)
committerDaniel Grund <grund@cs.uni-saarland.de>
Fri, 30 Sep 2005 10:46:43 +0000 (10:46 +0000)
ir/be/bearch_firm.c
ir/be/bechordal.c
ir/be/belistsched.c
ir/be/bemain.c
ir/be/besched_t.h
ir/be/bespillilp.c

index 2f9eccd..e024f88 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "irreflect.h"
 
-#define N_REGS 8
+#define N_REGS 4
 
 static arch_register_t datab_regs[N_REGS];
 
index cc9036d..b7fec14 100644 (file)
@@ -641,7 +641,7 @@ static void check_pressure_walker(ir_node *bl, void *data)
        ir_node *irn;
        irn_live_t *li;
 
-//     firm_dbg_set_mask(dbg, -1);
+       firm_dbg_set_mask(dbg, -1);
 
        live_foreach(bl, li) {
                if(live_is_end(li) && check_pressure_has_class(info, li->irn)) {
index 793c915..3db352a 100644 (file)
@@ -302,7 +302,6 @@ static void list_sched_block(ir_node *block, void *env_ptr)
        sched_env_t *env = env_ptr;
        block_sched_env_t be;
        const list_sched_selector_t *selector = env->selector;
-
        const ir_edge_t *edge;
        ir_node *irn;
        int i, n, j, m;
@@ -345,14 +344,14 @@ static void list_sched_block(ir_node *block, void *env_ptr)
                /* Other nodes must have all operands in other blocks to be made
                 * ready */
                else {
-                       bool ready = true;
+                       int ready = 1;
 
                        /* Check, if the operands of a node are not local to this block */
                        for(j = 0, m = get_irn_arity(irn); j < m; ++j) {
                                ir_node *operand = get_irn_n(irn, j);
 
                                if(get_nodes_block(operand) == block) {
-                                       ready = false;
+                                       ready = 0;
                                        break;
                                }
                        }
index 58a02ef..867a1a2 100644 (file)
@@ -178,8 +178,8 @@ static void be_main_loop(void)
                        DBG((env.dbg, LEVEL_1, "----> Reg class: %s\n", cls->name));
 
                        /* spilling */
-                       //be_spill_ilp(&session, cls);
-                       be_spill_belady(&session, cls);
+                       be_spill_ilp(&session, cls);
+                       //be_spill_belady(&session, cls);
 #ifdef DUMP_SPILL
                        dump_ir_block_graph_sched(session.irg, "-spill");
 #endif
index 54f59db..9d972ca 100644 (file)
@@ -56,6 +56,9 @@ static INLINE int to_appear_in_schedule(ir_node *irn)
 {
   int i, n;
 
+  if(get_irn_opcode(irn) == iro_Start)
+       return 1;
+
   for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
     ir_node *op = get_irn_n(irn, i);
     if(mode_is_datab(get_irn_mode(op)))
index e526d3f..a61ae4a 100644 (file)
 
 #define MAX(a,b) ((a) > (b) ? (a) : (b))
 
-#define DBG_LEVEL SET_LEVEL_0
+#define DBG_LEVEL SET_LEVEL_4
 
 #undef DUMP_SOLUTION
-#undef DUMP_ILP
+#define DUMP_ILP
 #undef DUMP_STATS
 
 #define LPP_SERVER "i44pc52"
@@ -181,30 +181,42 @@ static live_range_t *get_live_range(spill_ilp_t *si, ir_node *irn, ir_node *user
 static ir_node *process_irn(spill_ilp_t *si, pset *live, ir_node *irn, int *demand)
 {
        int i, n;
-       int relevant_args = 0, num_projs = 0;
+       int relevant_args = 0, results = 0;
+
+       DBG((si->dbg, LEVEL_1, "at %+F\n", irn));
 
        while(is_Proj(irn)) {
                if(has_reg_class(si, irn)) {
                        assert(pset_find_ptr(live, irn) && "node must be live");
                        pset_remove_ptr(live, irn);
-                       num_projs++;
+                       results++;
                }
 
+               DBG((si->dbg, LEVEL_1, "skipped proj %+F\n", irn));
                irn = sched_prev(irn);
        }
 
-       if(num_projs > 0)
+       DBG((si->dbg, LEVEL_1, "\tlanded at irn %+F\n", irn));
+
+       if(results > 0)
                assert(get_irn_mode(irn) == mode_T && "node before projs must be tuple");
 
+       if(has_reg_class(si, irn)) {
+               assert( pset_find_ptr(live, irn) && "node must be live");
+               pset_remove_ptr(live, irn);
+               results = 1;
+       }
+
        for(i = 0, n = get_irn_arity(irn); i < n; ++i) {
                ir_node *op = get_irn_n(irn, i);
-               relevant_args += has_reg_class(si, op) && !pset_find_ptr(live, op);
+               if(has_reg_class(si, op) && !pset_find_ptr(live, op)) {
+                       relevant_args++;
+                       DBG((si->dbg, LEVEL_1, "\trelevant arg %+F\n", op));
+               }
        }
 
-       assert(pset_find_ptr(live, irn) && "node must be live");
-       pset_remove_ptr(live, irn);
-
-       *demand = MAX(num_projs, relevant_args);
+       *demand = MAX(results, relevant_args);
+       DBG((si->dbg, LEVEL_1, "\tdemand: %d\n", *demand));
        return irn;
 }
 
@@ -234,7 +246,7 @@ static void process_block(ir_node *bl, void *data)
     }
   }
 
-       for(irn = sched_last(bl); !sched_is_begin(irn) && !is_Phi(irn); irn = next_irn) {
+       for(irn = sched_last(bl); !sched_is_begin(irn) && !is_Phi(irn); irn = sched_prev(irn)) {
                ir_node *l;
                int cst;
                int demand;
@@ -253,7 +265,7 @@ static void process_block(ir_node *bl, void *data)
                n_live = pset_count(live);
 #endif
 
-               next_irn = process_irn(si, live, irn, &demand);
+               irn = process_irn(si, live, irn, &demand);
                n_live = pset_count(live);
 
                /*
@@ -506,7 +518,7 @@ void be_spill_ilp(const be_main_session_env_t *session_env,
        si.irn_use_heads   = new_set(cmp_irn_use_head, 4096);
        si.live_ranges     = new_set(cmp_live_range, 16384);
        si.senv.spill_ctxs = new_set(be_set_cmp_spillctx, 4096);
-       si.enable_remat    = 1;
+       si.enable_remat    = 0;
        si.enable_store    = 0;
 
        firm_dbg_set_mask(si.dbg, DBG_LEVEL);
@@ -528,8 +540,8 @@ void be_spill_ilp(const be_main_session_env_t *session_env,
 #endif
 
        DBG((si.dbg, LEVEL_1, "%F\n", session_env->irg));
-       lpp_solve_net(si.lpp, LPP_SERVER, LPP_SOLVER);
-       // lpp_solve_cplex(si.lpp);
+//     lpp_solve_net(si.lpp, LPP_SERVER, LPP_SOLVER);
+       lpp_solve_cplex(si.lpp);
        assert(lpp_is_sol_valid(si.lpp) && "solution of ILP must be valid");
 
        DBG((si.dbg, LEVEL_1, "\tnodes: %d, vars: %d, csts: %d\n",