X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssanames.c;h=42eb9243252ef2d579ab2922defc5fae45793bb6;hb=c17025166b0746318646cdd7297eaa1248b00517;hp=f3101d2827102fe4b956595403e682d71c48e7f8;hpb=75a70cf95f65fe9204b15ad9aba31c571381d224;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index f3101d28271..42eb9243252 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -1,18 +1,19 @@ /* Generic routines for manipulating SSA_NAME expressions - Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc. - + Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. + This file is part of GCC. - + GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. - + GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see . */ @@ -22,14 +23,12 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tm.h" #include "tree.h" -#include "varray.h" -#include "ggc.h" #include "tree-flow.h" #include "tree-pass.h" /* Rewriting a function into SSA form can create a huge number of SSA_NAMEs, many of which may be thrown away shortly after their creation if jumps - were threaded through PHI nodes. + were threaded through PHI nodes. While our garbage collection mechanisms will handle this situation, it is extremely wasteful to create nodes and throw them away, especially @@ -43,7 +42,7 @@ along with GCC; see the file COPYING3. If not see Right now we maintain our free list on a per-function basis. It may or may not make sense to maintain the free list for the duration of - a compilation unit. + a compilation unit. External code should rely solely upon HIGHEST_SSA_VERSION and the externally defined functions. External code should not know about @@ -87,6 +86,8 @@ init_ssanames (struct function *fn, int size) least 50 elements reserved in it. */ VEC_quick_push (tree, SSANAMES (fn), NULL_TREE); FREE_SSANAMES (fn) = NULL; + + SYMS_TO_RENAME (fn) = BITMAP_GGC_ALLOC (); } /* Finalize management of SSA_NAMEs. */ @@ -95,7 +96,7 @@ void fini_ssanames (void) { VEC_free (tree, gc, SSANAMES (cfun)); - FREE_SSANAMES (cfun) = NULL; + VEC_free (tree, gc, FREE_SSANAMES (cfun)); } /* Dump some simple statistics regarding the re-use of SSA_NAME nodes. */ @@ -123,10 +124,9 @@ make_ssa_name_fn (struct function *fn, tree var, gimple stmt) gcc_assert (DECL_P (var)); /* If our free list has an element, then use it. */ - if (FREE_SSANAMES (fn)) + if (!VEC_empty (tree, FREE_SSANAMES (fn))) { - t = FREE_SSANAMES (fn); - FREE_SSANAMES (fn) = TREE_CHAIN (FREE_SSANAMES (fn)); + t = VEC_pop (tree, FREE_SSANAMES (fn)); #ifdef GATHER_STATISTICS ssa_name_nodes_reused++; #endif @@ -163,7 +163,7 @@ make_ssa_name_fn (struct function *fn, tree var, gimple stmt) /* We no longer need the SSA_NAME expression VAR, release it so that - it may be reused. + it may be reused. Note it is assumed that no calls to make_ssa_name will be made until all uses of the ssa name are released and that the only @@ -192,7 +192,7 @@ release_ssa_name (tree var) /* 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 - been put on the free list. + been put on the free list. Note that once on the freelist you can not reference the SSA_NAME's defining statement. */ @@ -202,6 +202,9 @@ release_ssa_name (tree var) int saved_ssa_name_version = SSA_NAME_VERSION (var); use_operand_p imm = &(SSA_NAME_IMM_USE_NODE (var)); + if (MAY_HAVE_DEBUG_STMTS) + insert_debug_temp_for_var_def (NULL, var); + #ifdef ENABLE_CHECKING verify_imm_links (stderr, var); #endif @@ -230,26 +233,34 @@ release_ssa_name (tree 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 (cfun); - FREE_SSANAMES (cfun) = var; + /* And finally put it on the free list. */ + VEC_safe_push (tree, gc, FREE_SSANAMES (cfun), var); } } -/* Creates a duplicate of a ssa name NAME defined in statement STMT. */ -tree -duplicate_ssa_name (tree name, gimple stmt) +/* Return the alias information associated with pointer T. It creates a + new instance if none existed. */ + +struct ptr_info_def * +get_ptr_info (tree t) { - 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 *pi; - if (old_ptr_info) - duplicate_ssa_name_ptr_info (new_name, old_ptr_info); + gcc_assert (POINTER_TYPE_P (TREE_TYPE (t))); - return new_name; -} + pi = SSA_NAME_PTR_INFO (t); + if (pi == NULL) + { + pi = ggc_alloc_cleared_ptr_info_def (); + pt_solution_reset (&pi->pt); + pi->align = 1; + pi->misalign = 0; + SSA_NAME_PTR_INFO (t) = pi; + } + return pi; +} /* Creates a duplicate of the ptr_info_def at PTR_INFO for use by the SSA name NAME. */ @@ -265,19 +276,28 @@ duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def *ptr_info) if (!ptr_info) return; - new_ptr_info = GGC_NEW (struct ptr_info_def); + new_ptr_info = ggc_alloc_ptr_info_def (); *new_ptr_info = *ptr_info; - if (ptr_info->pt_vars) - { - new_ptr_info->pt_vars = BITMAP_GGC_ALLOC (); - bitmap_copy (new_ptr_info->pt_vars, ptr_info->pt_vars); - } - SSA_NAME_PTR_INFO (name) = new_ptr_info; } +/* Creates a duplicate of a ssa name NAME tobe defined by statement STMT. */ + +tree +duplicate_ssa_name (tree name, gimple stmt) +{ + tree new_name = make_ssa_name (SSA_NAME_VAR (name), stmt); + struct ptr_info_def *old_ptr_info = SSA_NAME_PTR_INFO (name); + + if (old_ptr_info) + duplicate_ssa_name_ptr_info (new_name, old_ptr_info); + + return new_name; +} + + /* Release all the SSA_NAMEs created by STMT. */ void @@ -312,34 +332,22 @@ replace_ssa_name_symbol (tree ssa_name, tree sym) static unsigned int release_dead_ssa_names (void) { - tree t, next; - int n = 0; + tree t; + int n = VEC_length (tree, FREE_SSANAMES (cfun)); referenced_var_iterator rvi; - /* Current defs point to various dead SSA names that in turn points to dead - statements so bunch of dead memory is held from releasing. */ - FOR_EACH_REFERENCED_VAR (t, rvi) + /* Current defs point to various dead SSA names that in turn point to + eventually dead variables so a bunch of memory is held live. */ + FOR_EACH_REFERENCED_VAR (cfun, t, rvi) set_current_def (t, NULL); /* Now release the freelist. */ - for (t = FREE_SSANAMES (cfun); t; t = next) - { - next = TREE_CHAIN (t); - /* Dangling pointers might make GGC to still see dead SSA names, so it is - important to unlink the list and avoid GGC from seeing all subsequent - SSA names. In longer run we want to have all dangling pointers here - removed (since they usually go through dead statements that consume - considerable amounts of memory). */ - TREE_CHAIN (t) = NULL_TREE; - n++; - } + VEC_free (tree, gc, FREE_SSANAMES (cfun)); FREE_SSANAMES (cfun) = NULL; - /* Cgraph edges has been invalidated and point to dead statement. We need to - remove them now and will rebuild it before next IPA pass. */ - cgraph_node_remove_callees (cgraph_node (current_function_decl)); - + statistics_counter_event (cfun, "SSA names released", n); if (dump_file) - fprintf (dump_file, "Released %i names, %.2f%%\n", n, n * 100.0 / num_ssa_names); + fprintf (dump_file, "Released %i names, %.2f%%\n", + n, n * 100.0 / num_ssa_names); return 0; } @@ -353,11 +361,11 @@ struct gimple_opt_pass pass_release_ssa_names = NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ - 0, /* tv_id */ + TV_TREE_SSA_OTHER, /* tv_id */ PROP_ssa, /* properties_required */ 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func /* todo_flags_finish */ + 0 /* todo_flags_finish */ } };