/**
* Start a walk over the irg and check the register pressure.
*/
-int be_verify_register_pressure(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_graph *irg) {
+int be_verify_register_pressure(const be_irg_t *birg, const arch_register_class_t *cls, ir_graph *irg) {
be_verify_register_pressure_env_t env;
env.lv = be_liveness(irg);
env.irg = irg;
- env.arch_env = arch_env;
+ env.arch_env = birg->main_env->arch_env;
env.cls = cls;
- env.registers_available = arch_count_non_ignore_regs(arch_env, cls);
+ env.registers_available = env.cls->n_regs - be_put_ignore_regs(birg, env.cls, NULL);
env.problem_found = 0;
irg_block_walk_graph(irg, verify_liveness_walker, NULL, &env);
int cfchange_found = 0;
// TODO ask arch about delay branches
int delay_branches = 0;
- pset *uses = pset_new_ptr_default();
/*
* Tests for the following things:
}
// 3. Check for uses
- if(pset_find_ptr(uses, node)) {
- ir_fprintf(stderr, "Verify Warning: Value %+F used before it was defined in block %+F (%s)\n",
- node, block, get_irg_dump_name(env->irg));
- env->problem_found = 1;
- }
if(!is_Phi(node)) {
+ int nodetime = sched_get_time_step(node);
for(i = 0, arity = get_irn_arity(node); i < arity; ++i) {
- pset_insert_ptr(uses, get_irn_n(node, i));
+ ir_node *arg = get_irn_n(node, i);
+ if(get_nodes_block(arg) != block
+ || !sched_is_scheduled(arg))
+ continue;
+
+ if(sched_get_time_step(arg) >= nodetime) {
+ ir_fprintf(stderr, "Verify Warning: Value %+F used by %+F before it was defined in block %+F (%s)\n",
+ arg, node, block, get_irg_dump_name(env->irg));
+ env->problem_found = 1;
+ }
}
}
+
+ // 4. check for dead nodes
+ if(get_irn_n_edges(node) == 0) {
+ ir_fprintf(stderr, "Verify warning: Node %+F is dead but scheduled in block %+F (%s)\n",
+ node, block, get_irg_dump_name(env->irg));
+ env->problem_found = 1;
+ }
}
- del_pset(uses);
/* check that all delay branches are filled (at least with NOPs) */
if (cfchange_found && delay_branches != 0) {
if(arch_irn_class_is(arch_env, node, reload)) {
ir_node *spill = get_memory_edge(node);
+ entity *ent;
+
if(spill == NULL) {
ir_fprintf(stderr, "Verify warning: No spill attached to reload %+F in block %+F(%s)\n",
node, get_nodes_block(node), get_irg_dump_name(env->irg));
env->problem_found = 1;
return;
}
- entity* ent = arch_get_frame_entity(env->arch_env, node);
+ ent = arch_get_frame_entity(env->arch_env, node);
check_entity(env, node, ent);
collect(env, spill, node, ent);
const arch_register_class_t *regclass, pset *nodes) {
const arch_env_t *arch_env = env->arch_env;
ir_node *node;
+ const arch_register_t *reg;
+ int fail = 0;
bitset_t *registers = bitset_alloca(arch_register_class_n_regs(regclass));
foreach_pset(nodes, node) {
- const arch_register_t *reg;
if(arch_get_irn_reg_class(arch_env, node, -1) != regclass)
continue;
continue;
}
if(bitset_is_set(registers, reg->index)) {
- ir_fprintf(stderr, "Verify warning: Register %s assigned more than once at node %+F in block %+F(%s)\n",
- reg->name, node, get_nodes_block(node), get_irg_dump_name(env->irg));
- env->problem_found = 1;
- continue;
+ pset_break(nodes);
+ fail = 1;
+ break;
}
bitset_set(registers, reg->index);
}
+ if (fail) {
+ ir_fprintf(stderr, "Verify warning: Register %s assigned more than once in block %+F(%s)\n",
+ reg->name, get_nodes_block(node), get_irg_dump_name(env->irg));
+ env->problem_found = 1;
+
+ foreach_pset(nodes, node) {
+ if (arch_get_irn_register(arch_env, node) == reg) {
+ ir_fprintf(stderr, " at node %+F\n", node);
+ }
+ }
+ }
}
static void verify_block_register_allocation(ir_node *block, void *data) {