X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firconsconfirm.c;h=3a3375a641fa990194bdc9a344b8683b2ec26a6c;hb=109a60bfcf239f2b5304c709a430658920c287cf;hp=ea24f6b4da32a66ac8b9f75a5a07c12f18325066;hpb=29b409cf238f1a67d7a30a118b37c6e4961ef197;p=libfirm diff --git a/ir/ana/irconsconfirm.c b/ir/ana/irconsconfirm.c index ea24f6b4d..3a3375a64 100644 --- a/ir/ana/irconsconfirm.c +++ b/ir/ana/irconsconfirm.c @@ -36,15 +36,16 @@ #include "iredges_t.h" #include "irgwalk.h" #include "irprintf.h" +#include "irgopt.h" #include "irtools.h" /** * Walker environment. */ typedef struct _env_t { - unsigned num_confirms; /**< number of inserted Confirm nodes */ - unsigned num_consts; /**< number of constants placed */ - unsigned num_eq; /**< number of equalities placed */ + unsigned num_confirms; /**< number of inserted Confirm nodes */ + unsigned num_consts; /**< number of constants placed */ + unsigned num_eq; /**< number of equalities placed */ } env_t; /** @@ -58,8 +59,9 @@ typedef struct _env_t { */ static ir_node *get_effective_use_block(ir_node *node, int pos) { if (is_Phi(node)) { - /* the effective use of a Phi is in its predecessor block */ - node = get_irn_n(node, pos); + /* the effective use of a Phi argument is in its predecessor block */ + node = get_nodes_block(node); + return get_Block_cfgpred_block(node, pos); } return get_nodes_block(node); } @@ -158,13 +160,24 @@ static void handle_modeb(ir_node *block, ir_node *selector, pn_Cond pnc, env_t * cond_block = get_nodes_block(cond); foreach_out_edge(cond, edge) { ir_node *proj = get_edge_src_irn(edge); - if (get_Proj_proj(proj) == pnc) + if (get_Proj_proj(proj) == (long)pnc) continue; edge = get_irn_out_edge_first(proj); other_blk = get_edge_src_irn(edge); break; } assert(other_blk); + + /* + * Note the special case here: if block is a then, there might be no else + * block. In that case the other_block is the user_blk itself and pred_block + * is the cond_block ... + * + * Best would be to introduce a block here, removing this critical edge. + * For some reasons I cannot repair dominance here, so I have to remove + * ALL critical edges... + * FIXME: This should not be needed if we could repair dominance ... + */ } n = get_Block_n_cfgpreds(user_blk); @@ -173,17 +186,12 @@ static void handle_modeb(ir_node *block, ir_node *selector, pn_Cond pnc, env_t * * We have found a user in a non-dominated block: * check, if all its block predecessors are dominated. * If yes, place a Phi. - * - * Note the special case here: if block is a then, there might be no else - * block. In that case the other_block is the user_blk itself and pred_block - * is the cond_block ... */ for (i = n - 1; i >= 0; --i) { ir_node *pred_blk = get_Block_cfgpred_block(user_blk, i); - if (cond_block != pred_blk && - !block_dominates(block, pred_blk) && - !block_dominates(other_blk, pred_blk)) { + if (!block_dominates(block, pred_blk) && + !block_dominates(other_blk, pred_blk)) { /* can't do anything */ break; } @@ -373,11 +381,11 @@ static void insert_Confirm(ir_node *block, void *env) { handle_modeb(block, selector, get_Proj_proj(proj), env); /* this should be an IF, check this */ - if (get_irn_op(selector) != op_Proj) + if (! is_Proj(selector)) return; cmp = get_Proj_pred(selector); - if (get_irn_op(cmp) != op_Cmp) + if (! is_Cmp(cmp)) return; pnc = get_Proj_proj(selector); @@ -407,6 +415,8 @@ void construct_confirms(ir_graph *irg) { env_t env; int edges_active = edges_activated(irg); + remove_critical_cf_edges(irg); + /* we need dominance info */ assure_doms(irg); @@ -444,12 +454,13 @@ void construct_confirms(ir_graph *irg) { edges_deactivate(irg); } /* construct_confirms */ +#if 0 /** * Post-walker: Remove Confirm nodes */ static void rem_Confirm(ir_node *n, void *env) { (void) env; - if (get_irn_op(n) == op_Confirm) { + if (is_Confirm(n)) { ir_node *value = get_Confirm_value(n); if (value != n) exchange(n, value); @@ -462,6 +473,7 @@ static void rem_Confirm(ir_node *n, void *env) { } } } /* rem_Confirm */ +#endif /* * Remove all Confirm nodes from a graph.