X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeblocksched.c;h=b9333e5aa4403aa210da3f78b87bd4a86fd9c141;hb=aa8272cd675f9a96d37e418c682d097108fc1e3a;hp=97184dfe3b2beb79acadc3939b136799436682ab;hpb=f8cc15664f571aa7ef89d6f6bc8d5bd2b8ca7d53;p=libfirm diff --git a/ir/be/beblocksched.c b/ir/be/beblocksched.c index 97184dfe3..b9333e5aa 100644 --- a/ir/be/beblocksched.c +++ b/ir/be/beblocksched.c @@ -200,20 +200,53 @@ static void collect_egde_frequency(ir_node *block, void *data) } } +static int cmp_edges_base(const edge_t *e1, const edge_t *e2) +{ + long nr1 = get_irn_node_nr(e1->block); + long nr2 = get_irn_node_nr(e2->block); + if (nr1 < nr2) { + return 1; + } else if (nr1 > nr2) { + return -1; + } else { + if (e1->pos < e2->pos) { + return 1; + } else if (e1->pos > e2->pos) { + return -1; + } else { + return 0; + } + } +} + static int cmp_edges(const void *d1, const void *d2) { const edge_t *e1 = (const edge_t*)d1; const edge_t *e2 = (const edge_t*)d2; - - return QSORT_CMP(e2->execfreq, e1->execfreq); + double freq1 = e1->execfreq; + double freq2 = e2->execfreq; + if (freq1 < freq2) { + return 1; + } else if (freq1 > freq2) { + return -1; + } else { + return cmp_edges_base(e1, e2); + } } static int cmp_edges_outedge_penalty(const void *d1, const void *d2) { - const edge_t *e1 = (const edge_t*)d1; - const edge_t *e2 = (const edge_t*)d2; - /* reverse sorting as penalties are negative */ - return QSORT_CMP(e1->outedge_penalty_freq, e2->outedge_penalty_freq); + const edge_t *e1 = (const edge_t*)d1; + const edge_t *e2 = (const edge_t*)d2; + double pen1 = e1->outedge_penalty_freq; + double pen2 = e2->outedge_penalty_freq; + if (pen1 > pen2) { + return 1; + } else if (pen1 < pen2) { + return -1; + } else { + return cmp_edges_base(e1, e2); + } } static void clear_loop_links(ir_loop *loop) @@ -616,7 +649,6 @@ static void collect_egde_frequency_ilp(ir_node *block, void *data) static void coalesce_blocks_ilp(blocksched_ilp_env_t *env) { int edge_count = ARR_LEN(env->ilpedges); - be_options_t *options = be_get_irg_options(env->env.irg); int i; /* complete out constraints */ @@ -638,7 +670,7 @@ static void coalesce_blocks_ilp(blocksched_ilp_env_t *env) lpp_set_factor_fast(env->lpp, entry->out_cst, edge->ilpvar, 1.0); } - lpp_solve_net(env->lpp, options->ilp_server, options->ilp_solver); + lpp_solve_net(env->lpp, be_options.ilp_server, be_options.ilp_solver); assert(lpp_is_sol_valid(env->lpp)); /* Apply results to edges */