fix handling of default pns in the backend (they don't need table entries)
[libfirm] / ir / be / belistsched.c
index c378e82..09ea4e1 100644 (file)
@@ -453,13 +453,21 @@ 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);
+               int users;
 
                /* Skip the end node because of keepalive edges. */
                if (get_irn_opcode(irn) == iro_End)
                        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)) {
                        /*
@@ -550,14 +558,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
@@ -623,14 +631,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 */