X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=7dc4e587b2e4aa1c7a0552d8a5eaf1c07344ea6a;hb=48f0393daa5d5a14ed7e3e32ee2b090759c9371e;hp=21e1a1769bfcf8d1088dfd7f4a0000faa239af28;hpb=657d38c542f0a034a737b8fa58637151cfa7b4ad;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index 21e1a1769..7dc4e587b 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -597,39 +597,48 @@ typedef struct _be_verify_register_allocation_env_t { } be_verify_register_allocation_env_t; static void check_register_constraints(ir_node *node, be_verify_register_allocation_env_t *env) { - const arch_env_t *arch_env = env->arch_env; + const arch_env_t *arch_env = env->arch_env; const arch_register_t *reg; - int i, arity; + int i, arity; - if(arch_get_irn_reg_class(arch_env, node, -1) != NULL) { + /* verify output register */ + if (arch_get_irn_reg_class(arch_env, node, -1) != NULL) { reg = arch_get_irn_register(arch_env, node); - if(reg == NULL) { + if (reg == NULL) { ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have a register assigned\n", node, get_nodes_block(node), get_irg_dump_name(env->irg)); env->problem_found = 1; } - if(reg != NULL && !arch_reg_is_allocatable(arch_env, node, -1, reg)) { + else if (! arch_register_type_is(reg, joker) && !arch_reg_is_allocatable(arch_env, node, -1, reg)) { ir_fprintf(stderr, "Verify warning: Register %s assigned as output of %+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; } } + /* verify input register */ arity = get_irn_arity(node); - for(i = 0; i < arity; ++i) { + for (i = 0; i < arity; ++i) { ir_node *pred = get_irn_n(node, i); - if(arch_get_irn_reg_class(arch_env, node, i) == NULL) + if (is_Bad(pred)) { + ir_fprintf(stderr, "Verify warning: %+F in block %+F(%s) has Bad as input %d\n", + node, get_nodes_block(node), get_irg_dump_name(env->irg), i); + env->problem_found = 1; + continue; + } + + if (arch_get_irn_reg_class(arch_env, node, i) == NULL) continue; reg = arch_get_irn_register(arch_env, pred); - if(reg == NULL) { + 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)); env->problem_found = 1; continue; } - if(!arch_reg_is_allocatable(arch_env, node, i, reg)) { + else if (! arch_register_type_is(reg, joker) && ! arch_reg_is_allocatable(arch_env, node, i, reg)) { ir_fprintf(stderr, "Verify warning: Register %s as input %d of %+F not allowed (register constraint) in block %+F(%s)\n", reg->name, i, node, get_nodes_block(node), get_irg_dump_name(env->irg)); env->problem_found = 1;