X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firconsconfirm.c;h=1198034fc67441f4558e1db538c326972e49c6ae;hb=0f234e2d94155d13c0e4727871125beda0eaa66d;hp=855d550b9885bfa6801e4c54c282e67e8c133db4;hpb=4b734653b3f11a3182963369bb58980e4d5a62cb;p=libfirm diff --git a/ir/ana/irconsconfirm.c b/ir/ana/irconsconfirm.c index 855d550b9..1198034fc 100644 --- a/ir/ana/irconsconfirm.c +++ b/ir/ana/irconsconfirm.c @@ -35,6 +35,7 @@ #include "irgwalk.h" #include "irprintf.h" #include "irgopt.h" +#include "irpass.h" #include "irtools.h" #include "array_t.h" #include "debug.h" @@ -209,10 +210,13 @@ static void handle_modeb(ir_node *block, ir_node *selector, pn_Cond pnc, env_t * if (c_b == NULL) { ir_node *c_true = new_Const(tarval_b_true); ir_node *c_false = new_Const(tarval_b_false); - c_b = new_r_Confirm(current_ir_graph, cond_block, selector, - pnc == pn_Cond_true ? c_true : c_false, pn_Cmp_Eq); - c_o = new_r_Confirm(current_ir_graph, cond_block, selector, - pnc == pn_Cond_false ? c_true : c_false, pn_Cmp_Eq); + if (pnc == pn_Cond_true) { + c_b = c_true; + c_o = c_false; + } else { + c_b = c_false; + c_o = c_true; + } } for (i = n - 1; i >= 0; --i) { ir_node *pred_blk = get_Block_cfgpred_block(user_blk, i); @@ -222,7 +226,7 @@ static void handle_modeb(ir_node *block, ir_node *selector, pn_Cond pnc, env_t * else in[i] = c_o; } - phi = new_r_Phi(current_ir_graph, user_blk, n, in, mode_b); + phi = new_r_Phi(user_blk, n, in, mode_b); set_irn_n(user, pos, phi); } } @@ -341,7 +345,7 @@ static void handle_if(ir_node *block, ir_node *cmp, pn_Cmp pnc, env_t *env) { * We can replace the input with a Confirm(left, pnc, right). */ if (! c) - c = new_r_Confirm(current_ir_graph, block, left, right, pnc); + c = new_r_Confirm(block, left, right, pnc); pos = get_edge_src_pos(edge); set_irn_n(succ, pos, c); @@ -374,7 +378,7 @@ static void handle_if(ir_node *block, ir_node *cmp, pn_Cmp pnc, env_t *env) { * We can replace the input with a Confirm(right, pnc^-1, left). */ if (! rc) - rc = new_r_Confirm(current_ir_graph, block, right, left, pnc); + rc = new_r_Confirm(block, right, left, pnc); pos = get_edge_src_pos(edge); set_irn_n(succ, pos, rc); @@ -440,7 +444,7 @@ static void insert_Confirm_in_block(ir_node *block, void *env) { long proj_nr = get_Proj_proj(proj); /* this is a CASE, but we cannot handle the default case */ - if (proj_nr == get_Cond_defaultProj(cond)) + if (proj_nr == get_Cond_default_proj(cond)) return; handle_case(block, get_Cond_selector(cond), proj_nr, env); @@ -506,7 +510,7 @@ static void insert_non_null(ir_node *ptr, ir_node *block, env_t *env) { ir_mode *mode = get_irn_mode(ptr); c = new_Const(get_mode_null(mode)); - c = new_r_Confirm(current_ir_graph, block, ptr, c, pn_Cmp_Lg); + c = new_r_Confirm(block, ptr, c, pn_Cmp_Lg); } set_irn_n(succ, pos, c); @@ -597,6 +601,11 @@ void construct_confirms(ir_graph *irg) { edges_deactivate(irg); } /* construct_confirms */ +/* Construct a pass. */ +ir_graph_pass_t *construct_confirms_pass(const char *name) { + return def_graph_pass(name ? name : "confirm", construct_confirms); +} /* construct_confirms_pass */ + #if 0 /** * Post-walker: Remove Confirm nodes @@ -628,3 +637,8 @@ void remove_confirms(ir_graph *irg) { optimize_graph_df(irg); set_opt_remove_confirm(rem); } /* remove_confirms */ + +/* Construct a pass. */ +ir_graph_pass_t *remove_confirms_pass(const char *name) { + return def_graph_pass(name ? name : "rem_confirm", remove_confirms); +} /* remove_confirms_pass */