Several fixes for normal scheduler.
[libfirm] / ir / be / belistsched.c
index 2255336..c8cf497 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)) {
                        /*
@@ -477,7 +492,7 @@ static void list_sched_block(ir_node *block, void *env_ptr)
                }
                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 */