X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbeverify.c;h=24fa71beb1378226883e710b52a33de24146f3e0;hb=d920844bd5cd3296b03bb281ce43782967e0ce65;hp=853f54a7a2a13f805c8ea28c609817c662120066;hpb=e9137de01e1ed5e7a8baee8d23a59e82ad634af5;p=libfirm diff --git a/ir/be/beverify.c b/ir/be/beverify.c index 853f54a7a..24fa71beb 100644 --- a/ir/be/beverify.c +++ b/ir/be/beverify.c @@ -11,13 +11,14 @@ #include "beverify.h" #include "belive.h" -#include "besched.h" +#include "besched_t.h" #include "irnode.h" #include "irgraph.h" #include "irgwalk.h" #include "irprintf.h" #include "irdump_t.h" +#include "benode_t.h" typedef struct be_verify_register_pressure_env_t_ { ir_graph *irg; /**< the irg to verify */ @@ -114,7 +115,7 @@ static void verify_schedule_walker(ir_node *block, void *data) ir_node *node; int non_phi_found = 0; int cfchange_found = 0; - // TODO ask ABI about delay branches + // TODO ask arch about delay branches int delay_branches = 0; pset *uses = pset_new_ptr_default(); @@ -134,9 +135,9 @@ static void verify_schedule_walker(ir_node *block, void *data) node, block, get_irg_dump_name(env->irg)); env->problem_found = 1; } - continue; + } else { + non_phi_found = 1; } - non_phi_found = 1; // 2. Check for control flow changing nodes if (is_cfop(node) && get_irn_opcode(node) != iro_Start) { @@ -148,13 +149,16 @@ static void verify_schedule_walker(ir_node *block, void *data) } cfchange_found = 1; } else if (cfchange_found) { - /* 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", - node, block, get_irg_dump_name(env->irg)); - env->problem_found = 1; - } else { - delay_branches--; + // proj and keepany aren't real instructions... + 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", + node, block, get_irg_dump_name(env->irg)); + env->problem_found = 1; + } else { + delay_branches--; + } } } @@ -164,13 +168,15 @@ static void verify_schedule_walker(ir_node *block, void *data) node, block, get_irg_dump_name(env->irg)); env->problem_found = 1; } - for(i = 0, arity = get_irn_arity(node); i < arity; ++i) { - pset_insert_ptr(uses, get_irn_n(node, i)); + if(!is_Phi(node)) { + for(i = 0, arity = get_irn_arity(node); i < arity; ++i) { + pset_insert_ptr(uses, get_irn_n(node, i)); + } } } del_pset(uses); - /* check that all delay branches are used (at least with NOPs) */ + /* check that all delay branches are filled (at least with NOPs) */ if (cfchange_found && delay_branches != 0) { ir_fprintf(stderr, "Not all delay slots filled after jump (%d/%d) in block %+F (%s)\n", block, get_irg_dump_name(env->irg));