fix cltd
[libfirm] / ir / be / beifg.c
index fd020ce..c047a14 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
  *
  * This file is part of libFirm.
  *
  * @date        18.11.2005
  * @version     $Id$
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <stdlib.h>
 
-#include <libcore/lc_opts.h>
-#include <libcore/lc_opts_enum.h>
-#include <libcore/lc_timing.h>
+#include "lc_opts.h"
+#include "lc_opts_enum.h"
 
+#include "timing.h"
 #include "bitset.h"
 #include "irgwalk.h"
 #include "irnode_t.h"
@@ -48,7 +46,7 @@
 
 #include "becopystat.h"
 #include "becopyopt.h"
-#include "beirg_t.h"
+#include "beirg.h"
 #include "bemodule.h"
 
 /** Defines values for the ifg performance test */
@@ -59,7 +57,6 @@ typedef struct _coloring_t coloring_t;
 
 struct _coloring_t {
        ir_phase         ph;
-       const arch_env_t *arch_env;
        ir_graph         *irg;
 };
 
@@ -78,18 +75,17 @@ size_t (be_ifg_cliques_iter_size)(const be_ifg_t *ifg)
        return ifg->impl->cliques_iter_size;
 }
 
-static void *regs_irn_data_init(ir_phase *ph, ir_node *irn, void *data)
+static void *regs_irn_data_init(ir_phase *ph, const ir_node *irn, void *data)
 {
-       coloring_t *coloring = (coloring_t *) ph;
-       (void) data;
+       (void)ph;
+       (void)data;
 
-       return (void *) arch_get_irn_register(coloring->arch_env, irn);
+       return (void*)arch_get_irn_register(irn);
 }
 
-coloring_t *coloring_init(coloring_t *c, ir_graph *irg, const arch_env_t *aenv)
+static coloring_t *coloring_init(coloring_t *c, ir_graph *irg)
 {
        phase_init(&c->ph, "regs_map", irg, PHASE_DEFAULT_GROWTH, regs_irn_data_init, NULL);
-       c->arch_env = aenv;
        c->irg = irg;
        return c;
 }
@@ -105,15 +101,15 @@ static void restore_irn_color(ir_node *irn, void *c)
        coloring_t *coloring = c;
        const arch_register_t *reg = phase_get_irn_data(&coloring->ph, irn);
        if(reg)
-               arch_set_irn_register(coloring->arch_env, irn, reg);
+               arch_set_irn_register(irn, reg);
 }
 
-void coloring_save(coloring_t *c)
+static void coloring_save(coloring_t *c)
 {
        irg_walk_graph(c->irg, NULL, get_irn_color, c);
 }
 
-void coloring_restore(coloring_t *c)
+static void coloring_restore(coloring_t *c)
 {
        irg_walk_graph(c->irg, NULL, restore_irn_color, c);
 }
@@ -184,7 +180,7 @@ int be_ifg_is_simplicial(const be_ifg_t *ifg, const ir_node *irn)
        int degree = be_ifg_degree(ifg, irn);
        void *iter = be_ifg_neighbours_iter_alloca(ifg);
 
-       ir_node **neighbours = xmalloc(degree * sizeof(neighbours[0]));
+       ir_node **neighbours = XMALLOCN(ir_node*, degree);
 
        ir_node *curr;
        int i, j;
@@ -261,8 +257,8 @@ static int be_ifg_check_cmp_nodes(const void *a, const void *b)
        const ir_node *node_a = *(ir_node **)a;
        const ir_node *node_b = *(ir_node **)b;
 
-       long nr_a = get_irn_node_nr(node_a);
-       long nr_b = get_irn_node_nr(node_b);
+       long nr_a = get_irn_idx(node_a);
+       long nr_b = get_irn_idx(node_b);
 
        return QSORT_CMP(nr_a, nr_b);
 }
@@ -276,7 +272,7 @@ void be_ifg_check_sorted(const be_ifg_t *ifg)
        const int node_count = be_ifg_check_get_node_count(ifg);
        int i = 0;
 
