X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fcfopt.c;h=b455993b55875f7bb8bbbeed69db3784dd53d8f4;hb=1d523ad26cd541494c1e6cd8dc4b0736f0adc2cf;hp=7ed73c20d0cd15b83d8e5b62cf697461cbd39e9e;hpb=f8cc15664f571aa7ef89d6f6bc8d5bd2b8ca7d53;p=libfirm diff --git a/ir/opt/cfopt.c b/ir/opt/cfopt.c index 7ed73c20d..b455993b5 100644 --- a/ir/opt/cfopt.c +++ b/ir/opt/cfopt.c @@ -114,7 +114,7 @@ static void collect_nodes(ir_node *n, void *ctx) ir_node *block = get_nodes_block(n); add_Block_phi(block, n); } else if (is_Block(n)) { - if (has_Block_entity(n)) { + if (get_Block_entity(n) != NULL) { /* block with a jump label attached cannot be removed. */ set_Block_removable(n, false); } @@ -234,6 +234,26 @@ non_dispensable: return 1; } +/** + * This method merges blocks. A block is applicable to be merged, if it + * has only one predecessor with an unconditional jump to this block; + * and if this block does not contain any phis. + */ +static void merge_blocks(ir_node *b, void *env) +{ + (void) env; + + if (get_Block_n_cfgpreds(b) == 1) { + ir_node* pred = get_Block_cfgpred(b, 0); + if (is_Jmp(pred)) { + ir_node* pred_block = get_nodes_block(pred); + if (get_Block_phis(b) == NULL) { + exchange(b, pred_block); + } + } + } +} + /** * This method removes empty blocks. A block is empty if it only contains Phi * and Jmp nodes. @@ -861,7 +881,7 @@ static ir_graph_state_t do_cfopt(ir_graph *irg) * blocks, which it finds in a linked list computed before. * */ assure_doms(irg); - irg_block_walk_graph(irg, optimize_blocks, NULL, &env); + irg_block_walk_graph(irg, optimize_blocks, merge_blocks, &env); new_end = optimize_in_place(end); if (new_end != end) {