Use backtracking in find_original_value() for the flags emitter.
[libfirm] / ir / be / belistsched.c
index 09ea4e1..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,12 +452,19 @@ 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;
+               }
 
                users = get_irn_n_edges(irn);
                if (users == 0)
@@ -479,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 */
@@ -594,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);
@@ -649,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);