- fixed one Win32 "deprecated posix name" warning
[libfirm] / ir / be / belistsched.c
index c378e82..cf31ea4 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.
  *
@@ -61,8 +61,8 @@
 #include "bestat.h"
 #include "beirg_t.h"
 
-#include <libcore/lc_opts.h>
-#include <libcore/lc_opts_enum.h>
+#include "lc_opts.h"
+#include "lc_opts_enum.h"
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL);
 
@@ -452,14 +452,29 @@ static void list_sched_block(ir_node *block, void *env_ptr)
 
        /* Then one can add all nodes are ready to the set. */
        foreach_out_edge(block, edge) {
-               ir_node *irn = get_edge_src_irn(edge);
+               ir_node   *irn = get_edge_src_irn(edge);
+               ir_opcode code = get_irn_opcode(irn);
+               int users;
 
-               /* Skip the end node because of keepalive edges. */
-               if (get_irn_opcode(irn) == iro_End)
+               if (code == iro_End) {
+                       /* Skip the end node because of keep-alive edges. */
                        continue;
+               } else if (code == iro_Block) {
+                       /* A Block-Block edge. This should be the MacroBlock
+                        * edge, ignore it. */
+                       assert(get_Block_MacroBlock(irn) == block && "Block-Block edge found");
+                       continue;
+               }
 
-               if (get_irn_n_edges(irn) == 0)
+               users = get_irn_n_edges(irn);
+               if (users == 0)
                        continue;
+               else if (users == 1) { /* ignore nodes that are only hold by the anchor */
+                       const ir_edge_t *edge = get_irn_out_edge_first_kind(irn, EDGE_KIND_NORMAL);
+                       ir_node *user = get_edge_src_irn(edge);
+                       if (is_Anchor(user))
+                               continue;
+               }
 
                if (is_Phi(irn)) {
                        /*
@@ -471,13 +486,10 @@ static void list_sched_block(ir_node *block, void *env_ptr)
                else if (irn == start_node) {
                        /* The start block will be scheduled as the first node */
                        add_to_sched(&be, irn);
-#ifdef SCHEDULE_PROJS
-                       add_tuple_projs(&be, irn);
-#endif
                }
                else {
                        /* Other nodes must have all operands in other blocks to be made
-                       * ready */
+                        * ready */
                        int ready = 1;
 
                        /* Check, if the operands of a node are not local to this block */
@@ -550,14 +562,14 @@ void list_sched(be_irg_t *birg, be_options_t *be_opts)
 
        /* Select a scheduler based on backend options */
        switch (list_sched_options.select) {
-               case BE_SCHED_SELECT_TRIVIAL:  sel = *trivial_selector;      break;
-               case BE_SCHED_SELECT_RANDOM:   sel = *random_selector;       break;
-               case BE_SCHED_SELECT_REGPRESS: sel = *reg_pressure_selector; break;
-               case BE_SCHED_SELECT_MUCHNIK:  sel = *muchnik_selector;      break;
-               case BE_SCHED_SELECT_HEUR:     sel = *heuristic_selector;    break;
-               case BE_SCHED_SELECT_NORMAL:   sel = *normal_selector;       break;
+               case BE_SCHED_SELECT_TRIVIAL:  sel = trivial_selector;      break;
+               case BE_SCHED_SELECT_RANDOM:   sel = random_selector;       break;
+               case BE_SCHED_SELECT_REGPRESS: sel = reg_pressure_selector; break;
+               case BE_SCHED_SELECT_MUCHNIK:  sel = muchnik_selector;      break;
+               case BE_SCHED_SELECT_HEUR:     sel = heuristic_selector;    break;
+               case BE_SCHED_SELECT_NORMAL:   sel = normal_selector;       break;
                default:
-               case BE_SCHED_SELECT_HMUCHNIK: sel = *trivial_selector;      break;
+               case BE_SCHED_SELECT_HMUCHNIK: sel = trivial_selector;      break;
        }
 
 #if 1
@@ -586,7 +598,7 @@ void list_sched(be_irg_t *birg, be_options_t *be_opts)
 
        /* initialize environment for list scheduler */
        memset(&env, 0, sizeof(env));
-       env.selector   = arch_env->isa->impl->get_list_sched_selector(arch_env->isa, &sel);
+       env.selector   = arch_env_get_list_sched_selector(arch_env, &sel);
        env.arch_env   = arch_env;
        env.irg        = irg;
        env.sched_info = NEW_ARR_F(sched_irn_t, num_nodes);
@@ -623,14 +635,14 @@ void list_sched_single_block(const be_irg_t *birg, ir_node *block,
 
        /* Select a scheduler based on backend options */
        switch (list_sched_options.select) {
-               case BE_SCHED_SELECT_TRIVIAL:  sel = *trivial_selector;      break;
-               case BE_SCHED_SELECT_RANDOM:   sel = *random_selector;       break;
-               case BE_SCHED_SELECT_REGPRESS: sel = *reg_pressure_selector; break;
-               case BE_SCHED_SELECT_MUCHNIK:  sel = *muchnik_selector;      break;
-               case BE_SCHED_SELECT_HEUR:     sel = *heuristic_selector;    break;
-               case BE_SCHED_SELECT_NORMAL:   sel = *normal_selector;       break;
+               case BE_SCHED_SELECT_TRIVIAL:  sel = trivial_selector;      break;
+               case BE_SCHED_SELECT_RANDOM:   sel = random_selector;       break;
+               case BE_SCHED_SELECT_REGPRESS: sel = reg_pressure_selector; break;
+               case BE_SCHED_SELECT_MUCHNIK:  sel = muchnik_selector;      break;
+               case BE_SCHED_SELECT_HEUR:     sel = heuristic_selector;    break;
+               case BE_SCHED_SELECT_NORMAL:   sel = normal_selector;       break;
                default:
-               case BE_SCHED_SELECT_HMUCHNIK: sel = *trivial_selector;      break;
+               case BE_SCHED_SELECT_HMUCHNIK: sel = trivial_selector;      break;
        }
 
        /* Assure, that the out edges are computed */
@@ -641,7 +653,7 @@ void list_sched_single_block(const be_irg_t *birg, ir_node *block,
 
        /* initialize environment for list scheduler */
        memset(&env, 0, sizeof(env));
-       env.selector   = arch_env->isa->impl->get_list_sched_selector(arch_env->isa, &sel);
+       env.selector   = arch_env_get_list_sched_selector(arch_env, &sel);
        env.arch_env   = arch_env;
        env.irg        = irg;
        env.sched_info = NEW_ARR_F(sched_irn_t, num_nodes);