-       ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0]));
+       ir_node **all_nodes = XMALLOCN(ir_node*, node_count);
 
        be_ifg_foreach_node(ifg, iter1, n)
        {
@@ -294,7 +290,7 @@ void be_ifg_check_sorted(const be_ifg_t *ifg)
 
        for (i = 0; i < node_count; i++)
        {
-               ir_node **neighbours = xmalloc(node_count * sizeof(neighbours[0]));
+               ir_node **neighbours = XMALLOCN(ir_node*, node_count);
                int j = 0;
                int k = 0;
                int degree = 0;
@@ -334,7 +330,7 @@ void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f)
        const int node_count = be_ifg_check_get_node_count(ifg);
        int i = 0;
 
-       ir_node **all_nodes = xmalloc(node_count * sizeof(all_nodes[0]));
+       ir_node **all_nodes = XMALLOCN(ir_node*, node_count);
 
        be_ifg_foreach_node(ifg, iter1, n)
        {
@@ -352,7 +348,7 @@ void be_ifg_check_sorted_to_file(const be_ifg_t *ifg, FILE *f)
 
        for (i = 0; i < node_count; i++)
        {
-               ir_node **neighbours = xmalloc(node_count * sizeof(neighbours[0]));
+               ir_node **neighbours = XMALLOCN(ir_node*, node_count);
                int j = 0;
                int k = 0;
                int degree = 0;
@@ -395,30 +391,30 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
        copy_opt_t *co;
        be_ifg_t *old_if = chordal_env->ifg;
 
-       lc_timer_t *timer = lc_timer_register("getTime","get Time of copy minimization using the ifg");
+       ir_timer_t *timer = ir_timer_register("getTime","get Time of copy minimization using the ifg");
        unsigned long elapsed_usec = 0;
 
        if (get_irg_estimated_node_cnt(chordal_env->irg) >= BE_CH_PERFORMANCETEST_MIN_NODES)
        {
-               coloring_init(&coloring, chordal_env->irg, chordal_env->birg->main_env->arch_env);
+               coloring_init(&coloring, chordal_env->irg);
                coloring_save(&coloring);
 
-               lc_timer_reset(timer);
+               ir_timer_reset(timer);
 
                for (i = 0; i<tests; i++) /* performance test with std */
                {
 
-                       used_memory = lc_get_heap_used_bytes();
+                       used_memory = ir_get_heap_used_bytes();
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        chordal_env->ifg = be_ifg_std_new(chordal_env);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
-                       used_memory = lc_get_heap_used_bytes() - used_memory;
+                       used_memory = ir_get_heap_used_bytes() - used_memory;
 
                        coloring_restore(&coloring);
 
@@ -427,13 +423,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
                        co_build_ou_structure(co);
                        co_build_graph_structure(co);
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        co_solve_heuristic_new(co);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
                        co_free_graph_structure(co);
                        co_free_ou_structure(co);
@@ -442,7 +438,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                }
 
-               elapsed_usec = lc_timer_elapsed_usec(timer);
+               elapsed_usec = ir_timer_elapsed_usec(timer);
                /* calculating average */
                elapsed_usec = elapsed_usec / tests;
 
@@ -453,17 +449,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                for (i = 0; i<tests; i++)  /* performance test with clique */
                {
-                       used_memory = lc_get_heap_used_bytes();
+                       used_memory = ir_get_heap_used_bytes();
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        chordal_env->ifg = be_ifg_clique_new(chordal_env);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
-                       used_memory = lc_get_heap_used_bytes() - used_memory;
+                       used_memory = ir_get_heap_used_bytes() - used_memory;
 
                        coloring_restore(&coloring);
 
@@ -472,13 +468,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
                        co_build_ou_structure(co);
                        co_build_graph_structure(co);
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        co_solve_heuristic_new(co);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
                        co_free_graph_structure(co);
                        co_free_ou_structure(co);
@@ -487,7 +483,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                }
 
-               elapsed_usec = lc_timer_elapsed_usec(timer);
+               elapsed_usec = ir_timer_elapsed_usec(timer);
                /* calculating average */
                elapsed_usec = elapsed_usec / tests;
 
@@ -498,17 +494,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                for (i = 0; i<tests; i++)  /* performance test with list */
                {
-                       used_memory = lc_get_heap_used_bytes();
+                       used_memory = ir_get_heap_used_bytes();
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        chordal_env->ifg = be_ifg_list_new(chordal_env);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
-                       used_memory = lc_get_heap_used_bytes() - used_memory;
+                       used_memory = ir_get_heap_used_bytes() - used_memory;
 
                        coloring_restore(&coloring);
 
@@ -517,13 +513,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
                        co_build_ou_structure(co);
                        co_build_graph_structure(co);
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        co_solve_heuristic_new(co);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
                        co_free_graph_structure(co);
                        co_free_ou_structure(co);
@@ -532,7 +528,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                }
 
-               elapsed_usec = lc_timer_elapsed_usec(timer);
+               elapsed_usec = ir_timer_elapsed_usec(timer);
                /* calculating average */
                elapsed_usec = elapsed_usec / tests;
 
@@ -543,17 +539,17 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                for (i = 0; i<tests; i++)  /* performance test with pointer */
                {
-                       used_memory = lc_get_heap_used_bytes();
+                       used_memory = ir_get_heap_used_bytes();
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        chordal_env->ifg = be_ifg_pointer_new(chordal_env);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
-                       used_memory = lc_get_heap_used_bytes() - used_memory;
+                       used_memory = ir_get_heap_used_bytes() - used_memory;
 
                        coloring_restore(&coloring);
 
@@ -562,13 +558,13 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
                        co_build_ou_structure(co);
                        co_build_graph_structure(co);
 
-                       rt = lc_timer_enter_high_priority();
-                       lc_timer_start(timer);
+                       rt = ir_timer_enter_high_priority();
+                       ir_timer_start(timer);
 
                        co_solve_heuristic_new(co);
 
-                       lc_timer_stop(timer);
-                       rt = lc_timer_leave_high_priority();
+                       ir_timer_stop(timer);
+                       rt = ir_timer_leave_high_priority();
 
                        co_free_graph_structure(co);
                        co_free_ou_structure(co);
@@ -577,7 +573,7 @@ void be_ifg_check_performance(be_chordal_env_t *chordal_env)
 
                }
 
-               elapsed_usec = lc_timer_elapsed_usec(timer);
+               elapsed_usec = ir_timer_elapsed_usec(timer);
                /* calculating average */
                elapsed_usec = elapsed_usec / tests;
 
@@ -640,16 +636,20 @@ void be_ifg_dump_dot(be_ifg_t *ifg, ir_graph *irg, FILE *file, const be_ifg_dump
        bitset_free(nodes);
 }
 
-static void int_comp_rec(be_irg_t *birg, be_ifg_t *ifg, ir_node *n, bitset_t *seen)
+static void int_comp_rec(be_ifg_t *ifg, ir_node *n, bitset_t *seen)
 {
        void    *neigh_it = be_ifg_neighbours_iter_alloca(ifg);
        ir_node *m;
 
        be_ifg_foreach_neighbour(ifg, neigh_it, n, m) {
-               if(!bitset_contains_irn(seen, m) && !arch_irn_is(birg->main_env->arch_env, m, ignore)) {
-                       bitset_add_irn(seen, m);
-                       int_comp_rec(birg, ifg, m, seen);
-               }
+               if (bitset_contains_irn(seen, m))
+                       continue;
+
+               if (arch_get_register_req_out(m)->type & arch_register_req_type_ignore)
+                       continue;
+
+               bitset_add_irn(seen, m);
+               int_comp_rec(ifg, m, seen);
        }
 
 }
@@ -663,11 +663,15 @@ static int int_component_stat(be_irg_t *birg, be_ifg_t *ifg)
        ir_node *n;
 
        be_ifg_foreach_node(ifg, nodes_it, n) {
-               if (! bitset_contains_irn(seen, n) && ! arch_irn_is(birg->main_env->arch_env, n, ignore)) {
-                       ++n_comp;
-                       bitset_add_irn(seen, n);
-                       int_comp_rec(birg, ifg, n, seen);
-               }
+               if (bitset_contains_irn(seen, n))
+                       continue;
+
+               if (arch_get_register_req_out(n)->type & arch_register_req_type_ignore)
+                       continue;
+
+               ++n_comp;
+               bitset_add_irn(seen, n);
+               int_comp_rec(ifg, n, seen);
        }
 
        free(seen);