Commit d3553615 by Richard Guenther Committed by Richard Biener

tree-ssa-alias.h (struct pt_solution): Remove vars_contains_restrict member.

2011-10-18  Richard Guenther  <rguenther@suse.de>

	* tree-ssa-alias.h (struct pt_solution): Remove
	vars_contains_restrict member.
	(pt_solutions_same_restrict_base): Remove.
	(pt_solution_set): Adjust.
	* tree-ssa-alias.c (ptr_deref_may_alias_decl_p): Remove
	vars_contains_restrict handling.
	(dump_points_to_solution): Likewise.
	(ptr_derefs_may_alias_p): Do not call pt_solutions_same_restrict_base.
	* tree-ssa-structalias.c (struct variable_info): Remove is_restrict_var
	field.
	(new_var_info): Do not initialize it.
	(ipa_escaped_pt): Adjust.
	(make_constraint_from_restrict): Make the tag global.
	(make_constraint_from_global_restrict): New function.
	(make_constraint_from_heapvar): Remove.
	(create_variable_info_for): Do not make restrict vars point
	to NONLOCAL.
	(intra_create_variable_infos): Likewise.
	(find_what_var_points_to): Remove vars_contains_restrict handling.
	(pt_solution_set): Adjust.
	(pt_solution_ior_into): Likewise.
	(pt_solutions_same_restrict_base): Remove.
	(compute_points_to_sets): Do not test is_restrict_var.
	* cfgexpand.c (update_alias_info_with_stack_vars): Adjust.
	* gimple-pretty-print.c (pp_points_to_solution): Likewise.

	* gcc.dg/torture/restrict-1.c: New testcase.

