/*
- * 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.
*
#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"
/*
* 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.
*/
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
/* 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
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)
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);
}