static int node_idx_cmp(const void *a, const void *b)
{
- int ia = get_irn_idx(a);
- int ib = get_irn_idx(b);
+ const ir_node *p = *(ir_node **) a;
+ const ir_node *q = *(ir_node **) b;
+ int ia = get_irn_idx(p);
+ int ib = get_irn_idx(q);
return ia - ib;
}
void be_liveness_assure_chk(be_lv_t *lv)
{
#ifndef USE_LIVE_CHK
- be_liveness_assure_sets(be_lv_t *lv);
+ be_liveness_assure_sets(lv);
#else
(void) lv;
#endif
memset(lv, 0, sizeof(lv[0]));
lv->irg = irg;
+#ifdef USE_LIVE_CHK
lv->lvc = lv_chk_new(irg);
+#endif
lv->hook_info.context = lv;
lv->hook_info.hook._hook_node_info = lv_dump_block;
return !problem_found;
}
-pset *be_liveness_transfer(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *irn, pset *live)
-{
- int i, n;
-
- /* You should better break out of your loop when hitting the first phi function. */
- assert(!is_Phi(irn) && "liveness_transfer produces invalid results for phi nodes");
-
-#ifndef SCHEDULE_PROJS
- /* kill all Proj's if a node is killed */
- if (get_irn_mode(irn) == mode_T) {
- const ir_edge_t *edge;
-
- foreach_out_edge(irn, edge) {
- ir_node *proj = get_edge_src_irn(edge);
-
- if (arch_irn_consider_in_reg_alloc(arch_env, cls, proj)) {
- ir_node *del = pset_remove_ptr(live, proj);
- (void) del;
- assert(proj == del);
- }
- }
- }
-#endif
-
- if (arch_irn_consider_in_reg_alloc(arch_env, cls, irn)) {
- ir_node *del = pset_remove_ptr(live, irn);
- (void) del;
- assert(irn == del);
- }
-
- for (i = 0, n = get_irn_arity(irn); i < n; ++i) {
- ir_node *op = get_irn_n(irn, i);
-
- if (arch_irn_consider_in_reg_alloc(arch_env, cls, op))
- pset_insert_ptr(live, op);
- }
-
- return live;
-}
-
-void be_liveness_transfer_ir_nodeset(const arch_env_t *arch_env,
- const arch_register_class_t *cls,
- ir_node *node, ir_nodeset_t *nodeset)
+void be_liveness_transfer(const arch_env_t *arch_env,
+ const arch_register_class_t *cls,
+ ir_node *node, ir_nodeset_t *nodeset)
{
int i, arity;
assert(!is_Phi(node) && "liveness_transfer produces invalid results for phi nodes");
#ifndef SCHEDULE_PROJS
- /* kill all Proj's if a node is killed */
if (get_irn_mode(node) == mode_T) {
const ir_edge_t *edge;
-pset *be_liveness_end_of_block(const be_lv_t *lv, const arch_env_t *arch_env, const arch_register_class_t *cls, const ir_node *bl, pset *live)
-{
- int i;
- assert(lv->nodes && "live sets must be computed");
- be_lv_foreach(lv, bl, be_lv_state_end, i) {
- ir_node *irn = be_lv_get_irn(lv, bl, i);
- if(arch_irn_consider_in_reg_alloc(arch_env, cls, irn))
- pset_insert_ptr(live, irn);
- }
-
- return live;
-}
-
-void be_liveness_end_of_block_ir_nodeset(const be_lv_t *lv,
- const arch_env_t *arch_env,
- const arch_register_class_t *cls,
- const ir_node *block,
- ir_nodeset_t *live)
+void be_liveness_end_of_block(const be_lv_t *lv, const arch_env_t *arch_env,
+ const arch_register_class_t *cls,
+ const ir_node *block, ir_nodeset_t *live)
{
int i;
-pset *be_liveness_nodes_live_at(const be_lv_t *lv, const arch_env_t *arch_env, const arch_register_class_t *cls, const ir_node *pos, pset *live)
+void be_liveness_nodes_live_at(const be_lv_t *lv, const arch_env_t *arch_env,
+ const arch_register_class_t *cls,
+ const ir_node *pos, ir_nodeset_t *live)
{
const ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
ir_node *irn;
* exit immediately, so that this node is still live
*/
if(irn == pos)
- return live;
+ return;
be_liveness_transfer(arch_env, cls, irn, live);
}
-
- return live;
}
-pset *be_liveness_nodes_live_at_input(const be_lv_t *lv, const arch_env_t *arch_env, const arch_register_class_t *cls, const ir_node *pos, pset *live)
+void be_liveness_nodes_live_at_input(const be_lv_t *lv,
+ const arch_env_t *arch_env,
+ const arch_register_class_t *cls,
+ const ir_node *pos, ir_nodeset_t *live)
{
const ir_node *bl = is_Block(pos) ? pos : get_nodes_block(pos);
ir_node *irn;
sched_foreach_reverse(bl, irn) {
be_liveness_transfer(arch_env, cls, irn, live);
if(irn == pos)
- return live;
+ return;
}
-
- return live;
}
static void collect_node(ir_node *irn, void *data)