X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana%2Firconsconfirm.c;h=7d9b3fe2ee35b3142a5dd10177808f3f7b7819f1;hb=45ecc187cee7107c83c1f9618a1e1e586df73644;hp=c8f93461305a6de57516e238cdbd2508fc5cadcd;hpb=960d88fb7fd5805f957a66bdf7cbc034659b7a71;p=libfirm diff --git a/ir/ana/irconsconfirm.c b/ir/ana/irconsconfirm.c index c8f934613..7d9b3fe2e 100644 --- a/ir/ana/irconsconfirm.c +++ b/ir/ana/irconsconfirm.c @@ -46,9 +46,10 @@ * 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. */ + unsigned num_non_null; /**< Number of non-null Confirms. */ } env_t; /** The debug handle. */ @@ -114,7 +115,7 @@ static void handle_case(ir_node *block, ir_node *irn, long nr, env_t *env) { set_irn_n(succ, pos, c); DBG_OPT_CONFIRM_C(irn, c); -// ir_printf("1 Replacing input %d of node %n with %n\n", pos, succ, c); + DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, succ, c)); env->num_consts += 1; } @@ -153,7 +154,7 @@ static void handle_modeb(ir_node *block, ir_node *selector, pn_Cond pnc, env_t * set_irn_n(user, pos, con); DBG_OPT_CONFIRM_C(old, con); - DB((dbg, LEVEL_2, "Replacing input %d of node %n with %n\n", pos, user, con)); + DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, user, con)); env->num_consts += 1; } else { @@ -287,7 +288,7 @@ static void handle_if(ir_node *block, ir_node *cmp, pn_Cmp pnc, env_t *env) { set_irn_n(user, pos, right); DBG_OPT_CONFIRM(left, right); - DB((dbg, LEVEL_2, "Replacing input %d of node %n with %n\n", pos, user, right)); + DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, user, right)); env->num_eq += 1; } else if (block_dominates(blk, cond_block)) { @@ -347,7 +348,7 @@ static void handle_if(ir_node *block, ir_node *cmp, pn_Cmp pnc, env_t *env) { pos = get_edge_src_pos(edge); set_irn_n(succ, pos, c); - DB((dbg, LEVEL_2, "Replacing input %d of node %n with %n\n", pos, succ, c)); + DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, succ, c)); env->num_confirms += 1; } @@ -415,7 +416,32 @@ static void insert_Confirm_in_block(ir_node *block, void *env) { } /* insert_Confirm_in_block */ /** - * The given will be dereferenced, add non-null confirms. + * Checks if a node is a non-null Confirm. + */ +static int is_non_null_Confirm(const ir_node *ptr) { + for (;;) { + if (! is_Confirm(ptr)) + break; + if (get_Confirm_cmp(ptr) == pn_Cmp_Lg) { + ir_node *bound = get_Confirm_bound(ptr); + + if (is_Const(bound) && is_Const_null(bound)) + return 1; + } + ptr = get_Confirm_value(ptr); + } + /* + * While a SymConst is not a Confirm, it is non-null + * anyway. This helps to reduce the number of + * constructed Confirms. + */ + if (is_SymConst_addr_ent(ptr)) + return 1; + return 0; +} /* is_non_null_Confirm */ + +/** + * The given pointer will be dereferenced, add non-null Confirms. * * @param ptr a node representing an address * @param block the block of the dereferencing instruction @@ -431,14 +457,9 @@ static void insert_non_null(ir_node *ptr, ir_node *block, env_t *env) { ir_node *blk; - if ((is_Load(succ) || is_Store(succ)) && - get_nodes_block(succ) == block) { - /* Ignore Loads and Store in the same block for now, - because we are not sure if they are dominated. - This is not a bad restriction: if exception flow is - present, they are in other blocks either. */ + /* for now, we place a Confirm only in front of a Cmp */ + if (! is_Cmp(succ)) continue; - } pos = get_edge_src_pos(edge); blk = get_effective_use_block(succ, pos); @@ -457,31 +478,14 @@ static void insert_non_null(ir_node *ptr, ir_node *block, env_t *env) { } set_irn_n(succ, pos, c); - DB((dbg, LEVEL_2, "Replacing input %d of node %n with %n\n", pos, succ, c)); - + DB((dbg, LEVEL_2, "Replacing input %d of node %+F with %+F\n", pos, succ, c)); + env->num_non_null += 1; env->num_confirms += 1; } } } /* insert_non_null */ -/** - * Checks if a node is a non-null Confirm. - */ -static int is_non_null_Confirm(const ir_node *ptr) { - for (;;) { - if (! is_Confirm(ptr)) - return 0; - if (get_Confirm_cmp(ptr) == pn_Cmp_Lg) { - ir_node *bound = get_Confirm_bound(ptr); - - if (is_Const(bound) && is_Const_null(bound)) - return 1; - } - ptr = get_Confirm_value(ptr); - } -} /* is_non_null_Confirm */ - /** * Pre-walker: Called for every node to insert Confirm nodes */ @@ -533,6 +537,7 @@ void construct_confirms(ir_graph *irg) { env.num_confirms = 0; env.num_consts = 0; env.num_eq = 0; + env.num_non_null = 0; if (get_opt_global_null_ptr_elimination()) { /* do global NULL test elimination */ @@ -553,6 +558,7 @@ void construct_confirms(ir_graph *irg) { DB((dbg, LEVEL_1, "# Confirms inserted : %u\n", env.num_confirms)); DB((dbg, LEVEL_1, "# Const replacements: %u\n", env.num_consts)); DB((dbg, LEVEL_1, "# node equalities : %u\n", env.num_eq)); + DB((dbg, LEVEL_1, "# non-null Confirms : %u\n", env.num_non_null)); /* deactivate edges if they where off */ if (! edges_active) @@ -571,7 +577,7 @@ static void rem_Confirm(ir_node *n, void *env) { exchange(n, value); else { /* - * Strange: a Confirm is it's own bound. This can happen + * Strange: a Confirm is its own bound. This can happen * in dead blocks when Phi nodes are already removed. */ exchange(n, new_Bad());