added additional source (new copymin heuristic)
[libfirm] / ir / be / beschedmris.c
index 264d8ef..69edb30 100644 (file)
@@ -9,14 +9,14 @@
 
 #include <limits.h>
 
-#include "misc.h"
-#include "obstack.h"
+#include "obst.h"
 #include "debug.h"
 
 #include "irgraph_t.h"
 #include "irnode_t.h"
 #include "iredges_t.h"
 #include "ircons_t.h"
+#include "irphase_t.h"
 #include "irgwalk.h"
 #include "irtools.h"
 
@@ -25,7 +25,7 @@
 #include "beschedmris.h"
 
 struct _mris_env_t {
-       firm_dbg_module_t *dbg;
+       phase_t            ph;
        const arch_env_t  *aenv;
        ir_graph          *irg;
        ir_node           *bl;
@@ -33,6 +33,7 @@ struct _mris_env_t {
        int               visited;
        struct list_head  lineage_head;
        struct obstack    obst;
+DEBUG_ONLY(firm_dbg_module_t *dbg;)
 };
 
 typedef struct _mris_irn_t {
@@ -46,21 +47,15 @@ typedef struct _mris_irn_t {
 
 #define to_appear(env, irn) (to_appear_in_schedule(irn) && get_nodes_block(irn) == env->bl)
 
+#define get_mris_irn(env, irn)   ((mris_irn_t *) phase_get_or_set_irn_data(&env->ph, irn))
 #define get_irn_height(env, irn) (get_mris_irn(env, irn)->height)
 #define foreach_lineage(env, pos, tmp) list_for_each_entry_safe(mris_irn_t, pos, tmp, &(env)->lineage_head, lineage_list)
 
-static mris_irn_t *get_mris_irn(mris_env_t *env, ir_node *irn)
+static void mris_irn_data_init(phase_t *ph, const ir_node *irn, void *data)
 {
-       mris_irn_t *mi = get_irn_link(irn);
-
-       if(!mi) {
-               mi = obstack_alloc(&env->obst, sizeof(mi[0]));
-               memset(mi, 0, sizeof(mi[0]));
-               set_irn_link(irn, mi);
-               INIT_LIST_HEAD(&mi->lineage_list);
-       }
-
-       return mi;
+       mris_irn_t *mi = data;
+       memset(data, 0, sizeof(mi[0]));
+       INIT_LIST_HEAD(&mi->lineage_list);
 }
 
 static int compute_height(mris_env_t *env, ir_node *irn, unsigned long visited)
@@ -384,7 +379,6 @@ static int fuse_two_lineages(mris_env_t *env, mris_irn_t *u, mris_irn_t *v)
        {
                const arch_register_class_t *cls;
                ir_node *op    = NULL;
-               int i, n;
 
                if(get_irn_arity(start) == 0)
                        return 0;
@@ -457,6 +451,7 @@ mris_env_t *be_sched_mris_preprocess(const be_irg_t *birg)
 {
        mris_env_t *env = xmalloc(sizeof(env[0]));
 
+       phase_init(&env->ph, "mris", birg->irg, sizeof(mris_irn_t), 2 * PHASE_DEFAULT_GROWTH, mris_irn_data_init);
        env->aenv     = birg->main_env->arch_env;
        env->irg      = birg->irg;
        env->visited  = 0;
@@ -474,7 +469,7 @@ static void cleanup_inserted(mris_env_t *env)
 {
        ir_node *irn;
 
-       for(irn = nodeset_first(env->inserted); irn; irn = nodeset_next(env->inserted)) {
+       foreach_nodeset(env->inserted, irn) {
                int i, n;
                ir_node *tgt;
 
@@ -483,7 +478,8 @@ static void cleanup_inserted(mris_env_t *env)
 
                /* reroute the edges, remove from schedule and make it invisible. */
                edges_reroute(irn, tgt, env->irg);
-               sched_remove(irn);
+               if (sched_is_scheduled(irn))
+                       sched_remove(irn);
                for(i = -1, n = get_irn_arity(irn); i < n; ++i)
                        set_irn_n(irn, i, new_r_Bad(env->irg));
        }
@@ -492,6 +488,7 @@ static void cleanup_inserted(mris_env_t *env)
 void be_sched_mris_free(mris_env_t *env)
 {
        cleanup_inserted(env);
+       phase_free(&env->ph);
        del_nodeset(env->inserted);
        free(env);
 }