X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbelive.c;h=505546f20d8a4fe83be1fcd2175cc566691e5c9c;hb=48f0393daa5d5a14ed7e3e32ee2b090759c9371e;hp=ac22510b7288aa3f0b9ca27e965b8ea0ff9526c6;hpb=48f893878b07f6e334389ff52abda5cc2adbf179;p=libfirm diff --git a/ir/be/belive.c b/ir/be/belive.c index ac22510b7..505546f20 100644 --- a/ir/be/belive.c +++ b/ir/be/belive.c @@ -12,6 +12,7 @@ #include "irgwalk.h" #include "irprintf_t.h" #include "irbitset.h" +#include "irdump_t.h" #include "beutil.h" #include "belive_t.h" @@ -23,6 +24,19 @@ #define LV_USE_BINARY_SEARCH #undef LV_INTESIVE_CHECKS +static INLINE int is_liveness_node(const ir_node *irn) +{ + switch(get_irn_opcode(irn)) { + case iro_Block: + case iro_Bad: + case iro_End: + return 0; + default:; + } + + return 1; +} + int (be_lv_next_irn)(const struct _be_lv_t *lv, const ir_node *bl, unsigned flags, int i) { return _be_lv_next_irn(lv, bl, flags, i); @@ -334,7 +348,7 @@ static void liveness_for_node(ir_node *irn, void *data) ir_node *def_block; /* Don't compute liveness information for non-data nodes. */ - if(!is_data_node(irn)) + if(!is_liveness_node(irn)) return; bitset_clear_all(visited); @@ -346,29 +360,29 @@ static void liveness_for_node(ir_node *irn, void *data) ir_node *use_block; /* - * If the usage is no data node, skip this use, since it does not - * affect the liveness of the node. - */ - if(!is_data_node(use)) + * If the usage is no data node, skip this use, since it does not + * affect the liveness of the node. + */ + if(!is_liveness_node(use)) continue; /* Get the block where the usage is in. */ use_block = get_nodes_block(use); /* - * If the use is a phi function, determine the corresponding block - * through which the value reaches the phi function and mark the - * value as live out of that block. - */ + * If the use is a phi function, determine the corresponding block + * through which the value reaches the phi function and mark the + * value as live out of that block. + */ if(is_Phi(use)) { ir_node *pred_block = get_Block_cfgpred_block(use_block, edge->pos); live_end_at_block(lv, irn, pred_block, visited, 0); } /* - * Else, the value is live in at this block. Mark it and call live - * out on the predecessors. - */ + * Else, the value is live in at this block. Mark it and call live + * out on the predecessors. + */ else if(def_block != use_block) { int i, n; @@ -555,7 +569,6 @@ static void lv_check_walker(ir_node *bl, void *data) else if(curr) { unsigned n_curr = curr[0].u.head.n_members; unsigned n_fresh = fr[0].u.head.n_members; - unsigned n = MIN(n_curr, n_fresh); unsigned i; @@ -625,6 +638,8 @@ void be_liveness_dumpto(const be_lv_t *lv, const char *cls_name) */ static void dom_check(ir_node *irn, void *data) { + int *problem_found = data; + if(!is_Block(irn) && irn != get_irg_end(get_irn_irg(irn))) { int i, n; ir_node *bl = get_nodes_block(irn); @@ -637,18 +652,24 @@ static void dom_check(ir_node *irn, void *data) if(is_Phi(irn)) use_bl = get_Block_cfgpred_block(bl, i); - if(!block_dominates(def_bl, use_bl)) { - ir_fprintf(stderr, "%+F in %+F must dominate %+F for user %+F\n", op, def_bl, use_bl, irn); - assert(0); + if(get_irn_opcode(use_bl) != iro_Bad + && get_irn_opcode(def_bl) != iro_Bad + && !block_dominates(def_bl, use_bl)) { + ir_fprintf(stderr, "Verify warning: %+F in %+F must dominate %+F for user %+F (%s)\n", op, def_bl, use_bl, irn, get_irg_dump_name(get_irn_irg(op))); + *problem_found = 1; } } } } /* Check, if the SSA dominance property is fulfilled. */ -void be_check_dominance(ir_graph *irg) +int be_check_dominance(ir_graph *irg) { - irg_walk_graph(irg, dom_check, NULL, NULL); + int problem_found = 0; + + irg_walk_graph(irg, dom_check, NULL, &problem_found); + + return !problem_found; } pset *be_liveness_transfer(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *irn, pset *live)