X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fopt%2Fcfopt.c;h=0f0fd84292359b156b94678c1cd3d583529c04b4;hb=6a6c1557afcd038930e649e29d69cb85a5dc372b;hp=65a14649d642cbda70f32de7d49dff0e9c32b246;hpb=db2cc15e8297ef0aacb4416427913ff64df60773;p=libfirm diff --git a/ir/opt/cfopt.c b/ir/opt/cfopt.c index 65a14649d..0f0fd8429 100644 --- a/ir/opt/cfopt.c +++ b/ir/opt/cfopt.c @@ -10,11 +10,12 @@ */ #ifdef HAVE_CONFIG_H -# include +# include "config.h" #endif #include +#include "xmalloc.h" #include "irnode_t.h" #include "irgraph_t.h" #include "irprog_t.h" @@ -45,6 +46,37 @@ /* semantics of Phi nodes. */ /*------------------------------------------------------------------*/ + +static void remove_senseless_conds(ir_node *bl, void *data) +{ + int i, j; + int n = get_irn_arity(bl); + + assert(is_Block(bl)); + + for(i = 0; i < n; ++i) { + ir_node *pred_i = get_irn_n(bl, i); + ir_node *cond_i = skip_Proj(pred_i); + + for(j = i + 1; j < n; ++j) { + ir_node *pred_j = get_irn_n(bl, j); + ir_node *cond_j = skip_Proj(pred_j); + + if(cond_j == cond_i + && get_irn_opcode(cond_i) == iro_Cond + && get_irn_mode(get_Cond_selector(cond_i)) == mode_b) { + + ir_node *jmp = new_r_Jmp(current_ir_graph, get_nodes_block(cond_i)); + set_irn_n(bl, i, jmp); + set_irn_n(bl, j, new_Bad()); + + break; + } + } + } +} + + /** * Removes Tuples from Block control flow predecessors. * Optimizes blocks with equivalent_node(). This is tricky, @@ -298,7 +330,7 @@ static void optimize_blocks(ir_node *b, void *env) { for (i = 0, k = get_Block_n_cfgpreds(b); i < k; ++i) { max_preds += test_whether_dispensable(b, i); } - in = (ir_node **) malloc(max_preds * sizeof(ir_node *)); + in = xmalloc(max_preds * sizeof(*in)); /*- printf(" working on "); DDMN(b); @@ -489,7 +521,7 @@ static void optimize_blocks(ir_node *b, void *env) { assert(get_irn_link(b) == NULL || (n_preds == p_preds && "Wrong Phi Fix")); - free(in); + xfree(in); } @@ -544,6 +576,7 @@ void optimize_cf(ir_graph *irg) { } } + irg_block_walk_graph(current_ir_graph, NULL, remove_senseless_conds, NULL); /* Use block visited flag to mark non-empty blocks. */ inc_irg_block_visited(irg); irg_walk(end, merge_blocks, collect_nodes, NULL); @@ -576,6 +609,7 @@ void optimize_cf(ir_graph *irg) { /* DEL_ARR_F(end->in); GL @@@ tut nicht ! */ end->in = in; + /* the verifyer doesn't work yet with floating nodes */ if (get_irg_pinned(irg) == op_pin_state_pinned) { /* after optimize_cf(), only Bad data flow may remain. */