Commit b23987ec by Daniel Berlin Committed by Daniel Berlin

tree.h (DECL_PTA_ARTIFICIAL): Remove.

2006-10-20  Daniel Berlin  <dberlin@dberlin.org>

	* tree.h (DECL_PTA_ARTIFICIAL): Remove.
	(tree_decl_with_vis): Remove artificial_pta_var flag.
	* tree-flow.h (referenced_var_check_and_insert): Expose.
	(nonlocal_all): New prototype.
	* tree-ssa-structalias.c (nonlocal_for_type): Remove.
	(nonlocal_all): Make global.
	(nonlocal_lookup): Remove.
	(nonlocal_insert): Ditto.
	(create_nonlocal_var): Do not call nonlocal_insert.
	(get_nonlocal_id_for_type): Remove.
	(find_global_initializers): Mark new vars we find for renaming.
	(intra_create_variable_infos): Only create one nonlocal.
	(expand_nonlocal_solutions): Remove.
	(compute_points_to_sets): Don't call it.
	(ipa_pta_execute): Ditto.
	(init_alias_heapvars): Don't create nonlocal_for_type.
	(delete_alias_heapvars): Don't remove it.
	* tree-ssa-operands.c (access_can_touch_variable): Don't prune
	nonlocal_all.

From-SVN: r117922
parent 552f68f8
2006-10-20 Daniel Berlin <dberlin@dberlin.org>
* tree.h (DECL_PTA_ARTIFICIAL): Remove.
(tree_decl_with_vis): Remove artificial_pta_var flag.
* tree-flow.h (referenced_var_check_and_insert): Expose.
(nonlocal_all): New prototype.
* tree-ssa-structalias.c (nonlocal_for_type): Remove.
(nonlocal_all): Make global.
(nonlocal_lookup): Remove.
(nonlocal_insert): Ditto.
(create_nonlocal_var): Do not call nonlocal_insert.
(get_nonlocal_id_for_type): Remove.
(find_global_initializers): Mark new vars we find for renaming.
(intra_create_variable_infos): Only create one nonlocal.
(expand_nonlocal_solutions): Remove.
(compute_points_to_sets): Don't call it.
(ipa_pta_execute): Ditto.
(init_alias_heapvars): Don't create nonlocal_for_type.
(delete_alias_heapvars): Don't remove it.
* tree-ssa-operands.c (access_can_touch_variable): Don't prune
nonlocal_all.
2006-10-19 Brooks Moses <bmoses@stanford.edu> 2006-10-19 Brooks Moses <bmoses@stanford.edu>
* doc/install.texi (Downloading GCC): Clarify mention of * doc/install.texi (Downloading GCC): Clarify mention of
......
...@@ -14,5 +14,5 @@ main(void) ...@@ -14,5 +14,5 @@ main(void)
} }
/* The V_*_DEF comes from the initial assignment and the asm. */ /* The V_*_DEF comes from the initial assignment and the asm. */
/* { dg-final { scan-tree-dump-times "_DEF" 2 "alias1" } } */ /* { dg-final { scan-tree-dump-times "_DEF" 3 "alias1" } } */
/* { dg-final { cleanup-tree-dump "alias1" } } */ /* { dg-final { cleanup-tree-dump "alias1" } } */
...@@ -17,5 +17,5 @@ void bar (void) ...@@ -17,5 +17,5 @@ void bar (void)
malloc functions may clobber global memory. Only the function result malloc functions may clobber global memory. Only the function result
does not alias any other pointer. does not alias any other pointer.
Hence, we must have a VDEF for a before and after the call to foo(). */ Hence, we must have a VDEF for a before and after the call to foo(). */
/* { dg-final { scan-tree-dump-times "V_MAY_DEF" 1 "alias1"} } */ /* { dg-final { scan-tree-dump-times "V_MAY_DEF" 2 "alias1"} } */
/* { dg-final { cleanup-tree-dump "alias1" } } */ /* { dg-final { cleanup-tree-dump "alias1" } } */
...@@ -621,7 +621,7 @@ referenced_var_lookup (unsigned int uid) ...@@ -621,7 +621,7 @@ referenced_var_lookup (unsigned int uid)
/* Check if TO is in the referenced_vars hash table and insert it if not. /* Check if TO is in the referenced_vars hash table and insert it if not.
Return true if it required insertion. */ Return true if it required insertion. */
static bool bool
referenced_var_check_and_insert (tree to) referenced_var_check_and_insert (tree to)
{ {
struct int_tree_map *h, in; struct int_tree_map *h, in;
......
...@@ -425,6 +425,7 @@ extern GTY((param_is (struct int_tree_map))) htab_t referenced_vars; ...@@ -425,6 +425,7 @@ extern GTY((param_is (struct int_tree_map))) htab_t referenced_vars;
extern GTY((param_is (struct int_tree_map))) htab_t default_defs; extern GTY((param_is (struct int_tree_map))) htab_t default_defs;
extern tree referenced_var_lookup (unsigned int); extern tree referenced_var_lookup (unsigned int);
extern bool referenced_var_check_and_insert (tree);
#define num_referenced_vars htab_elements (referenced_vars) #define num_referenced_vars htab_elements (referenced_vars)
#define referenced_var(i) referenced_var_lookup (i) #define referenced_var(i) referenced_var_lookup (i)
...@@ -437,6 +438,10 @@ extern GTY(()) VEC(tree,gc) *ssa_names; ...@@ -437,6 +438,10 @@ extern GTY(()) VEC(tree,gc) *ssa_names;
/* Artificial variable used to model the effects of function calls. */ /* Artificial variable used to model the effects of function calls. */
extern GTY(()) tree global_var; extern GTY(()) tree global_var;
/* Artificial variable used to model the effects of nonlocal
variables. */
extern GTY(()) tree nonlocal_all;
/* Call clobbered variables in the function. If bit I is set, then /* Call clobbered variables in the function. If bit I is set, then
REFERENCED_VARS (I) is call-clobbered. */ REFERENCED_VARS (I) is call-clobbered. */
extern bitmap call_clobbered_vars; extern bitmap call_clobbered_vars;
......
...@@ -1053,7 +1053,9 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset, ...@@ -1053,7 +1053,9 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
if (alias == global_var) if (alias == global_var)
return true; return true;
if (TREE_CODE (alias) == VAR_DECL && DECL_PTA_ARTIFICIAL (alias)) /* We cannot prune nonlocal aliases because they are not type
specific. */
if (alias == nonlocal_all)
return true; return true;
/* If ALIAS is an SFT, it can't be touched if the offset /* If ALIAS is an SFT, it can't be touched if the offset
......
...@@ -164,14 +164,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ...@@ -164,14 +164,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
htab_t heapvar_for_stmt; htab_t heapvar_for_stmt;
/* One variable to represent all non-local accesses. */
/* Represents nonlocals. */ tree nonlocal_all;
static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
htab_t nonlocal_for_type;
/* If strict aliasing is off, we only use one variable to represent
the nonlocal types. */
static GTY (()) tree nonlocal_all;
static bool use_field_sensitive = true; static bool use_field_sensitive = true;
static int in_ipa_mode = 0; static int in_ipa_mode = 0;
...@@ -2516,40 +2510,6 @@ do_deref (VEC (ce_s, heap) **constraints) ...@@ -2516,40 +2510,6 @@ do_deref (VEC (ce_s, heap) **constraints)
} }
} }
/* Lookup a nonlocal variable for type FROM, and return it if we find
one. */
static tree
nonlocal_lookup (tree from)
{
struct tree_map *h, in;
in.from = from;
h = htab_find_with_hash (nonlocal_for_type, &in,
htab_hash_pointer (from));
if (h)
return h->to;
return NULL_TREE;
}
/* Insert a mapping FROM->TO in the nonlocal variable for type
hashtable. */
static void
nonlocal_insert (tree from, tree to)
{
struct tree_map *h;
void **loc;
h = ggc_alloc (sizeof (struct tree_map));
h->hash = htab_hash_pointer (from);
h->from = from;
h->to = to;
loc = htab_find_slot_with_hash (nonlocal_for_type, h, h->hash,
INSERT);
*(struct tree_map **) loc = h;
}
/* Create a nonlocal variable of TYPE to represent nonlocals we can /* Create a nonlocal variable of TYPE to represent nonlocals we can
alias. */ alias. */
...@@ -2561,61 +2521,10 @@ create_nonlocal_var (tree type) ...@@ -2561,61 +2521,10 @@ create_nonlocal_var (tree type)
if (referenced_vars) if (referenced_vars)
add_referenced_var (nonlocal); add_referenced_var (nonlocal);
DECL_PTA_ARTIFICIAL (nonlocal) = 1;
DECL_EXTERNAL (nonlocal) = 1; DECL_EXTERNAL (nonlocal) = 1;
nonlocal_insert (type, nonlocal);
return nonlocal; return nonlocal;
} }
/* Get or create a nonlocal variable for TYPE, and return its
variable info id. */
static unsigned int
get_nonlocal_id_for_type (tree type)
{
tree nonlocal;
unsigned int nonlocal_id;
varinfo_t nonlocal_vi;
/* For strict aliasing, we have one variable per type. For
non-strict aliasing, we only need one variable. */
if (flag_strict_aliasing != 0)
{
nonlocal = nonlocal_lookup (type);
}
else
{
if (!nonlocal_all)
{
nonlocal = create_nonlocal_var (void_type_node);
nonlocal_all = nonlocal;
}
else
nonlocal = nonlocal_all;
}
if (nonlocal && lookup_id_for_tree (nonlocal, &nonlocal_id))
return nonlocal_id;
if (!nonlocal)
{
gcc_assert (flag_strict_aliasing != 0);
nonlocal = create_nonlocal_var (type);
}
/* Create variable info for the nonlocal var if it does not
exist. */
nonlocal_id = create_variable_info_for (nonlocal,
get_name (nonlocal));
nonlocal_vi = get_varinfo (nonlocal_id);
nonlocal_vi->is_artificial_var = 1;
nonlocal_vi->is_heap_var = 1;
nonlocal_vi->is_unknown_size_var = 1;
nonlocal_vi->directly_dereferenced = true;
return nonlocal_id;
}
/* Given a tree T, return the constraint expression for it. */ /* Given a tree T, return the constraint expression for it. */
static void static void
...@@ -2756,7 +2665,6 @@ get_constraint_for (tree t, VEC (ce_s, heap) **results) ...@@ -2756,7 +2665,6 @@ get_constraint_for (tree t, VEC (ce_s, heap) **results)
return; return;
} }
break; break;
default: default:
{ {
temp.type = ADDRESSOF; temp.type = ADDRESSOF;
...@@ -4116,7 +4024,12 @@ find_global_initializers (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, ...@@ -4116,7 +4024,12 @@ find_global_initializers (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
case VAR_DECL: case VAR_DECL:
/* We might not have walked this because we skip /* We might not have walked this because we skip
DECL_EXTERNALs during the initial scan. */ DECL_EXTERNALs during the initial scan. */
add_referenced_var (t); if (referenced_vars)
{
get_var_ann (t);
if (referenced_var_check_and_insert (t))
mark_sym_for_renaming (t);
}
break; break;
default: default:
break; break;
...@@ -4336,8 +4249,8 @@ intra_create_variable_infos (void) ...@@ -4336,8 +4249,8 @@ intra_create_variable_infos (void)
{ {
tree t; tree t;
struct constraint_expr lhs, rhs; struct constraint_expr lhs, rhs;
tree nonlocal;
varinfo_t nonlocal_vi; varinfo_t nonlocal_vi;
/* For each incoming pointer argument arg, ARG = ESCAPED_VARS or a /* For each incoming pointer argument arg, ARG = ESCAPED_VARS or a
dummy variable if flag_argument_noalias > 2. */ dummy variable if flag_argument_noalias > 2. */
for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t)) for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t))
...@@ -4393,14 +4306,12 @@ intra_create_variable_infos (void) ...@@ -4393,14 +4306,12 @@ intra_create_variable_infos (void)
make_constraint_from_escaped (p); make_constraint_from_escaped (p);
} }
} }
nonlocal = create_tmp_var_raw (void_type_node, "NONLOCAL_ALL"); nonlocal_all = create_nonlocal_var (void_type_node);
DECL_EXTERNAL (nonlocal) = 1;
/* Create variable info for the nonlocal var if it does not /* Create variable info for the nonlocal var if it does not
exist. */ exist. */
nonlocal_vars_id = create_variable_info_for (nonlocal, nonlocal_vars_id = create_variable_info_for (nonlocal_all,
get_name (nonlocal)); get_name (nonlocal_all));
nonlocal_vi = get_varinfo (nonlocal_vars_id); nonlocal_vi = get_varinfo (nonlocal_vars_id);
nonlocal_vi->is_artificial_var = 1; nonlocal_vi->is_artificial_var = 1;
nonlocal_vi->is_heap_var = 1; nonlocal_vi->is_heap_var = 1;
...@@ -4860,61 +4771,6 @@ find_escape_constraints (tree stmt) ...@@ -4860,61 +4771,6 @@ find_escape_constraints (tree stmt)
VEC_free (ce_s, heap, rhsc); VEC_free (ce_s, heap, rhsc);
} }
/* Expand the solutions that have nonlocal_id in them to include one
variable for each type that is pointed to by nonlocal and
dereferenced. */
static void
expand_nonlocal_solutions (void)
{
int i;
varinfo_t v;
bitmap new_nonlocal_solution = BITMAP_ALLOC (&ptabitmap_obstack);
/* We could do this faster by only checking non-collapsed nodes,
unless the node was collapsed to one we would normally ignore in the
rest of the loop. Logic already seems complicated enough, and
it wasn't a measurable speedup on any testcases i had. */
for (i = 0; VEC_iterate (varinfo_t, varmap, i, v); i++)
{
/* Where the solution for our variable is, since it may have
been collapsed to another varinfo. */
varinfo_t solv = v;
if (v->is_special_var
|| v->id == nonlocal_vars_id
|| v->id == escaped_vars_id
|| !POINTER_TYPE_P (TREE_TYPE (v->decl)))
continue;
if (v->node != v->id)
solv = get_varinfo (v->node);
if (bitmap_bit_p (solv->solution, nonlocal_vars_id))
{
unsigned int new_nonlocal_id;
tree pttype = TREE_TYPE (TREE_TYPE (v->decl));
new_nonlocal_id = get_nonlocal_id_for_type (pttype);
bitmap_set_bit (new_nonlocal_solution, new_nonlocal_id);
}
}
if (!bitmap_empty_p (new_nonlocal_solution))
{
for (i = 0; VEC_iterate (varinfo_t, varmap, i, v); i++)
{
if (v->node != v->id)
continue;
if (bitmap_bit_p (v->solution, nonlocal_vars_id))
{
bitmap_clear_bit (v->solution, nonlocal_vars_id);
bitmap_ior_into (v->solution, new_nonlocal_solution);
}
}
}
}
/* Create points-to sets for the current function. See the comments /* Create points-to sets for the current function. See the comments
at the start of the file for an algorithmic overview. */ at the start of the file for an algorithmic overview. */
...@@ -4983,8 +4839,6 @@ compute_points_to_sets (struct alias_info *ai) ...@@ -4983,8 +4839,6 @@ compute_points_to_sets (struct alias_info *ai)
solve_graph (graph); solve_graph (graph);
expand_nonlocal_solutions ();
if (dump_file) if (dump_file)
dump_sa_points_to_info (dump_file); dump_sa_points_to_info (dump_file);
...@@ -5129,8 +4983,6 @@ ipa_pta_execute (void) ...@@ -5129,8 +4983,6 @@ ipa_pta_execute (void)
solve_graph (graph); solve_graph (graph);
expand_nonlocal_solutions ();
if (dump_file) if (dump_file)
dump_sa_points_to_info (dump_file); dump_sa_points_to_info (dump_file);
in_ipa_mode = 0; in_ipa_mode = 0;
...@@ -5162,8 +5014,6 @@ init_alias_heapvars (void) ...@@ -5162,8 +5014,6 @@ init_alias_heapvars (void)
{ {
heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq,
NULL); NULL);
nonlocal_for_type = htab_create_ggc (11, tree_map_hash, tree_map_eq,
NULL);
nonlocal_all = NULL_TREE; nonlocal_all = NULL_TREE;
} }
...@@ -5172,7 +5022,6 @@ delete_alias_heapvars (void) ...@@ -5172,7 +5022,6 @@ delete_alias_heapvars (void)
{ {
nonlocal_all = NULL_TREE; nonlocal_all = NULL_TREE;
htab_delete (heapvar_for_stmt); htab_delete (heapvar_for_stmt);
htab_delete (nonlocal_for_type);
} }
......
...@@ -2858,10 +2858,6 @@ extern void decl_restrict_base_insert (tree, tree); ...@@ -2858,10 +2858,6 @@ extern void decl_restrict_base_insert (tree, tree);
multiple translation units should be merged. */ multiple translation units should be merged. */
#define DECL_ONE_ONLY(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.one_only) #define DECL_ONE_ONLY(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.one_only)
/* Internal to points-to analysis and operand scanning. Indicates
that this DECL is an artificial points-to variable. */
#define DECL_PTA_ARTIFICIAL(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.artificial_pta_var)
struct tree_decl_with_vis GTY(()) struct tree_decl_with_vis GTY(())
{ {
struct tree_decl_with_rtl common; struct tree_decl_with_rtl common;
...@@ -2879,7 +2875,6 @@ struct tree_decl_with_vis GTY(()) ...@@ -2879,7 +2875,6 @@ struct tree_decl_with_vis GTY(())
unsigned based_on_restrict_p : 1; unsigned based_on_restrict_p : 1;
/* Used by C++. Might become a generic decl flag. */ /* Used by C++. Might become a generic decl flag. */
unsigned shadowed_for_var_p : 1; unsigned shadowed_for_var_p : 1;
unsigned artificial_pta_var : 1;
/* Don't belong to VAR_DECL exclusively. */ /* Don't belong to VAR_DECL exclusively. */
unsigned in_system_header_flag : 1; unsigned in_system_header_flag : 1;
...@@ -2894,7 +2889,7 @@ struct tree_decl_with_vis GTY(()) ...@@ -2894,7 +2889,7 @@ struct tree_decl_with_vis GTY(())
/* Belongs to VAR_DECL exclusively. */ /* Belongs to VAR_DECL exclusively. */
ENUM_BITFIELD(tls_model) tls_model : 3; ENUM_BITFIELD(tls_model) tls_model : 3;
/* 10 unused bits. */ /* 11 unused bits. */
}; };
/* In a VAR_DECL that's static, /* In a VAR_DECL that's static,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment