From 0dc262e0511dead7ab7f657d9de83a0bc80eb47f Mon Sep 17 00:00:00 2001 From: rguenth Date: Mon, 20 Aug 2012 12:04:38 +0000 Subject: [PATCH] 2012-08-20 Richard Guenther * tree-flow.h (register_new_name_mapping): Remove. * tree-into-ssa.c (register_new_name_mapping): Likewise. (add_new_name_mapping): Do not push/pop timevar here. (create_new_def_for): Instead do it here. Initialize update-ssa here, handle a NULL def. * tree-vrp.c (build_assert_expr_for): Use create_new_def_for. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190531 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 ++++++++ gcc/tree-flow.h | 1 - gcc/tree-into-ssa.c | 64 ++++++++++++++++++++++++----------------------------- gcc/tree-vrp.c | 31 ++++++++------------------ 4 files changed, 47 insertions(+), 58 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c33069a..07b6a6c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2012-08-20 Richard Guenther + * tree-flow.h (register_new_name_mapping): Remove. + * tree-into-ssa.c (register_new_name_mapping): Likewise. + (add_new_name_mapping): Do not push/pop timevar here. + (create_new_def_for): Instead do it here. Initialize + update-ssa here, handle a NULL def. + * tree-vrp.c (build_assert_expr_for): Use create_new_def_for. + +2012-08-20 Richard Guenther + PR tree-optimization/54327 * gimple-fold.c (get_maxval_strlen): Do not walk use-def chains if the use is registered for SSA update. diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 7ea58e5..15c1465 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -516,7 +516,6 @@ void release_defs_bitset (bitmap toremove); /* In tree-into-ssa.c */ void update_ssa (unsigned); void delete_update_ssa (void); -void register_new_name_mapping (tree, tree); tree create_new_def_for (tree, gimple, def_operand_p); bool need_ssa_update_p (struct function *); bool name_registered_for_update_p (tree); diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c index a3c3179..8365ee1 100644 --- a/gcc/tree-into-ssa.c +++ b/gcc/tree-into-ssa.c @@ -111,15 +111,15 @@ static VEC(gimple_vec, heap) *phis_to_rewrite; static bitmap blocks_with_phis_to_rewrite; /* Growth factor for NEW_SSA_NAMES and OLD_SSA_NAMES. These sets need - to grow as the callers to register_new_name_mapping will typically - create new names on the fly. FIXME. Currently set to 1/3 to avoid - frequent reallocations but still need to find a reasonable growth - strategy. */ + to grow as the callers to create_new_def_for will create new names on + the fly. + FIXME. Currently set to 1/3 to avoid frequent reallocations but still + need to find a reasonable growth strategy. */ #define NAME_SETS_GROWTH_FACTOR (MAX (3, num_ssa_names / 3)) /* The function the SSA updating data structures have been initialized for. - NULL if they need to be initialized by register_new_name_mapping. */ + NULL if they need to be initialized by create_new_def_for. */ static struct function *update_ssa_initialized_fn = NULL; /* Global data to attach to the main dominator walk structure. */ @@ -587,8 +587,6 @@ add_to_repl_tbl (tree new_tree, tree old) static void add_new_name_mapping (tree new_tree, tree old) { - timevar_push (TV_TREE_SSA_INCREMENTAL); - /* OLD and NEW_TREE must be different SSA names for the same symbol. */ gcc_assert (new_tree != old && SSA_NAME_VAR (new_tree) == SSA_NAME_VAR (old)); @@ -613,8 +611,6 @@ add_new_name_mapping (tree new_tree, tree old) respectively. */ SET_BIT (new_ssa_names, SSA_NAME_VERSION (new_tree)); SET_BIT (old_ssa_names, SSA_NAME_VERSION (old)); - - timevar_pop (TV_TREE_SSA_INCREMENTAL); } @@ -2842,16 +2838,28 @@ delete_update_ssa (void) /* Create a new name for OLD_NAME in statement STMT and replace the - operand pointed to by DEF_P with the newly created name. Return - the new name and register the replacement mapping in + operand pointed to by DEF_P with the newly created name. If DEF_P + is NULL then STMT should be a GIMPLE assignment. + Return the new name and register the replacement mapping in update_ssa's tables. */ tree create_new_def_for (tree old_name, gimple stmt, def_operand_p def) { - tree new_name = duplicate_ssa_name (old_name, stmt); + tree new_name; - SET_DEF (def, new_name); + timevar_push (TV_TREE_SSA_INCREMENTAL); + + if (!update_ssa_initialized_fn) + init_update_ssa (cfun); + + gcc_assert (update_ssa_initialized_fn == cfun); + + new_name = duplicate_ssa_name (old_name, stmt); + if (def) + SET_DEF (def, new_name); + else + gimple_assign_set_lhs (stmt, new_name); if (gimple_code (stmt) == GIMPLE_PHI) { @@ -2861,30 +2869,16 @@ create_new_def_for (tree old_name, gimple stmt, def_operand_p def) SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name) = bb_has_abnormal_pred (bb); } - register_new_name_mapping (new_name, old_name); + add_new_name_mapping (new_name, old_name); /* For the benefit of passes that will be updating the SSA form on their own, set the current reaching definition of OLD_NAME to be NEW_NAME. */ get_ssa_name_ann (old_name)->info.current_def = new_name; - return new_name; -} - - -/* Register name NEW to be a replacement for name OLD. This function - must be called for every replacement that should be performed by - update_ssa. */ - -void -register_new_name_mapping (tree new_tree, tree old) -{ - if (!update_ssa_initialized_fn) - init_update_ssa (cfun); - - gcc_assert (update_ssa_initialized_fn == cfun); + timevar_pop (TV_TREE_SSA_INCREMENTAL); - add_new_name_mapping (new_tree, old); + return new_name; } @@ -3056,13 +3050,13 @@ insert_updated_phi_nodes_for (tree var, bitmap_head *dfs, bitmap blocks, frontier of the blocks where each of NEW_SSA_NAMES are defined. The mapping between OLD_SSA_NAMES and NEW_SSA_NAMES is setup by - calling register_new_name_mapping for every pair of names that the + calling create_new_def_for to create new defs for names that the caller wants to replace. - The caller identifies the new names that have been inserted and the - names that need to be replaced by calling register_new_name_mapping - for every pair . Note that the function assumes that the - new names have already been inserted in the IL. + The caller cretaes the new names to be inserted and the names that need + to be replaced by calling create_new_def_for for each old definition + to be replaced. Note that the function assumes that the + new defining statement has already been inserted in the IL. For instance, given the following code: diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 0fd400d..f0d68eb 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4152,33 +4152,20 @@ debug_all_value_ranges (void) static gimple build_assert_expr_for (tree cond, tree v) { - tree n; + tree a; gimple assertion; - gcc_assert (TREE_CODE (v) == SSA_NAME); - n = duplicate_ssa_name (v, NULL); + gcc_assert (TREE_CODE (v) == SSA_NAME + && COMPARISON_CLASS_P (cond)); - if (COMPARISON_CLASS_P (cond)) - { - tree a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond); - assertion = gimple_build_assign (n, a); - } - else if (TREE_CODE (cond) == SSA_NAME) - { - /* Given V, build the assignment N = true. */ - gcc_assert (v == cond); - assertion = gimple_build_assign (n, boolean_true_node); - } - else - gcc_unreachable (); - - SSA_NAME_DEF_STMT (n) = assertion; + a = build2 (ASSERT_EXPR, TREE_TYPE (v), v, cond); + assertion = gimple_build_assign (NULL_TREE, a); /* The new ASSERT_EXPR, creates a new SSA name that replaces the - operand of the ASSERT_EXPR. Register the new name and the old one - in the replacement table so that we can fix the SSA web after - adding all the ASSERT_EXPRs. */ - register_new_name_mapping (n, v); + operand of the ASSERT_EXPR. Create it so the new name and the old one + are registered in the replacement table so that we can fix the SSA web + after adding all the ASSERT_EXPRs. */ + create_new_def_for (v, assertion, NULL); return assertion; } -- 2.7.4