X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=a2195b164e5385c09fcc4cc5ee648ab6ee97bf7f;hb=e7e5dbe35dbb245c5c833192e05c22de3618a5a5;hp=d418c9ba75f2583b4c79bdbddc4d3fd0404752cb;hpb=88036a81928ac4e2246c29dcf41eeddf508e8429;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index d418c9ba7..a2195b164 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -600,7 +600,7 @@ static void check_register_allocation(be_verify_register_allocation_env_t *env, 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; + const arch_register_t *reg = NULL; int fail = 0; bitset_t *registers = bitset_alloca(arch_register_class_n_regs(regclass)); @@ -616,6 +616,11 @@ static void check_register_allocation(be_verify_register_allocation_env_t *env, env->problem_found = 1; continue; } + if(!arch_reg_is_allocatable(arch_env, node, -1, reg)) { + ir_fprintf(stderr, "Verify warning: Register %s assigned to %+F not allowed (register constraint) in block %+F(%s)\n", + reg->name, node, get_nodes_block(node), get_irg_dump_name(env->irg)); + env->problem_found = 1; + } if(bitset_is_set(registers, reg->index)) { pset_break(nodes); fail = 1; @@ -677,3 +682,55 @@ int be_verify_register_allocation(const arch_env_t *arch_env, ir_graph *irg) { return !env.problem_found; } + + + +//--------------------------------------------------------------------------- + + + +typedef struct _verify_out_dead_nodes_env { + ir_graph *irg; + bitset_t *reachable; + bitset_t *visited; + int problem_found; +} verify_out_dead_nodes_env; + +static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) { + const ir_edge_t* edge; + + foreach_out_edge(node, edge) { + ir_node* src = get_edge_src_irn(edge); + + if(!bitset_is_set(env->reachable, get_irn_idx(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(env->irg), node); + env->problem_found = 1; + } + + if(!bitset_is_set(env->visited, get_irn_idx(src))) { + bitset_set(env->visited, get_irn_idx(src)); + if(!is_Block(src)) + check_out_edges(src, env); + } + } +} + +static void set_reachable(ir_node *node, void* data) +{ + bitset_t* reachable = data; + bitset_set(reachable, get_irn_idx(node)); +} + +int be_verify_out_edges(ir_graph *irg) { + verify_out_dead_nodes_env env; + env.irg = irg; + env.reachable = bitset_alloca(get_irg_last_idx(irg)); + env.visited = bitset_alloca(get_irg_last_idx(irg)); + env.problem_found = 0; + + irg_walk_graph(irg, set_reachable, NULL, env.reachable); + check_out_edges(get_irg_start(irg), &env); + + return !env.problem_found; +}