#include "irdump_t.h"
#include "irnodeset.h"
+#include "dfs_t.h"
+#include "absgraph.h"
+
#include "beutil.h"
#include "belive_t.h"
#include "beirg_t.h"
#define LV_USE_BINARY_SEARCH
#undef LV_INTESIVE_CHECKS
+void be_live_chk_compare(be_lv_t *lv, lv_chk_t *lvc);
+
static INLINE int is_liveness_node(const ir_node *irn)
{
switch(get_irn_opcode(irn)) {
case iro_Block:
case iro_Bad:
case iro_End:
+ case iro_Anchor:
return 0;
default:;
}
if(n == 0)
return 0;
-#if 0
- if(idx < payload[0].u.node.idx)
- return 0;
-
- if(idx > payload[n - 1].u.node.idx)
- return n - 1;
-#endif
-
- /* start a binary search for the requested node. */
while(lo < hi) {
int md = lo + ((hi - lo) >> 1);
unsigned md_idx = payload[md].u.node.idx;
ir_node *use = edge->src;
ir_node *use_block;
+ DBG((dbg, LEVEL_4, "%+F: use at %+F, pos %d in %+F\n", irn, use, edge->pos, get_block(use)));
+ assert(get_irn_n(use, edge->pos) == irn);
+
/*
* If the usage is no data node, skip this use, since it does not
* affect the liveness of the node.
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); */
}
}
}
/* Compute the inter block liveness for a graph. */
-be_lv_t *be_liveness(ir_graph *irg)
+be_lv_t *be_liveness(const be_irg_t *birg)
{
be_lv_t *lv = xmalloc(sizeof(lv[0]));
memset(lv, 0, sizeof(lv[0]));
- lv->irg = irg;
+ lv->irg = be_get_birg_irg(birg);
+ lv->birg = birg;
#ifdef USE_LIVE_CHK
- lv->lvc = lv_chk_new(irg);
+ lv->dfs = dfs_new(&absgraph_irg_cfg_succ, lv->irg);
+ lv->lvc = lv_chk_new(lv->irg, lv->dfs);
#endif
lv->hook_info.context = lv;
lv->hook_info.hook._hook_node_info = lv_dump_block;
void be_liveness_check(be_lv_t *lv)
{
struct _lv_walker_t w;
- be_lv_t *fresh = be_liveness(lv->irg);
+ be_lv_t *fresh = be_liveness(lv->birg);
w.lv = lv;
w.data = fresh;
* function. */
assert(!is_Phi(node) && "liveness_transfer produces invalid results for phi nodes");
-#ifndef SCHEDULE_PROJS
if (get_irn_mode(node) == mode_T) {
const ir_edge_t *edge;
}
}
}
-#endif
if (arch_irn_consider_in_reg_alloc(arch_env, cls, node)) {
ir_nodeset_remove(nodeset, node);