From-SVN: r180127
parent 266fbb79
2011-10-18 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.h (struct pt_solution): Remove
vars_contains_restrict member.
(pt_solutions_same_restrict_base): Remove.
(pt_solution_set): Adjust.
* tree-ssa-alias.c (ptr_deref_may_alias_decl_p): Remove
vars_contains_restrict handling.
(dump_points_to_solution): Likewise.
(ptr_derefs_may_alias_p): Do not call pt_solutions_same_restrict_base.
* tree-ssa-structalias.c (struct variable_info): Remove is_restrict_var
field.
(new_var_info): Do not initialize it.
(ipa_escaped_pt): Adjust.
(make_constraint_from_restrict): Make the tag global.
(make_constraint_from_global_restrict): New function.
(make_constraint_from_heapvar): Remove.
(create_variable_info_for): Do not make restrict vars point
to NONLOCAL.
(intra_create_variable_infos): Likewise.
(find_what_var_points_to): Remove vars_contains_restrict handling.
(pt_solution_set): Adjust.
(pt_solution_ior_into): Likewise.
(pt_solutions_same_restrict_base): Remove.
(compute_points_to_sets): Do not test is_restrict_var.
* cfgexpand.c (update_alias_info_with_stack_vars): Adjust.
* gimple-pretty-print.c (pp_points_to_solution): Likewise.
2011-10-18 Tom de Vries <tom@codesourcery.com> 2011-10-18 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/50672 PR tree-optimization/50672
...@@ -530,7 +530,7 @@ update_alias_info_with_stack_vars (void) ...@@ -530,7 +530,7 @@ update_alias_info_with_stack_vars (void)
/* Make the SSA name point to all partition members. */ /* Make the SSA name point to all partition members. */
pi = get_ptr_info (name); pi = get_ptr_info (name);
pt_solution_set (&pi->pt, part, false, false); pt_solution_set (&pi->pt, part, false);
} }
/* Make all points-to sets that contain one member of a partition /* Make all points-to sets that contain one member of a partition
......
...@@ -610,8 +610,6 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt) ...@@ -610,8 +610,6 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt)
pp_character (buffer, '}'); pp_character (buffer, '}');
if (pt->vars_contains_global) if (pt->vars_contains_global)
pp_string (buffer, " (glob)"); pp_string (buffer, " (glob)");
if (pt->vars_contains_restrict)
pp_string (buffer, " (restr)");
} }
} }
......
2011-10-18 Richard Guenther <rguenther@suse.de>
* gcc.dg/torture/restrict-1.c: New testcase.
2011-10-17 Michael Spertus <mike_spertus@symantec.com> 2011-10-17 Michael Spertus <mike_spertus@symantec.com>
* g++.dg/ext/bases.C: New test. * g++.dg/ext/bases.C: New test.
......
/* { dg-do run } */
extern void abort (void);
void __attribute__((noinline,noclone))
foo (int ** __restrict__ p, int ** __restrict__ q)
{
**p = **q;
}
int main()
{
int x = 0, y = 1, *i = &x, *j = &y;
foo (&i, &j);
if (x != 1)
abort ();
return 0;
}
...@@ -219,13 +219,6 @@ ptr_deref_may_alias_decl_p (tree ptr, tree decl) ...@@ -219,13 +219,6 @@ ptr_deref_may_alias_decl_p (tree ptr, tree decl)
if (!pi) if (!pi)
return true; return true;
/* If the decl can be used as a restrict tag and we have a restrict
pointer and that pointers points-to set doesn't contain this decl
then they can't alias. */
if (DECL_RESTRICTED_P (decl)
&& pi->pt.vars_contains_restrict)
return bitmap_bit_p (pi->pt.vars, DECL_PT_UID (decl));
return pt_solution_includes (&pi->pt, decl); return pt_solution_includes (&pi->pt, decl);
} }
...@@ -316,11 +309,6 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2) ...@@ -316,11 +309,6 @@ ptr_derefs_may_alias_p (tree ptr1, tree ptr2)
if (!pi1 || !pi2) if (!pi1 || !pi2)
return true; return true;
/* If both pointers are restrict-qualified try to disambiguate
with restrict information. */
if (!pt_solutions_same_restrict_base (&pi1->pt, &pi2->pt))
return false;
/* ??? This does not use TBAA to prune decls from the intersection /* ??? This does not use TBAA to prune decls from the intersection
that not both pointers may access. */ that not both pointers may access. */
return pt_solutions_intersect (&pi1->pt, &pi2->pt); return pt_solutions_intersect (&pi1->pt, &pi2->pt);
...@@ -426,8 +414,6 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt) ...@@ -426,8 +414,6 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt)
dump_decl_set (file, pt->vars); dump_decl_set (file, pt->vars);
if (pt->vars_contains_global) if (pt->vars_contains_global)
fprintf (file, " (includes global vars)"); fprintf (file, " (includes global vars)");
if (pt->vars_contains_restrict)
fprintf (file, " (includes restrict tags)");
} }
} }
......
...@@ -54,8 +54,6 @@ struct GTY(()) pt_solution ...@@ -54,8 +54,6 @@ struct GTY(()) pt_solution
/* Nonzero if the pt_vars bitmap includes a global variable. */ /* Nonzero if the pt_vars bitmap includes a global variable. */
unsigned int vars_contains_global : 1; unsigned int vars_contains_global : 1;
/* Nonzero if the pt_vars bitmap includes a restrict tag variable. */
unsigned int vars_contains_restrict : 1;
/* Set of variables that this pointer may point to. */ /* Set of variables that this pointer may point to. */
bitmap vars; bitmap vars;
...@@ -130,10 +128,8 @@ extern bool pt_solution_singleton_p (struct pt_solution *, unsigned *); ...@@ -130,10 +128,8 @@ extern bool pt_solution_singleton_p (struct pt_solution *, unsigned *);
extern bool pt_solution_includes_global (struct pt_solution *); extern bool pt_solution_includes_global (struct pt_solution *);
extern bool pt_solution_includes (struct pt_solution *, const_tree); extern bool pt_solution_includes (struct pt_solution *, const_tree);
extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *); extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *);
extern bool pt_solutions_same_restrict_base (struct pt_solution *,
struct pt_solution *);
extern void pt_solution_reset (struct pt_solution *); extern void pt_solution_reset (struct pt_solution *);
extern void pt_solution_set (struct pt_solution *, bitmap, bool, bool); extern void pt_solution_set (struct pt_solution *, bitmap, bool);
extern void pt_solution_set_var (struct pt_solution *, tree); extern void pt_solution_set_var (struct pt_solution *, tree);
extern void dump_pta_stats (FILE *); extern void dump_pta_stats (FILE *);
......
...@@ -261,9 +261,6 @@ struct variable_info ...@@ -261,9 +261,6 @@ struct variable_info
/* True if this is a heap variable. */ /* True if this is a heap variable. */
unsigned int is_heap_var : 1; unsigned int is_heap_var : 1;
/* True if this is a variable tracking a restrict pointer source. */
unsigned int is_restrict_var : 1;
/* True if this field may contain pointers. */ /* True if this field may contain pointers. */
unsigned int may_have_pointers : 1; unsigned int may_have_pointers : 1;
...@@ -350,7 +347,6 @@ new_var_info (tree t, const char *name) ...@@ -350,7 +347,6 @@ new_var_info (tree t, const char *name)
ret->is_unknown_size_var = false; ret->is_unknown_size_var = false;
ret->is_full_var = (t == NULL_TREE); ret->is_full_var = (t == NULL_TREE);
ret->is_heap_var = false; ret->is_heap_var = false;
ret->is_restrict_var = false;
ret->may_have_pointers = true; ret->may_have_pointers = true;
ret->only_restrict_pointers = false; ret->only_restrict_pointers = false;
ret->is_global_var = (t == NULL_TREE); ret->is_global_var = (t == NULL_TREE);
...@@ -3643,30 +3639,30 @@ make_heapvar (const char *name) ...@@ -3643,30 +3639,30 @@ make_heapvar (const char *name)
} }
/* Create a new artificial heap variable with NAME and make a /* Create a new artificial heap variable with NAME and make a
constraint from it to LHS. Return the created variable. */ constraint from it to LHS. Set flags according to a tag used
for tracking restrict pointers. */
static varinfo_t static varinfo_t
make_constraint_from_heapvar (varinfo_t lhs, const char *name) make_constraint_from_restrict (varinfo_t lhs, const char *name)
{ {
varinfo_t vi = make_heapvar (name); varinfo_t vi = make_heapvar (name);
vi->is_global_var = 1;
vi->may_have_pointers = 1;
make_constraint_from (lhs, vi->id); make_constraint_from (lhs, vi->id);
return vi; return vi;
} }
/* Create a new artificial heap variable with NAME and make a /* Create a new artificial heap variable with NAME and make a
constraint from it to LHS. Set flags according to a tag used constraint from it to LHS. Set flags according to a tag used
for tracking restrict pointers. */ for tracking restrict pointers and make the artificial heap
point to global memory. */
static void static varinfo_t
make_constraint_from_restrict (varinfo_t lhs, const char *name) make_constraint_from_global_restrict (varinfo_t lhs, const char *name)
{ {
varinfo_t vi; varinfo_t vi = make_constraint_from_restrict (lhs, name);
vi = make_constraint_from_heapvar (lhs, name); make_copy_constraint (vi, nonlocal_id);
vi->is_restrict_var = 1; return vi;
vi->is_global_var = 0;
vi->is_special_var = 1;
vi->may_have_pointers = 0;
} }
/* In IPA mode there are varinfos for different aspects of reach /* In IPA mode there are varinfos for different aspects of reach
...@@ -5504,13 +5500,18 @@ create_variable_info_for (tree decl, const char *name) ...@@ -5504,13 +5500,18 @@ create_variable_info_for (tree decl, const char *name)
if ((POINTER_TYPE_P (TREE_TYPE (decl)) if ((POINTER_TYPE_P (TREE_TYPE (decl))
&& TYPE_RESTRICT (TREE_TYPE (decl))) && TYPE_RESTRICT (TREE_TYPE (decl)))
|| vi->only_restrict_pointers) || vi->only_restrict_pointers)
make_constraint_from_restrict (vi, "GLOBAL_RESTRICT"); {
make_constraint_from_global_restrict (vi, "GLOBAL_RESTRICT");
continue;
}
/* In non-IPA mode the initializer from nonlocal is all we need. */ /* In non-IPA mode the initializer from nonlocal is all we need. */
if (!in_ipa_mode if (!in_ipa_mode
|| DECL_HARD_REGISTER (decl)) || DECL_HARD_REGISTER (decl))
make_copy_constraint (vi, nonlocal_id); make_copy_constraint (vi, nonlocal_id);
/* In IPA mode parse the initializer and generate proper constraints
for it. */
else else
{ {
struct varpool_node *vnode = varpool_get_node (decl); struct varpool_node *vnode = varpool_get_node (decl);
...@@ -5595,7 +5596,7 @@ intra_create_variable_infos (void) ...@@ -5595,7 +5596,7 @@ intra_create_variable_infos (void)
passed-by-reference argument. */ passed-by-reference argument. */
for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t)) for (t = DECL_ARGUMENTS (current_function_decl); t; t = DECL_CHAIN (t))
{ {
varinfo_t p; varinfo_t p = get_vi_for_tree (t);
/* For restrict qualified pointers to objects passed by /* For restrict qualified pointers to objects passed by
reference build a real representative for the pointed-to object. reference build a real representative for the pointed-to object.
...@@ -5610,34 +5611,37 @@ intra_create_variable_infos (void) ...@@ -5610,34 +5611,37 @@ intra_create_variable_infos (void)
DECL_EXTERNAL (heapvar) = 1; DECL_EXTERNAL (heapvar) = 1;
vi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS"); vi = create_variable_info_for_1 (heapvar, "PARM_NOALIAS");
insert_vi_for_tree (heapvar, vi); insert_vi_for_tree (heapvar, vi);
lhsc.var = get_vi_for_tree (t)->id; lhsc.var = p->id;
lhsc.type = SCALAR; lhsc.type = SCALAR;
lhsc.offset = 0; lhsc.offset = 0;
rhsc.var = vi->id; rhsc.var = vi->id;
rhsc.type = ADDRESSOF; rhsc.type = ADDRESSOF;
rhsc.offset = 0; rhsc.offset = 0;
process_constraint (new_constraint (lhsc, rhsc)); process_constraint (new_constraint (lhsc, rhsc));
vi->is_restrict_var = 1;
for (; vi; vi = vi->next) for (; vi; vi = vi->next)
if (vi->may_have_pointers) if (vi->may_have_pointers)
{ {
if (vi->only_restrict_pointers) if (vi->only_restrict_pointers)
make_constraint_from_restrict (vi, "GLOBAL_RESTRICT"); make_constraint_from_global_restrict (vi, "GLOBAL_RESTRICT");
make_copy_constraint (vi, nonlocal_id); else
make_copy_constraint (vi, nonlocal_id);
} }
continue; continue;
} }
for (p = get_vi_for_tree (t); p; p = p->next)
{
if (p->may_have_pointers)
make_constraint_from (p, nonlocal_id);
if (p->only_restrict_pointers)
make_constraint_from_restrict (p, "PARM_RESTRICT");
}
if (POINTER_TYPE_P (TREE_TYPE (t)) if (POINTER_TYPE_P (TREE_TYPE (t))
&& TYPE_RESTRICT (TREE_TYPE (t))) && TYPE_RESTRICT (TREE_TYPE (t)))
make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT"); make_constraint_from_global_restrict (p, "PARM_RESTRICT");
else
{
for (; p; p = p->next)
{
if (p->only_restrict_pointers)
make_constraint_from_global_restrict (p, "PARM_RESTRICT");
else if (p->may_have_pointers)
make_constraint_from (p, nonlocal_id);
}
}
} }
/* Add a constraint for a result decl that is passed by reference. */ /* Add a constraint for a result decl that is passed by reference. */
...@@ -5813,15 +5817,11 @@ find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt) ...@@ -5813,15 +5817,11 @@ find_what_var_points_to (varinfo_t orig_vi, struct pt_solution *pt)
|| vi->id == integer_id) || vi->id == integer_id)
pt->anything = 1; pt->anything = 1;
} }
if (vi->is_restrict_var)
pt->vars_contains_restrict = true;
} }
/* Instead of doing extra work, simply do not create /* Instead of doing extra work, simply do not create
elaborate points-to information for pt_anything pointers. */ elaborate points-to information for pt_anything pointers. */
if (pt->anything if (pt->anything)
&& (orig_vi->is_artificial_var
|| !pt->vars_contains_restrict))
return; return;
/* Share the final set of variables when possible. */ /* Share the final set of variables when possible. */
...@@ -5912,13 +5912,11 @@ pt_solution_reset (struct pt_solution *pt) ...@@ -5912,13 +5912,11 @@ pt_solution_reset (struct pt_solution *pt)
it contains restrict tag variables. */ it contains restrict tag variables. */
void void
pt_solution_set (struct pt_solution *pt, bitmap vars, pt_solution_set (struct pt_solution *pt, bitmap vars, bool vars_contains_global)
bool vars_contains_global, bool vars_contains_restrict)
{ {
memset (pt, 0, sizeof (struct pt_solution)); memset (pt, 0, sizeof (struct pt_solution));
pt->vars = vars; pt->vars = vars;
pt->vars_contains_global = vars_contains_global; pt->vars_contains_global = vars_contains_global;
pt->vars_contains_restrict = vars_contains_restrict;
} }
/* Set the points-to solution *PT to point only to the variable VAR. */ /* Set the points-to solution *PT to point only to the variable VAR. */
...@@ -5953,7 +5951,6 @@ pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src) ...@@ -5953,7 +5951,6 @@ pt_solution_ior_into (struct pt_solution *dest, struct pt_solution *src)
dest->ipa_escaped |= src->ipa_escaped; dest->ipa_escaped |= src->ipa_escaped;
dest->null |= src->null; dest->null |= src->null;
dest->vars_contains_global |= src->vars_contains_global; dest->vars_contains_global |= src->vars_contains_global;
dest->vars_contains_restrict |= src->vars_contains_restrict;
if (!src->vars) if (!src->vars)
return; return;
...@@ -6141,27 +6138,6 @@ pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2) ...@@ -6141,27 +6138,6 @@ pt_solutions_intersect (struct pt_solution *pt1, struct pt_solution *pt2)
return res; return res;
} }
/* Return true if both points-to solutions PT1 and PT2 for two restrict
qualified pointers are possibly based on the same pointer. */
bool
pt_solutions_same_restrict_base (struct pt_solution *pt1,
struct pt_solution *pt2)
{
/* If we deal with points-to solutions of two restrict qualified
pointers solely rely on the pointed-to variable bitmap intersection.
For two pointers that are based on each other the bitmaps will
intersect. */
if (pt1->vars_contains_restrict
&& pt2->vars_contains_restrict)
{
gcc_assert (pt1->vars && pt2->vars);
return bitmap_intersect_p (pt1->vars, pt2->vars);
}
return true;
}
/* Dump points-to information to OUTFILE. */ /* Dump points-to information to OUTFILE. */
...@@ -6574,7 +6550,6 @@ compute_points_to_sets (void) ...@@ -6574,7 +6550,6 @@ compute_points_to_sets (void)
/* Mark escaped HEAP variables as global. */ /* Mark escaped HEAP variables as global. */
FOR_EACH_VEC_ELT (varinfo_t, varmap, i, vi) FOR_EACH_VEC_ELT (varinfo_t, varmap, i, vi)
if (vi->is_heap_var if (vi->is_heap_var
&& !vi->is_restrict_var
&& !vi->is_global_var) && !vi->is_global_var)
DECL_EXTERNAL (vi->decl) = vi->is_global_var DECL_EXTERNAL (vi->decl) = vi->is_global_var
= pt_solution_includes (&cfun->gimple_df->escaped, vi->decl); = pt_solution_includes (&cfun->gimple_df->escaped, vi->decl);
...@@ -6794,7 +6769,7 @@ gate_ipa_pta (void) ...@@ -6794,7 +6769,7 @@ gate_ipa_pta (void)
/* IPA PTA solutions for ESCAPED. */ /* IPA PTA solutions for ESCAPED. */
struct pt_solution ipa_escaped_pt struct pt_solution ipa_escaped_pt
= { true, false, false, false, false, false, false, NULL }; = { true, false, false, false, false, false, NULL };
/* Associate node with varinfo DATA. Worker for /* Associate node with varinfo DATA. Worker for
cgraph_for_node_and_aliases. */ cgraph_for_node_and_aliases. */
......
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