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
This commit is contained in:
Daniel Berlin 2006-10-21 02:38:30 +00:00 committed by Daniel Berlin
parent 552f68f8fb
commit b23987ec2f
8 changed files with 46 additions and 173 deletions

View File

@ -1,3 +1,25 @@
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>
* doc/install.texi (Downloading GCC): Clarify mention of

View File

@ -14,5 +14,5 @@ main(void)
}
/* 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" } } */

View File

@ -17,5 +17,5 @@ void bar (void)
malloc functions may clobber global memory. Only the function result
does not alias any other pointer.
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" } } */

View File

@ -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.
Return true if it required insertion. */
static bool
bool
referenced_var_check_and_insert (tree to)
{
struct int_tree_map *h, in;

View File

@ -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 tree referenced_var_lookup (unsigned int);
extern bool referenced_var_check_and_insert (tree);
#define num_referenced_vars htab_elements (referenced_vars)
#define referenced_var(i) referenced_var_lookup (i)
@ -437,6 +438,10 @@ extern GTY(()) VEC(tree,gc) *ssa_names;
/* Artificial variable used to model the effects of function calls. */
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
REFERENCED_VARS (I) is call-clobbered. */
extern bitmap call_clobbered_vars;

View File

@ -1053,7 +1053,9 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
if (alias == global_var)
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;
/* If ALIAS is an SFT, it can't be touched if the offset

View File

@ -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)))
htab_t heapvar_for_stmt;
/* Represents nonlocals. */
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;
/* One variable to represent all non-local accesses. */
tree nonlocal_all;
static bool use_field_sensitive = true;
static int in_ipa_mode = 0;
@ -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
alias. */
@ -2561,61 +2521,10 @@ create_nonlocal_var (tree type)
if (referenced_vars)
add_referenced_var (nonlocal);
DECL_PTA_ARTIFICIAL (nonlocal) = 1;
DECL_EXTERNAL (nonlocal) = 1;
nonlocal_insert (type, 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. */
static void
@ -2756,7 +2665,6 @@ get_constraint_for (tree t, VEC (ce_s, heap) **results)
return;
}
break;
default:
{
temp.type = ADDRESSOF;
@ -4116,7 +4024,12 @@ find_global_initializers (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
case VAR_DECL:
/* We might not have walked this because we skip
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;
default:
break;
@ -4336,8 +4249,8 @@ intra_create_variable_infos (void)
{
tree t;
struct constraint_expr lhs, rhs;
tree nonlocal;
varinfo_t nonlocal_vi;
/* For each incoming pointer argument arg, ARG = ESCAPED_VARS or a
dummy variable if flag_argument_noalias > 2. */
for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t))
@ -4393,14 +4306,12 @@ intra_create_variable_infos (void)
make_constraint_from_escaped (p);
}
}
nonlocal = create_tmp_var_raw (void_type_node, "NONLOCAL_ALL");
DECL_EXTERNAL (nonlocal) = 1;
nonlocal_all = create_nonlocal_var (void_type_node);
/* Create variable info for the nonlocal var if it does not
exist. */
nonlocal_vars_id = create_variable_info_for (nonlocal,
get_name (nonlocal));
nonlocal_vars_id = create_variable_info_for (nonlocal_all,
get_name (nonlocal_all));
nonlocal_vi = get_varinfo (nonlocal_vars_id);
nonlocal_vi->is_artificial_var = 1;
nonlocal_vi->is_heap_var = 1;
@ -4860,61 +4771,6 @@ find_escape_constraints (tree stmt)
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
at the start of the file for an algorithmic overview. */
@ -4983,8 +4839,6 @@ compute_points_to_sets (struct alias_info *ai)
solve_graph (graph);
expand_nonlocal_solutions ();
if (dump_file)
dump_sa_points_to_info (dump_file);
@ -5129,8 +4983,6 @@ ipa_pta_execute (void)
solve_graph (graph);
expand_nonlocal_solutions ();
if (dump_file)
dump_sa_points_to_info (dump_file);
in_ipa_mode = 0;
@ -5162,8 +5014,6 @@ init_alias_heapvars (void)
{
heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq,
NULL);
nonlocal_for_type = htab_create_ggc (11, tree_map_hash, tree_map_eq,
NULL);
nonlocal_all = NULL_TREE;
}
@ -5172,7 +5022,6 @@ delete_alias_heapvars (void)
{
nonlocal_all = NULL_TREE;
htab_delete (heapvar_for_stmt);
htab_delete (nonlocal_for_type);
}

View File

@ -2858,10 +2858,6 @@ extern void decl_restrict_base_insert (tree, tree);
multiple translation units should be merged. */
#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_rtl common;
@ -2879,7 +2875,6 @@ struct tree_decl_with_vis GTY(())
unsigned based_on_restrict_p : 1;
/* Used by C++. Might become a generic decl flag. */
unsigned shadowed_for_var_p : 1;
unsigned artificial_pta_var : 1;
/* Don't belong to VAR_DECL exclusively. */
unsigned in_system_header_flag : 1;
@ -2894,7 +2889,7 @@ struct tree_decl_with_vis GTY(())
/* Belongs to VAR_DECL exclusively. */
ENUM_BITFIELD(tls_model) tls_model : 3;
/* 10 unused bits. */
/* 11 unused bits. */
};
/* In a VAR_DECL that's static,