X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=51e8854750cbd4c82c243762d1ab750553f18630;hb=eb47aca33f2f8c414409f3695e73277b47442334;hp=3565713e970126a28ed3ea80d4fb4b4ebe1636bc;hpb=32fc212e2d06debb2ac9ee30b5ff237e076b03e6;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index 3565713e9..51e885475 100644 --- a/ir/ir/iropt.c +++ b/ir/ir/iropt.c @@ -691,6 +691,25 @@ static ir_node *equivalent_node_Block(ir_node *n) irg = get_irn_irg(n); + /* if all predecessors of a block are unreachable, then the block is + * unreachable */ + if (is_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK)) { + int i; + int n_cfgpreds = get_Block_n_cfgpreds(n); + + for (i = 0; i < n_cfgpreds; ++i) { + ir_node *pred = get_Block_cfgpred(n, i); + if (!is_Bad(pred)) + break; + } + /* only bad inputs? It's unreachable code (unless it is the start or + * end block) */ + if (i >= n_cfgpreds && n != get_irg_start_block(irg) + && n != get_irg_end_block(irg)) { + return get_irg_bad(irg); + } + } + /* Straightening: a single entry Block following a single exit Block * can be merged. */ if (n_preds == 1) { @@ -721,21 +740,6 @@ static ir_node *equivalent_node_Block(ir_node *n) DBG_OPT_IFSIM1(oldn, a, b, n); } } - } else if (is_irg_state(irg, IR_GRAPH_STATE_BAD_BLOCK)) { - int i; - int n_cfgpreds = get_Block_n_cfgpreds(n); - - for (i = 0; i < n_cfgpreds; ++i) { - ir_node *pred = get_Block_cfgpred(n, i); - if (!is_Bad(pred)) - break; - } - /* only bad unreachable inputs? It's unreachable code (unless it is the - * start or end block) */ - if (i >= n_cfgpreds && n != get_irg_start_block(irg) - && n != get_irg_end_block(irg)) { - return get_irg_bad(irg); - } } return n;