X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firvrfy.c;h=360530d1d1f2ecf5003e6f25f5dcf071ae50dfc0;hb=4b394b858d56160b0b79e4ae0d51421221d70691;hp=818f55c7dd15f8e1efee80b6cdab3571e1c19c39;hpb=8fd12b1714e2024889e81aa4b351d1b6640e1c79;p=libfirm diff --git a/ir/ir/irvrfy.c b/ir/ir/irvrfy.c index 818f55c7d..360530d1d 100644 --- a/ir/ir/irvrfy.c +++ b/ir/ir/irvrfy.c @@ -49,6 +49,8 @@ void vrfy_enable_entity_tests(int enable) { vrfy_entities = enable; } +#ifndef NDEBUG + /** * little helper for NULL modes */ @@ -273,6 +275,8 @@ static void show_phi_inputs(ir_node *phi, ir_node *block) { get_irn_node_nr(block), get_irn_arity(block)); } +#endif /* #ifndef NDEBUG */ + /** If the address is Sel or SymConst, return the entity. */ static ir_entity *get_ptr_entity(ir_node *ptr) { if (get_irn_op(ptr) == op_Sel) { @@ -846,6 +850,14 @@ verify_node_Proj(ir_node *p, ir_graph *irg) { */ static int verify_node_Block(ir_node *n, ir_graph *irg) { int i; + ir_node *mb = get_Block_MacroBlock(n); + + ASSERT_AND_RET(is_Block(mb) || is_Bad(mb), "Block node with wrong MacroBlock", 0); + + if (is_Block(mb) && mb != n) { + /* Blocks with more than one predecessor must be header blocks */ + ASSERT_AND_RET(get_Block_n_cfgpreds(n) == 1, "partBlock with more than one predecessor", 0); + } for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) { ir_node *pred = get_Block_cfgpred(n, i); @@ -858,17 +870,17 @@ static int verify_node_Block(ir_node *n, ir_graph *irg) { "Block node", 0); } - /* End block may only have Return, Raise or fragile ops as preds. */ if (n == get_irg_end_block(irg) && get_irg_phase_state(irg) != phase_backend) + /* End block may only have Return, Raise or fragile ops as preds. */ for (i = get_Block_n_cfgpreds(n) - 1; i >= 0; --i) { ir_node *pred = skip_Proj(get_Block_cfgpred(n, i)); - if (is_Proj(pred) || get_irn_op(pred) == op_Tuple) + if (is_Proj(pred) || is_Tuple(pred)) break; /* We can not test properly. How many tuples are there? */ ASSERT_AND_RET( ( - is_Return(pred) || - is_Bad(pred) || - (get_irn_op(pred) == op_Raise) || + is_Return(pred) || + is_Bad(pred) || + is_Raise(pred) || is_fragile_op(pred) ), "End Block node", 0); @@ -1565,7 +1577,7 @@ static int verify_node_Phi(ir_node *n, ir_graph *irg) { int i; (void) irg; - if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building) { + if (! is_Bad(block) && get_irg_phase_state(get_irn_irg(n)) != phase_building && get_irn_arity(n) > 0) { /* a Phi node MUST have the same number of inputs as its block */ ASSERT_AND_RET_DBG( get_irn_arity(n) == get_irn_arity(block), @@ -1860,8 +1872,18 @@ static int verify_node_Bound(ir_node *n, ir_graph *irg) { * @return non-zero on success, 0 on dominance error */ static int check_dominance_for_node(ir_node *use) { + if (is_Block(use)) { + ir_node *mbh = get_Block_MacroBlock(use); + + if (mbh != use) { + /* must be a partBlock */ + if (is_Block(mbh)) { + ASSERT_AND_RET(block_dominates(mbh, use), "MacroBlock header must dominate a partBlock", 0); + } + } + } /* This won't work for blocks and the end node */ - if (!is_Block(use) && use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) { + else if (use != get_irg_end(current_ir_graph) && use != current_ir_graph->anchor) { int i; ir_node *bl = get_nodes_block(use); @@ -1948,11 +1970,12 @@ int irn_vrfy_irg(ir_node *n, ir_graph *irg) { } int irn_vrfy(ir_node *n) { - int res = 1; #ifdef DEBUG_libfirm - res = irn_vrfy_irg(n, current_ir_graph); + return irn_vrfy_irg(n, current_ir_graph); +#else + (void)n; + return 1; #endif - return res; } /*-----------------------------------------------------------------*/ @@ -2019,6 +2042,9 @@ int irg_verify(ir_graph *irg, unsigned flags) { else fprintf(stderr, "irg_verify: Verifying graph %p failed\n", (void *)current_ir_graph); } +#else + (void)irg; + (void)flags; #endif /* DEBUG_libfirm */ return res; @@ -2067,7 +2093,7 @@ static void check_bads(ir_node *node, void *env) { fprintf(stderr, "irg_vrfy_bads: Block %ld has Bad predecessor\n", get_irn_node_nr(node)); } if (get_node_verification_mode() == FIRM_VERIFICATION_ON) { - dump_ir_block_graph(current_ir_graph, "-assert"); + dump_ir_block_graph_sched(current_ir_graph, "-assert"); assert(0 && "Bad CF detected"); } } @@ -2084,7 +2110,7 @@ static void check_bads(ir_node *node, void *env) { fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Block\n", get_irn_node_nr(node)); } if (get_node_verification_mode() == FIRM_VERIFICATION_ON) { - dump_ir_block_graph(current_ir_graph, "-assert"); + dump_ir_block_graph_sched(current_ir_graph, "-assert"); assert(0 && "Bad CF detected"); } } @@ -2098,7 +2124,7 @@ static void check_bads(ir_node *node, void *env) { fprintf(stderr, "irg_vrfy_bads: node %ld is a Tuple\n", get_irn_node_nr(node)); } if (get_node_verification_mode() == FIRM_VERIFICATION_ON) { - dump_ir_block_graph(current_ir_graph, "-assert"); + dump_ir_block_graph_sched(current_ir_graph, "-assert"); assert(0 && "Tuple detected"); } } @@ -2119,7 +2145,7 @@ static void check_bads(ir_node *node, void *env) { fprintf(stderr, "irg_vrfy_bads: Phi %ld has Bad Input\n", get_irn_node_nr(node)); } if (get_node_verification_mode() == FIRM_VERIFICATION_ON) { - dump_ir_block_graph(current_ir_graph, "-assert"); + dump_ir_block_graph_sched(current_ir_graph, "-assert"); assert(0 && "Bad CF detected"); } } @@ -2133,7 +2159,7 @@ static void check_bads(ir_node *node, void *env) { fprintf(stderr, "irg_vrfy_bads: node %ld has Bad Input\n", get_irn_node_nr(node)); } if (get_node_verification_mode() == FIRM_VERIFICATION_ON) { - dump_ir_block_graph(current_ir_graph, "-assert"); + dump_ir_block_graph_sched(current_ir_graph, "-assert"); assert(0 && "Bad NON-CF detected"); } }