X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeschedtrace.c;h=e64296b8179a1263425f18f7658b98041d57fd1f;hb=2669742071b00949c6a5102f39b7df7fd7d3e3fb;hp=56a3d1d3c72d0a051e30bac33e001b7a59da9071;hpb=7188e769b099cf2e9a5bc96fdec3226a3ebb8d48;p=libfirm diff --git a/ir/be/beschedtrace.c b/ir/be/beschedtrace.c index 56a3d1d3c..e64296b81 100644 --- a/ir/be/beschedtrace.c +++ b/ir/be/beschedtrace.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. * @@ -305,10 +305,13 @@ static int get_reg_difference(trace_env_t *env, ir_node *irn) { for (i = get_irn_arity(irn) - 1; i >= 0; i--) { ir_node *in = get_irn_n(irn, i); - if (! be_is_live_end(env->liveness, block, in) && /* if the value lives outside of block: do not count */ - mode_is_datab(get_irn_mode(in)) && /* must be data node */ - ! arch_irn_is(env->arch_env, in, ignore)) /* ignore "ignore" nodes :) */ + if (mode_is_datab(get_irn_mode(in)) && /* must be data node */ + ! arch_irn_is(env->arch_env, in, ignore) && /* ignore "ignore" nodes :) */ + ! be_is_live_end(env->liveness, block, in) /* if the value lives outside of block: do not count */ + + ) { num_in++; + } } return num_out - num_in; @@ -391,6 +394,16 @@ static void trace_preprocess_block(trace_env_t *env, ir_node *block) { foreach_out_edge(block, edge) { ir_node *succ = get_edge_src_irn(edge); + if (is_Block(succ)) { + /* A Block-Block edge. This should be the MacroBlock + * edge, ignore it. */ + assert(get_Block_MacroBlock(succ) == block && "Block-Block edge found"); + continue; + } + if (is_Anchor(succ)) { + /* ignore a keep alive edge */ + continue; + } if (is_root(succ, block)) { mark_root_node(env, succ); set_irn_link(succ, root); @@ -482,16 +495,18 @@ static void trace_update_time(void *data, ir_node *irn) { * @param birg The backend irg object * @return The environment */ -static trace_env_t *trace_init(const arch_env_t *arch_env, ir_graph *irg) { +static trace_env_t *trace_init(const be_irg_t *birg) { trace_env_t *env = xcalloc(1, sizeof(*env)); + ir_graph *irg = be_get_birg_irg(birg); int nn = get_irg_last_idx(irg); - env->arch_env = arch_env; + env->arch_env = be_get_birg_arch_env(birg); env->curr_time = 0; env->sched_info = NEW_ARR_F(trace_irn_t, nn); - env->liveness = be_liveness(irg); + env->liveness = be_liveness(birg); FIRM_DBG_REGISTER(env->dbg, "firm.be.sched.trace"); + be_liveness_assure_chk(env->liveness); memset(env->sched_info, 0, nn * sizeof(*(env->sched_info))); return env; @@ -589,11 +604,11 @@ force_mcands: return irn; } -static void *muchnik_init_graph(const list_sched_selector_t *vtab, const arch_env_t *arch_env, ir_graph *irg) +static void *muchnik_init_graph(const list_sched_selector_t *vtab, const be_irg_t *birg) { - trace_env_t *env = trace_init(arch_env, irg); + trace_env_t *env = trace_init(birg); env->selector = vtab; - env->selector_env = (void*) arch_env; + env->selector_env = (void*) be_get_birg_arch_env(birg); return (void *)env; } @@ -603,7 +618,7 @@ static void *muchnik_init_block(void *graph_env, ir_node *bl) return graph_env; } -static const list_sched_selector_t muchnik_selector_struct = { +const list_sched_selector_t muchnik_selector = { muchnik_init_graph, muchnik_init_block, muchnik_select, @@ -616,8 +631,6 @@ static const list_sched_selector_t muchnik_selector_struct = { trace_free /* finish_graph */ }; -const list_sched_selector_t *muchnik_selector = &muchnik_selector_struct; - /** * Execute the heuristic function. */ @@ -693,7 +706,7 @@ static ir_node *heuristic_select(void *block_env, ir_nodeset_t *ns, ir_nodeset_t return cand; } -static const list_sched_selector_t heuristic_selector_struct = { +const list_sched_selector_t heuristic_selector = { muchnik_init_graph, muchnik_init_block, heuristic_select, @@ -705,5 +718,3 @@ static const list_sched_selector_t heuristic_selector_struct = { NULL, /* finish_block */ trace_free /* finish_graph */ }; - -const list_sched_selector_t *heuristic_selector = &heuristic_selector_struct;