X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelive.c;h=200b118f16ba1c583af00e14526988e7f5b1f651;hb=2e291eab8268af551488b1f4fb4d9ca61b625e33;hp=43174d72ff03cc629594c318200d2ea034cf0ecf;hpb=0e5f781d021c0b1e20ba08f583d4971419fedb5d;p=libfirm diff --git a/ir/be/belive.c b/ir/be/belive.c index 43174d72f..200b118f1 100644 --- a/ir/be/belive.c +++ b/ir/be/belive.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. * @@ -28,6 +28,9 @@ #include "config.h" #endif +/* statev is expensive here, only enable when needed */ +#define DISABLE_STATEV + #include "impl.h" #include "iredges_t.h" #include "irgwalk.h" @@ -525,7 +528,7 @@ static void compute_liveness(be_lv_t *lv) /* * inserting the variables sorted by their ID is probably * more efficient since the binary sorted set insertion - * will not need to move arounf the data. + * will not need to move around the data. * However, if sorting the variables a priori pays off * needs to be checked, hence the define. */ @@ -547,17 +550,23 @@ static void compute_liveness(be_lv_t *lv) void be_liveness_assure_sets(be_lv_t *lv) { if (!lv->nodes) { + BE_TIMER_PUSH(t_live); + lv->nodes = bitset_malloc(2 * get_irg_last_idx(lv->irg)); phase_init(&lv->ph, "liveness", lv->irg, PHASE_DEFAULT_GROWTH, lv_phase_data_init, NULL); compute_liveness(lv); /* be_live_chk_compare(lv, lv->lvc); */ + + BE_TIMER_POP(t_live); } } void be_liveness_assure_chk(be_lv_t *lv) { #ifndef USE_LIVE_CHK + BE_TIMER_PUSH(t_verify); be_liveness_assure_sets(lv); + BE_TIMER_POP(t_verify); #else (void) lv; #endif @@ -576,9 +585,8 @@ void be_liveness_invalidate(be_lv_t *lv) /* Compute the inter block liveness for a graph. */ be_lv_t *be_liveness(const be_irg_t *birg) { - be_lv_t *lv = xmalloc(sizeof(lv[0])); + be_lv_t *lv = XMALLOCZ(be_lv_t); - memset(lv, 0, sizeof(lv[0])); lv->irg = be_get_birg_irg(birg); lv->birg = birg; #ifdef USE_LIVE_CHK @@ -593,25 +601,32 @@ be_lv_t *be_liveness(const be_irg_t *birg) void be_liveness_recompute(be_lv_t *lv) { - unsigned last_idx = get_irg_last_idx(lv->irg); + unsigned last_idx; + + BE_TIMER_PUSH(t_live); + last_idx = get_irg_last_idx(lv->irg); if(last_idx >= bitset_size(lv->nodes)) { bitset_free(lv->nodes); lv->nodes = bitset_malloc(last_idx * 2); - } - - else + } else bitset_clear_all(lv->nodes); phase_free(&lv->ph); phase_init(&lv->ph, "liveness", lv->irg, PHASE_DEFAULT_GROWTH, lv_phase_data_init, NULL); compute_liveness(lv); + + BE_TIMER_POP(t_live); } void be_liveness_free(be_lv_t *lv) { be_liveness_invalidate(lv); - free(lv); +#ifdef USE_LIVE_CHK + lv_chk_free(lv->lvc); + dfs_free(lv->dfs); +#endif + xfree(lv); } void be_liveness_remove(be_lv_t *lv, const ir_node *irn) @@ -795,9 +810,7 @@ void be_liveness_transfer(const arch_env_t *arch_env, ir_nodeset_remove(nodeset, proj); } } - } - - if (arch_irn_consider_in_reg_alloc(arch_env, cls, node)) { + } else if (arch_irn_consider_in_reg_alloc(arch_env, cls, node)) { ir_nodeset_remove(nodeset, node); }