X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelistsched.c;h=b3aa153ef67960e9d1e3868a3b65d2cbe8b2fecc;hb=8974b94349462d835b33ad4f896d1821986458bd;hp=09ea4e1ed1115adbc2eceb55f8472c514106c666;hpb=ef9e93e28c51fb162e73554f07239d99f9058878;p=libfirm diff --git a/ir/be/belistsched.c b/ir/be/belistsched.c index 09ea4e1ed..b3aa153ef 100644 --- a/ir/be/belistsched.c +++ b/ir/be/belistsched.c @@ -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 -#include +#include "lc_opts.h" +#include "lc_opts_enum.h" DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL); @@ -90,7 +90,7 @@ typedef struct _list_sched_options_t { } list_sched_options_t; static list_sched_options_t list_sched_options = { - BE_SCHED_SELECT_HEUR, /* mueller heuristic selector */ + BE_SCHED_SELECT_NORMAL, /* mueller heuristic selector */ BE_SCHED_PREP_NONE, /* no scheduling preparation */ }; @@ -229,7 +229,7 @@ static INLINE int make_ready(block_sched_env_t *env, ir_node *pred, ir_node *irn /* if irn is an End we have keep-alives and op might be a block, skip that */ if (is_Block(op)) { - assert(get_irn_op(irn) == op_End); + assert(is_End(irn)); continue; } @@ -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);