X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fbe%2Fbeverify.c;h=730325d4b7b953ef297dc1645fe53ab42e45c83c;hb=bd31a5350ce9e110c058b4ad2223d460c9eb5c4e;hp=7939d2da86ba16b48f3d3778a90a426a4025b02f;hpb=f94d292525ff2eb4b35dfcb1977612aa9deca775;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index 7939d2da8..730325d4b 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -83,10 +83,12 @@ static void verify_liveness_walker(ir_node *block, void *data) { int pressure; /* collect register pressure info, start with end of a block */ + // ir_fprintf(stderr, "liveness check %+F\n", block); ir_nodeset_init(&live_nodes); be_liveness_end_of_block(env->lv, env->arch_env, env->cls, block, &live_nodes); + // print_living_values(stderr, &live_nodes); pressure = ir_nodeset_size(&live_nodes); if(pressure > env->registers_available) { ir_fprintf(stderr, "Verify Warning: Register pressure too high at end of block %+F(%s) (%d/%d):\n", @@ -99,6 +101,7 @@ static void verify_liveness_walker(ir_node *block, void *data) { if (is_Phi(irn)) break; + // print_living_values(stderr, &live_nodes); be_liveness_transfer(env->arch_env, env->cls, irn, &live_nodes); pressure = ir_nodeset_size(&live_nodes); @@ -108,6 +111,7 @@ static void verify_liveness_walker(ir_node *block, void *data) { irn, block, get_irg_dump_name(env->irg), pressure, env->registers_available); print_living_values(stderr, &live_nodes); env->problem_found = 1; + assert(0); } } ir_nodeset_destroy(&live_nodes); @@ -121,7 +125,7 @@ int be_verify_register_pressure(const be_irg_t *birg, ir_graph *irg) { be_verify_register_pressure_env_t env; - env.lv = be_liveness(irg); + env.lv = be_liveness(birg); env.irg = irg; env.arch_env = birg->main_env->arch_env; env.cls = cls; @@ -252,48 +256,17 @@ static void verify_schedule_walker(ir_node *block, void *data) { env->problem_found = 1; } -#ifdef SCHEDULE_PROJS - /* check that all projs/keeps are behind their nodes */ - if(is_Proj(node)) { - ir_node *prev = sched_prev(node); - while(is_Proj(prev)) - prev = sched_prev(prev); - if(get_Proj_pred(node) != prev) { - ir_fprintf(stderr, "%+F not scheduled after its pred node in block %+F (%s)\n", - node, block, get_irg_dump_name(env->irg)); - env->problem_found = 1; - } - } -#endif if(be_is_Keep(node)) { - int arity = get_irn_arity(node); - int problem = 0; + /* at least 1 of the keep arguments has to be it schedule + * predecessor */ + int arity = get_irn_arity(node); + int problem = 1; + ir_node *prev = sched_prev(node); for(i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); - ir_node *succ = sched_next(in); - while(succ != node && !sched_is_end(succ)) { - /* the node in between has to be another input of the - * keep or a Proj */ - int i2; - int found = 0; - - if(is_Proj(succ)) { - succ = sched_next(succ); - continue; - } - - for(i2 = 0; i2 < arity; ++i2) { - ir_node *in2 = get_irn_n(node, i2); - if(in2 == succ) { - found = 1; - break; - } - } - if(!found) - problem = 1; - - succ = sched_next(succ); - } + in = skip_Proj(in); + if(in == prev) + problem = 0; } if(problem) { ir_fprintf(stderr, "%+F not scheduled after its pred node in block %+F (%s)\n", @@ -776,8 +749,8 @@ static void check_register_constraints(ir_node *node, reg = arch_get_irn_register(arch_env, pred); if (reg == NULL) { - ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have a register assigned\n", - pred, get_nodes_block(pred), get_irg_dump_name(env->irg)); + ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have a register assigned (%+F input constraint)\n", + pred, get_nodes_block(pred), get_irg_dump_name(env->irg), node); env->problem_found = 1; continue; } @@ -861,16 +834,16 @@ static void verify_block_register_allocation(ir_node *block, void *data) { } } -int be_verify_register_allocation(const arch_env_t *arch_env, ir_graph *irg) { +int be_verify_register_allocation(const be_irg_t *birg) { be_verify_register_allocation_env_t env; - env.arch_env = arch_env; - env.irg = irg; - env.lv = be_liveness(irg); + env.arch_env = be_get_birg_arch_env(birg); + env.irg = be_get_birg_irg(birg); + env.lv = be_liveness(birg); env.problem_found = 0; be_liveness_assure_sets(env.lv); - irg_block_walk_graph(irg, verify_block_register_allocation, NULL, &env); + irg_block_walk_graph(env.irg, verify_block_register_allocation, NULL, &env); be_liveness_free(env.lv); @@ -897,10 +870,14 @@ static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) { return; mark_irn_visited(node); + /* we find too many (uncritical) dead nodes in block out edges */ + if(is_Block(node)) + return; + foreach_out_edge(node, edge) { ir_node* src = get_edge_src_irn(edge); - if(!bitset_is_set(env->reachable, get_irn_idx(src)) && !is_Block(node)) { + if(!bitset_is_set(env->reachable, get_irn_idx(src)) && !is_Block(src)) { ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) only reachable through out edges from %+F\n", src, get_nodes_block(src), get_irg_dump_name(irg), node); env->problem_found = 1;