X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=f59ebb1b54242b16c9d97adf46ed164dbd4062e2;hb=4ed245f5007168dab7850942a7ee6b6b29a19817;hp=089127826e16d6130c5918fbe2705c85c07eb01b;hpb=9f70e2b27566ba7deb85fed0c52e001af228cef3;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index 089127826..f59ebb1b5 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -420,13 +420,15 @@ static void collect_spills_walker(ir_node *node, void *data) { 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); @@ -588,11 +590,12 @@ 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; + 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; @@ -604,13 +607,23 @@ static void check_register_allocation(be_verify_register_allocation_env_t *env, 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) {