X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firopt.c;h=51e8854750cbd4c82c243762d1ab750553f18630;hb=eb47aca33f2f8c414409f3695e73277b47442334;hp=ac017a3333fd05c1b5d771de1016abe83ec47903;hpb=65daf5bc390b02d68581f4c431dbdbfaae11b88f;p=libfirm diff --git a/ir/ir/iropt.c b/ir/ir/iropt.c index ac017a333..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; @@ -6274,10 +6278,8 @@ static ir_node *gigo(ir_node *node) { ir_op *op = get_irn_op(node); - /* Nodes in bad blocks are bad. - * Beware: we can only read the block of a non-floating node. */ - if (op != op_Block && is_irn_pinned_in_irg(node) - && is_Bad(get_nodes_block(node))) { + /* Code in "Bad" blocks is unreachable and can be replaced by Bad */ + if (op != op_Block && is_Bad(get_nodes_block(node))) { ir_graph *irg = get_irn_irg(node); return get_irg_bad(irg); } @@ -6304,7 +6306,7 @@ static ir_node *gigo(ir_node *node) } return node; -} /* gigo */ +} /** * These optimizations deallocate nodes from the obstack.