X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssanames.c;h=db6717cf3aedc8bb8598f49ccb28e4edd1190634;hb=cfa1a80db18ce9025feaf483c38f3f7be264e5cc;hp=6a0fda6006fabb9872e29294061faa571ed3fd91;hpb=c211d99868b9ae23bcd10d9bf1820af33c0ebe7e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 6a0fda6006f..db6717cf3ae 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -1,5 +1,5 @@ /* Generic routines for manipulating SSA_NAME expressions - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of GCC. @@ -60,7 +60,10 @@ Boston, MA 02111-1307, USA. */ /* Array of all SSA_NAMEs used in the function. */ varray_type ssa_names; - + +/* Bitmap of ssa names marked for rewriting. */ +static bitmap ssa_names_to_rewrite; + /* Free list of SSA_NAMEs. This list is wiped at the end of each function after we leave SSA form. */ static GTY (()) tree free_ssanames; @@ -74,6 +77,54 @@ unsigned int ssa_name_nodes_reused; unsigned int ssa_name_nodes_created; #endif +/* Returns true if ssa name VAR is marked for rewrite. */ + +bool +marked_for_rewrite_p (tree var) +{ + return bitmap_bit_p (ssa_names_to_rewrite, SSA_NAME_VERSION (var)); +} + +/* Returns true if any ssa name is marked for rewrite. */ + +bool +any_marked_for_rewrite_p (void) +{ + if (!ssa_names_to_rewrite) + return false; + + return !bitmap_empty_p (ssa_names_to_rewrite); +} + +/* Mark ssa name VAR for rewriting. */ + +void +mark_for_rewrite (tree var) +{ + bitmap_set_bit (ssa_names_to_rewrite, SSA_NAME_VERSION (var)); +} + +/* Unmark all ssa names marked for rewrite. */ + +void +unmark_all_for_rewrite (void) +{ + bitmap_clear (ssa_names_to_rewrite); +} + +/* Return the bitmap of ssa names to rewrite. Copy the bitmap, + so that the optimizers cannot access internals directly */ + +bitmap +marked_ssa_names (void) +{ + bitmap ret = BITMAP_XMALLOC (); + + bitmap_copy (ret, ssa_names_to_rewrite); + + return ret; +} + /* Initialize management of SSA_NAMEs. */ void @@ -87,6 +138,7 @@ init_ssanames (void) large. */ VARRAY_PUSH_TREE (ssa_names, NULL_TREE); free_ssanames = NULL; + ssa_names_to_rewrite = BITMAP_XMALLOC (); } /* Finalize management of SSA_NAMEs. */ @@ -94,6 +146,9 @@ init_ssanames (void) void fini_ssanames (void) { + BITMAP_XFREE (ssa_names_to_rewrite); + ggc_free (ssa_names); + ssa_names = NULL; free_ssanames = NULL; } @@ -118,33 +173,24 @@ make_ssa_name (tree var, tree stmt) { tree t; -#if defined ENABLE_CHECKING - if ((!DECL_P (var) - && TREE_CODE (var) != INDIRECT_REF) - || (!IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (stmt))) - && TREE_CODE (stmt) != PHI_NODE)) - abort (); -#endif + gcc_assert (DECL_P (var) + || TREE_CODE (var) == INDIRECT_REF); + + gcc_assert (!stmt || EXPR_P (stmt) || TREE_CODE (stmt) == PHI_NODE); - /* If our free list has an element, then use it. Also reuse the - SSA version number of the element on the free list which helps - keep sbitmaps and arrays sized HIGHEST_SSA_VERSION smaller. */ + /* If our free list has an element, then use it. */ if (free_ssanames) { - unsigned int save_version; - t = free_ssanames; free_ssanames = TREE_CHAIN (free_ssanames); #ifdef GATHER_STATISTICS ssa_name_nodes_reused++; #endif - /* Clear the node so that it looks just like one we would have - received from make_node. */ - save_version = SSA_NAME_VERSION (t); - memset (t, 0, tree_size (t)); - TREE_SET_CODE (t, SSA_NAME); - SSA_NAME_VERSION (t) = save_version; + /* The node was cleared out when we put it on the free list, so + there is no need to do so again here. */ + gcc_assert (ssa_name (SSA_NAME_VERSION (t)) == NULL); + VARRAY_TREE (ssa_names, SSA_NAME_VERSION (t)) = t; } else { @@ -160,6 +206,7 @@ make_ssa_name (tree var, tree stmt) SSA_NAME_VAR (t) = var; SSA_NAME_DEF_STMT (t) = stmt; SSA_NAME_PTR_INFO (t) = NULL; + SSA_NAME_IN_FREE_LIST (t) = 0; return t; } @@ -176,6 +223,20 @@ make_ssa_name (tree var, tree stmt) void release_ssa_name (tree var) { + if (!var) + return; + + /* Never release the default definition for a symbol. It's a + special SSA name that should always exist once it's created. */ + if (var == var_ann (SSA_NAME_VAR (var))->default_def) + return; + + /* If the ssa name is marked for rewriting, it may have multiple definitions, + but we may happen to remove just one of them. So do not remove the + ssa name now. */ + if (marked_for_rewrite_p (var)) + return; + /* release_ssa_name can be called multiple times on a single SSA_NAME. However, it should only end up on our free list one time. We keep a status bit in the SSA_NAME node itself to indicate it has @@ -185,10 +246,79 @@ release_ssa_name (tree var) defining statement. */ if (! SSA_NAME_IN_FREE_LIST (var)) { + tree saved_ssa_name_var = SSA_NAME_VAR (var); + int saved_ssa_name_version = SSA_NAME_VERSION (var); + + VARRAY_TREE (ssa_names, SSA_NAME_VERSION (var)) = NULL; + memset (var, 0, tree_size (var)); + + /* First put back the right tree node so that the tree checking + macros do not complain. */ + TREE_SET_CODE (var, SSA_NAME); + + /* Restore the version number. */ + SSA_NAME_VERSION (var) = saved_ssa_name_version; + + /* Hopefully this can go away once we have the new incremental + SSA updating code installed. */ + SSA_NAME_VAR (var) = saved_ssa_name_var; + + /* Note this SSA_NAME is now in the first list. */ SSA_NAME_IN_FREE_LIST (var) = 1; + + /* And finally link it into the free list. */ TREE_CHAIN (var) = free_ssanames; free_ssanames = var; } } +/* Creates a duplicate of a ssa name NAME defined in statement STMT. */ + +tree +duplicate_ssa_name (tree name, tree stmt) +{ + tree new_name = make_ssa_name (SSA_NAME_VAR (name), stmt); + struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name); + struct ptr_info_def *new_ptr_info; + + if (!old_ptr_info) + return new_name; + + new_ptr_info = ggc_alloc (sizeof (struct ptr_info_def)); + *new_ptr_info = *old_ptr_info; + + if (old_ptr_info->pt_vars) + { + new_ptr_info->pt_vars = BITMAP_GGC_ALLOC (); + bitmap_copy (new_ptr_info->pt_vars, old_ptr_info->pt_vars); + } + + SSA_NAME_PTR_INFO (new_name) = new_ptr_info; + return new_name; +} + + +/* Release all the SSA_NAMEs created by STMT. */ + +void +release_defs (tree stmt) +{ + tree def; + ssa_op_iter iter; + + FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS) + if (TREE_CODE (def) == SSA_NAME) + release_ssa_name (def); +} + + +/* Replace the symbol associated with SSA_NAME with SYM. */ + +void +replace_ssa_name_symbol (tree ssa_name, tree sym) +{ + SSA_NAME_VAR (ssa_name) = sym; + TREE_TYPE (ssa_name) = TREE_TYPE (sym); +} + #include "gt-tree-ssanames.h"