X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=11635285c6598aff4d7a335801370efd4aadf44e;hb=6191bc0fe9dc62446b0e0c15e9179b13161dc63d;hp=de4cf4a48a038943d1cfe9d82768cd236b25617b;hpb=bd4175dd9c290a499676ef53aa5c6c2106472c1d;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index de4cf4a48..11635285c 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -41,9 +41,9 @@ #include "beverify.h" #include "belive.h" -#include "besched_t.h" -#include "benode_t.h" -#include "beirg_t.h" +#include "besched.h" +#include "benode.h" +#include "beirg.h" #include "beintlive_t.h" static int my_values_interfere(const ir_node *a, const ir_node *b); @@ -59,7 +59,8 @@ typedef struct be_verify_register_pressure_env_t_ { /** * Print all nodes of a pset into a file. */ -static void print_living_values(FILE *F, const ir_nodeset_t *live_nodes) { +static void print_living_values(FILE *F, const ir_nodeset_t *live_nodes) +{ ir_nodeset_iterator_t iter; ir_node *node; @@ -73,7 +74,8 @@ static void print_living_values(FILE *F, const ir_nodeset_t *live_nodes) { /** * Check if number of live nodes never exceeds the number of available registers. */ -static void verify_liveness_walker(ir_node *block, void *data) { +static void verify_liveness_walker(ir_node *block, void *data) +{ be_verify_register_pressure_env_t *env = (be_verify_register_pressure_env_t *)data; ir_nodeset_t live_nodes; ir_node *irn; @@ -87,7 +89,7 @@ static void verify_liveness_walker(ir_node *block, void *data) { // print_living_values(stderr, &live_nodes); pressure = ir_nodeset_size(&live_nodes); - if(pressure > env->registers_available) { + if (pressure > env->registers_available) { ir_fprintf(stderr, "Verify Warning: Register pressure too high at end of block %+F(%s) (%d/%d):\n", block, get_irg_dump_name(env->irg), pressure, env->registers_available); print_living_values(stderr, &live_nodes); @@ -103,7 +105,7 @@ static void verify_liveness_walker(ir_node *block, void *data) { pressure = ir_nodeset_size(&live_nodes); - if(pressure > env->registers_available) { + if (pressure > env->registers_available) { ir_fprintf(stderr, "Verify Warning: Register pressure too high before node %+F in %+F(%s) (%d/%d):\n", irn, block, get_irg_dump_name(env->irg), pressure, env->registers_available); print_living_values(stderr, &live_nodes); @@ -118,11 +120,11 @@ static void verify_liveness_walker(ir_node *block, void *data) { * Start a walk over the irg and check the register pressure. */ int be_verify_register_pressure(const be_irg_t *birg, - const arch_register_class_t *cls, - ir_graph *irg) { + const arch_register_class_t *cls, ir_graph *irg) +{ be_verify_register_pressure_env_t env; - env.lv = be_liveness(birg); + env.lv = be_liveness(irg); env.irg = irg; env.cls = cls; env.registers_available = env.cls->n_regs - be_put_ignore_regs(birg, env.cls, NULL); @@ -150,7 +152,8 @@ typedef struct be_verify_schedule_env_t_ { /** * Simple schedule checker. */ -static void verify_schedule_walker(ir_node *block, void *data) { +static void verify_schedule_walker(ir_node *block, void *data) +{ be_verify_schedule_env_t *env = (be_verify_schedule_env_t*) data; ir_node *node; ir_node *non_phi_found = NULL; @@ -172,21 +175,21 @@ static void verify_schedule_walker(ir_node *block, void *data) { int timestep; /* this node is scheduled */ - if(bitset_is_set(env->scheduled, get_irn_idx(node))) { + if (bitset_is_set(env->scheduled, get_irn_idx(node))) { ir_fprintf(stderr, "Verify warning: %+F appears to be schedule twice\n"); env->problem_found = 1; } bitset_set(env->scheduled, get_irn_idx(node)); /* Check that scheduled nodes are in the correct block */ - if(get_nodes_block(node) != block) { + if (get_nodes_block(node) != block) { ir_fprintf(stderr, "Verify warning: %+F is in block %+F but scheduled in %+F\n", node, get_nodes_block(node), block); env->problem_found = 1; } /* Check that timesteps are increasing */ timestep = sched_get_time_step(node); - if(timestep <= last_timestep) { + if (timestep <= last_timestep) { ir_fprintf(stderr, "Verify warning: Schedule timestep did not increase at node %+F\n", node); env->problem_found = 1; @@ -215,7 +218,7 @@ static void verify_schedule_walker(ir_node *block, void *data) { cfchange_found = 1; } else if (cfchange_found) { /* proj and keepany aren't real instructions... */ - if(!is_Proj(node) && !be_is_Keep(node)) { + if (!is_Proj(node) && !be_is_Keep(node)) { /* check for delay branches */ if (delay_branches == 0) { ir_fprintf(stderr, "Verify Warning: Node %+F scheduled after control flow changing node (+delay branches) in block %+F (%s)\n", @@ -228,15 +231,15 @@ static void verify_schedule_walker(ir_node *block, void *data) { } /* Check that all uses come before their definitions */ - if(!is_Phi(node)) { + if (!is_Phi(node)) { int nodetime = sched_get_time_step(node); - for(i = 0, arity = get_irn_arity(node); i < arity; ++i) { + for (i = 0, arity = get_irn_arity(node); i < arity; ++i) { ir_node *arg = get_irn_n(node, i); - if(get_nodes_block(arg) != block + if (get_nodes_block(arg) != block || !sched_is_scheduled(arg)) continue; - if(sched_get_time_step(arg) >= nodetime) { + if (sched_get_time_step(arg) >= nodetime) { ir_fprintf(stderr, "Verify Warning: Value %+F used by %+F before it was defined in block %+F (%s)\n", arg, node, block, get_irg_dump_name(env->irg)); env->problem_found = 1; @@ -245,28 +248,28 @@ static void verify_schedule_walker(ir_node *block, void *data) { } /* Check that no dead nodes are scheduled */ - if(get_irn_n_edges(node) == 0) { + if (get_irn_n_edges(node) == 0) { ir_fprintf(stderr, "Verify warning: Node %+F is dead but scheduled in block %+F (%s)\n", node, block, get_irg_dump_name(env->irg)); env->problem_found = 1; } - if(be_is_Keep(node)) { + if (be_is_Keep(node) || be_is_CopyKeep(node)) { /* 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); - while(be_is_Keep(prev)) + while (be_is_Keep(prev) || be_is_CopyKeep(prev)) prev = sched_prev(prev); - for(i = 0; i < arity; ++i) { + for (i = 0; i < arity; ++i) { ir_node *in = get_irn_n(node, i); in = skip_Proj(in); - if(in == prev) + if (in == prev) problem = 0; } - if(problem) { + if (problem) { 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; @@ -284,47 +287,49 @@ static void verify_schedule_walker(ir_node *block, void *data) { static int should_be_scheduled(ir_node *node) { - if(is_Block(node)) - return -1; - - if(is_Proj(node)) - return 0; - - if(get_irn_mode(node) == mode_M) { - if(is_Phi(node) || is_Sync(node) || is_Pin(node)) - return 0; - } - if(be_is_Keep(node) && get_irn_opcode(get_nodes_block(node)) == iro_Bad) - return 0; - - switch(get_irn_opcode(node)) { + switch (get_irn_opcode(node)) { + case iro_Bad: + case iro_Block: case iro_End: case iro_NoMem: - case iro_Bad: + case iro_Pin: + case iro_Proj: + case iro_Sync: case iro_Unknown: return 0; + case iro_Phi: + if (get_irn_mode(node) == mode_M) + return 0; + break; + case iro_Start: + case iro_Jmp: + case beo_Return: + return 1; default: break; } - if (arch_irn_get_flags(node) & arch_irn_flags_ignore) - return -1; + if (get_irn_mode(node) != mode_T) { + if (arch_irn_is_ignore(node)) + return -1; + } return 1; } -static void check_schedule(ir_node *node, void *data) { +static void check_schedule(ir_node *node, void *data) +{ be_verify_schedule_env_t *env = data; int should_be; int scheduled; should_be = should_be_scheduled(node); - if(should_be == -1) + if (should_be == -1) return; scheduled = bitset_is_set(env->scheduled, get_irn_idx(node)) ? 1 : 0; should_be = should_be ? 1 : 0; - if(should_be != scheduled) { + if (should_be != scheduled) { ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should%s be scheduled\n", node, get_nodes_block(node), get_irg_dump_name(env->irg), should_be ? "" : " not"); env->problem_found = 1; @@ -367,7 +372,8 @@ typedef struct { int problem_found; } be_verify_spillslots_env_t; -static int cmp_spill(const void* d1, const void* d2, size_t size) { +static int cmp_spill(const void* d1, const void* d2, size_t size) +{ const spill_t* s1 = d1; const spill_t* s2 = d2; (void) size; @@ -375,21 +381,23 @@ static int cmp_spill(const void* d1, const void* d2, size_t size) { return s1->spill != s2->spill; } -static spill_t *find_spill(be_verify_spillslots_env_t *env, ir_node *node) { +static spill_t *find_spill(be_verify_spillslots_env_t *env, ir_node *node) +{ spill_t spill; spill.spill = node; return set_find(env->spills, &spill, sizeof(spill), HASH_PTR(node)); } -static spill_t *get_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) { +static spill_t *get_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) +{ spill_t spill, *res; int hash = HASH_PTR(node); spill.spill = node; res = set_find(env->spills, &spill, sizeof(spill), hash); - if(res == NULL) { + if (res == NULL) { spill.ent = ent; res = set_insert(env->spills, &spill, sizeof(spill), hash); } @@ -397,14 +405,15 @@ static spill_t *get_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_ent return res; } -static ir_node *get_memory_edge(const ir_node *node) { +static ir_node *get_memory_edge(const ir_node *node) +{ int i, arity; ir_node *result = NULL; arity = get_irn_arity(node); - for(i = arity - 1; i >= 0; --i) { + for (i = arity - 1; i >= 0; --i) { ir_node *arg = get_irn_n(node, i); - if(get_irn_mode(arg) == mode_M) { + if (get_irn_mode(arg) == mode_M) { assert(result == NULL); result = arg; } @@ -413,31 +422,31 @@ static ir_node *get_memory_edge(const ir_node *node) { return result; } -static -void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent); +static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent); -static -void be_check_entity(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) { - if(ent == NULL) { +static void be_check_entity(be_verify_spillslots_env_t *env, ir_node *node, ir_entity *ent) +{ + if (ent == NULL) { ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) should have an entity assigned\n", node, get_nodes_block(node), get_irg_dump_name(env->irg)); } } -static -void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) { +static void collect_spill(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) +{ ir_entity *spillent = arch_get_frame_entity(node); be_check_entity(env, node, spillent); get_spill(env, node, ent); - if(spillent != ent) { + if (spillent != ent) { ir_fprintf(stderr, "Verify warning: Spill %+F has different entity than reload %+F in block %+F(%s)\n", node, reload, get_nodes_block(node), get_irg_dump_name(env->irg)); env->problem_found = 1; } } -static void collect_memperm(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) { +static void collect_memperm(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) +{ int i, arity; spill_t spill, *res; int hash = HASH_PTR(node); @@ -452,7 +461,7 @@ static void collect_memperm(be_verify_spillslots_env_t *env, ir_node *node, ir_n spillent = be_get_MemPerm_out_entity(memperm, out); be_check_entity(env, memperm, spillent); - if(spillent != ent) { + if (spillent != ent) { ir_fprintf(stderr, "Verify warning: MemPerm %+F has different entity than reload %+F in block %+F(%s)\n", node, reload, get_nodes_block(node), get_irg_dump_name(env->irg)); env->problem_found = 1; @@ -460,14 +469,14 @@ static void collect_memperm(be_verify_spillslots_env_t *env, ir_node *node, ir_n spill.spill = node; res = set_find(env->spills, &spill, sizeof(spill), hash); - if(res != NULL) { + if (res != NULL) { return; } spill.ent = spillent; res = set_insert(env->spills, &spill, sizeof(spill), hash); - for(i = 0, arity = be_get_MemPerm_entity_arity(memperm); i < arity; ++i) { + for (i = 0, arity = be_get_MemPerm_entity_arity(memperm); i < arity; ++i) { ir_node* arg = get_irn_n(memperm, i + 1); ir_entity* argent = be_get_MemPerm_in_entity(memperm, i); @@ -475,7 +484,8 @@ static void collect_memperm(be_verify_spillslots_env_t *env, ir_node *node, ir_n } } -static void collect_memphi(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity *ent) { +static void collect_memphi(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity *ent) +{ int i, arity; spill_t spill, *res; int hash = HASH_PTR(node); @@ -484,7 +494,7 @@ static void collect_memphi(be_verify_spillslots_env_t *env, ir_node *node, ir_no spill.spill = node; res = set_find(env->spills, &spill, sizeof(spill), hash); - if(res != NULL) { + if (res != NULL) { return; } @@ -492,18 +502,19 @@ static void collect_memphi(be_verify_spillslots_env_t *env, ir_node *node, ir_no res = set_insert(env->spills, &spill, sizeof(spill), hash); /* is 1 of the arguments a spill? */ - for(i = 0, arity = get_irn_arity(node); i < arity; ++i) { + for (i = 0, arity = get_irn_arity(node); i < arity; ++i) { ir_node* arg = get_irn_n(node, i); collect(env, arg, reload, ent); } } -static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) { - if(be_is_Spill(node)) { +static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *reload, ir_entity* ent) +{ + if (be_is_Spill(node)) { collect_spill(env, node, reload, ent); - } else if(is_Proj(node)) { + } else if (is_Proj(node)) { collect_memperm(env, node, reload, ent); - } else if(is_Phi(node) && get_irn_mode(node) == mode_M) { + } else if (is_Phi(node) && get_irn_mode(node) == mode_M) { collect_memphi(env, node, reload, ent); } else { /* Disabled for now, spills might get transformed by the backend */ @@ -519,18 +530,19 @@ static void collect(be_verify_spillslots_env_t *env, ir_node *node, ir_node *rel * This walker function searches for reloads and collects all the spills * and memphis attached to them. */ -static void collect_spills_walker(ir_node *node, void *data) { +static void collect_spills_walker(ir_node *node, void *data) +{ be_verify_spillslots_env_t *env = data; /* @@@ ia32_classify returns classification of Proj_pred :-/ */ - if(is_Proj(node)) + if (is_Proj(node)) return; if (arch_irn_class_is(node, reload)) { ir_node *spill = get_memory_edge(node); ir_entity *ent; - if(spill == NULL) { + 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; @@ -544,27 +556,28 @@ static void collect_spills_walker(ir_node *node, void *data) { } } -static void check_spillslot_interference(be_verify_spillslots_env_t *env) { - int spillcount = set_count(env->spills); - spill_t **spills = alloca(spillcount * sizeof(spills[0])); - spill_t *spill; - int i; +static void check_spillslot_interference(be_verify_spillslots_env_t *env) +{ + int spillcount = set_count(env->spills); + spill_t **spills = ALLOCAN(spill_t*, spillcount); + spill_t *spill; + int i; - for(spill = set_first(env->spills), i = 0; spill != NULL; spill = set_next(env->spills), ++i) { + for (spill = set_first(env->spills), i = 0; spill != NULL; spill = set_next(env->spills), ++i) { spills[i] = spill; } - for(i = 0; i < spillcount; ++i) { + for (i = 0; i < spillcount; ++i) { spill_t *sp1 = spills[i]; int i2; - for(i2 = i+1; i2 < spillcount; ++i2) { + for (i2 = i+1; i2 < spillcount; ++i2) { spill_t *sp2 = spills[i2]; - if(sp1->ent != sp2->ent) + if (sp1->ent != sp2->ent) continue; - if(my_values_interfere(sp1->spill, sp2->spill)) { + if (my_values_interfere(sp1->spill, sp2->spill)) { ir_fprintf(stderr, "Verify warning: Spillslots for %+F in block %+F(%s) and %+F in block %+F(%s) interfere\n", sp1->spill, get_nodes_block(sp1->spill), get_irg_dump_name(env->irg), sp2->spill, get_nodes_block(sp2->spill), get_irg_dump_name(env->irg)); @@ -575,17 +588,18 @@ static void check_spillslot_interference(be_verify_spillslots_env_t *env) { } } -static void check_lonely_spills(ir_node *node, void *data) { +static void check_lonely_spills(ir_node *node, void *data) +{ be_verify_spillslots_env_t *env = data; - if(be_is_Spill(node) || (is_Proj(node) && be_is_MemPerm(get_Proj_pred(node)))) { + if (be_is_Spill(node) || (is_Proj(node) && be_is_MemPerm(get_Proj_pred(node)))) { spill_t *spill = find_spill(env, node); - if(be_is_Spill(node)) { + if (be_is_Spill(node)) { ir_entity *ent = arch_get_frame_entity(node); be_check_entity(env, node, ent); } - if(spill == NULL) { + if (spill == NULL) { ir_fprintf(stderr, "Verify warning: Node %+F in block %+F(%s) not connected to a reaload\n", node, get_nodes_block(node), get_irg_dump_name(env->irg)); } @@ -624,21 +638,22 @@ int be_verify_spillslots(ir_graph *irg) * @param b The second value. * @return 1, if a and b interfere, 0 if not. */ -static int my_values_interfere(const ir_node *a, const ir_node *b) { +static int my_values_interfere(const ir_node *a, const ir_node *b) +{ const ir_edge_t *edge; ir_node *bb; int a2b = value_dominates(a, b); int b2a = value_dominates(b, a); /* If there is no dominance relation, they do not interfere. */ - if(!a2b && !b2a) + if (!a2b && !b2a) return 0; /* * Adjust a and b so, that a dominates b if * a dominates b or vice versa. */ - if(b2a) { + if (b2a) { const ir_node *t = a; a = b; b = t; @@ -659,21 +674,21 @@ static int my_values_interfere(const ir_node *a, const ir_node *b) { */ foreach_out_edge(a, edge) { const ir_node *user = get_edge_src_irn(edge); - if(b == user) + if (b == user) continue; - if(get_irn_opcode(user) == iro_End) + if (get_irn_opcode(user) == iro_End) continue; /* in case of phi arguments we compare with the block the value comes from */ - if(is_Phi(user)) { + if (is_Phi(user)) { ir_node *phiblock = get_nodes_block(user); - if(phiblock == bb) + if (phiblock == bb) continue; user = get_irn_n(phiblock, get_edge_src_pos(edge)); } - if(value_dominates(b, user)) + if (value_dominates(b, user)) return 1; } @@ -691,14 +706,11 @@ static int problem_found; static const arch_register_class_t *regclass; static ir_node **registers; -static void check_register_constraints(ir_node *node) +static void check_output_constraints(ir_node *node) { - const arch_register_t *reg; - int i, arity; - /* verify output register */ - if (arch_get_irn_reg_class_out(node) != NULL) { - reg = arch_get_irn_register(node); + if (arch_get_irn_reg_class_out(node) == regclass) { + const arch_register_t *reg = arch_get_irn_register(node); 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(irg)); @@ -709,6 +721,12 @@ static void check_register_constraints(ir_node *node) problem_found = 1; } } +} + +static void check_input_constraints(ir_node *node) +{ + const arch_register_t *reg; + int i, arity; /* verify input register */ arity = get_irn_arity(node); @@ -754,15 +772,19 @@ static void check_register_constraints(ir_node *node) const arch_register_t *pred_reg = arch_get_irn_register(pred); if (reg != pred_reg && !arch_register_type_is(pred_reg, joker)) { + const char *pred_name = pred_reg != NULL ? pred_reg->name : "(null)"; + const char *reg_name = reg != NULL ? reg->name : "(null)"; ir_fprintf(stderr, "Verify warning: Input %d of %+F in block %+F(%s) uses register %s instead of %s\n", - i, node, get_nodes_block(node), get_irg_dump_name(irg), pred_reg->name, reg->name); + i, node, get_nodes_block(node), + get_irg_dump_name(irg), pred_name, reg_name); problem_found = 1; } } } } -static void value_used(ir_node *node) { +static void value_used(ir_node *block, ir_node *node) +{ const arch_register_t *reg; ir_node *reg_node; @@ -770,13 +792,13 @@ static void value_used(ir_node *node) { return; reg = arch_get_irn_register(node); - if (reg->type & arch_register_type_virtual) + if (reg == NULL || reg->type & arch_register_type_virtual) return; reg_node = registers[reg->index]; if (reg_node != NULL && reg_node != node) { ir_fprintf(stderr, "Verify warning: Register %s assigned more than once in block %+F(%s) (nodes %+F %+F)\n", - reg->name, get_nodes_block(node), get_irg_dump_name(irg), + reg->name, block, get_irg_dump_name(irg), node, reg_node); problem_found = 1; } @@ -793,7 +815,7 @@ static void value_def(ir_node *node) return; reg = arch_get_irn_register(node); - if (reg->type & arch_register_type_virtual) + if (reg == NULL || reg->type & arch_register_type_virtual) return; reg_node = registers[reg->index]; @@ -806,26 +828,26 @@ static void value_def(ir_node *node) registers[reg->index] = NULL; } -static void verify_block_register_allocation(ir_node *block, void *data) { +static void verify_block_register_allocation(ir_node *block, void *data) +{ int i, nregclasses; (void) data; nregclasses = arch_env_get_n_reg_class(arch_env); for (i = 0; i < nregclasses; ++i) { - ir_node *node; - int idx, i2, n_regs; + ir_node *node; + int idx, i2, n_regs; regclass = arch_env_get_reg_class(arch_env, i); assert(lv->nodes && "live sets must be computed"); n_regs = arch_register_class_n_regs(regclass); - registers = alloca(n_regs * sizeof(registers[0])); - memset(registers, 0, n_regs * sizeof(registers[0])); + registers = ALLOCANZ(ir_node*, n_regs); be_lv_foreach(lv, block, be_lv_state_end, idx) { ir_node *node = be_lv_get_irn(lv, block, idx); - value_used(node); + value_used(block, node); } sched_foreach_reverse(block, node) { @@ -836,19 +858,22 @@ static void verify_block_register_allocation(ir_node *block, void *data) { foreach_out_edge(node, edge) { ir_node *def = get_edge_src_irn(edge); value_def(def); + check_output_constraints(def); } } else { value_def(node); + check_output_constraints(node); } - check_register_constraints(node); - if (is_Phi(node)) - continue; + check_input_constraints(node); - arity = get_irn_arity(node); - for (i2 = 0; i2 < arity; ++i2) { - ir_node *use = get_irn_n(node, i2); - value_used(use); + /* process uses. (Phi inputs are no real uses) */ + if (!is_Phi(node)) { + arity = get_irn_arity(node); + for (i2 = 0; i2 < arity; ++i2) { + ir_node *use = get_irn_n(node, i2); + value_used(block, use); + } } } @@ -869,10 +894,11 @@ static void verify_block_register_allocation(ir_node *block, void *data) { } } -int be_verify_register_allocation(const be_irg_t *birg) { +int be_verify_register_allocation(const be_irg_t *birg) +{ arch_env = be_get_birg_arch_env(birg); irg = be_get_birg_irg(birg); - lv = be_liveness(birg); + lv = be_liveness(irg); problem_found = 0; be_liveness_assure_sets(lv); @@ -895,7 +921,8 @@ typedef struct _verify_out_dead_nodes_env { int problem_found; } verify_out_dead_nodes_env; -static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) { +static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) +{ ir_graph *irg = env->irg; const ir_edge_t* edge; @@ -903,13 +930,13 @@ static void check_out_edges(ir_node *node, verify_out_dead_nodes_env *env) { return; /* we find too many (uncritical) dead nodes in block out edges */ - if(is_Block(node)) + 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(src)) { + 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; @@ -926,9 +953,11 @@ static void set_reachable(ir_node *node, void* data) bitset_set(reachable, get_irn_idx(node)); } -int be_verify_out_edges(ir_graph *irg) { +int be_verify_out_edges(ir_graph *irg) +{ verify_out_dead_nodes_env env; +return 1; env.irg = irg; env.reachable = bitset_alloca(get_irg_last_idx(irg)); env.problem_found = edges_verify(irg);