X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=ab1e9390d12bc568f7f17abdb5e8549a77e76f6f;hb=d300330b1e6df8c8914b8fb70cf38ee1c8ca2634;hp=9bb6c885b1fb3eee70e59baf3aae5c5b7fab7a64;hpb=d35ec6e73ee547f499abed4cc723f0b1693c5a8d;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index 9bb6c885b..ab1e9390d 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -1,5 +1,5 @@ /* - * 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. * @@ -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,19 +256,6 @@ 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)) { /* at least 1 of the keep arguments has to be it schedule * predecessor */ @@ -758,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; } @@ -843,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); @@ -879,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;