Commit 763baff6 by Richard Biener Committed by Richard Biener

re PR middle-end/71062 (r235622 and restrict pointers)

2016-05-12  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71062
	* tree-ssa-alias.h (struct pt_solution): Add vars_contains_restrict
	field.
	* tree-ssa-structalias.c (set_uids_in_ptset): Set vars_contains_restrict
	if the var is a restrict tag.
	* tree-ssa-alias.c (ptrs_compare_unequal): If vars_contains_restrict
	do not disambiguate pointers against it.
	(dump_points_to_solution): Re-structure and adjust for new
	vars_contains_restrict flag.
	* gimple-pretty-print.c (pp_points_to_solution): Likewise.

	* gcc.dg/torture/pr71062.c: New testcase.

From-SVN: r236174
parent cf48d8c4
2016-05-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/71062
* tree-ssa-alias.h (struct pt_solution): Add vars_contains_restrict
field.
* tree-ssa-structalias.c (set_uids_in_ptset): Set vars_contains_restrict
if the var is a restrict tag.
* tree-ssa-alias.c (ptrs_compare_unequal): If vars_contains_restrict
do not disambiguate pointers against it.
(dump_points_to_solution): Re-structure and adjust for new
vars_contains_restrict flag.
* gimple-pretty-print.c (pp_points_to_solution): Likewise.
2016-05-12 Martin Liska <mliska@suse.cz> 2016-05-12 Martin Liska <mliska@suse.cz>
* doc/invoke.texi: Explain connection between -fsanitize-recover=address * doc/invoke.texi: Explain connection between -fsanitize-recover=address
......
...@@ -632,17 +632,37 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt) ...@@ -632,17 +632,37 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt)
} }
pp_right_brace (buffer); pp_right_brace (buffer);
if (pt->vars_contains_nonlocal if (pt->vars_contains_nonlocal
&& pt->vars_contains_escaped_heap) || pt->vars_contains_escaped
pp_string (buffer, " (nonlocal, escaped heap)"); || pt->vars_contains_escaped_heap
else if (pt->vars_contains_nonlocal || pt->vars_contains_restrict)
&& pt->vars_contains_escaped) {
pp_string (buffer, " (nonlocal, escaped)"); const char *comma = "";
else if (pt->vars_contains_nonlocal) pp_string (buffer, " (");
pp_string (buffer, " (nonlocal)"); if (pt->vars_contains_nonlocal)
else if (pt->vars_contains_escaped_heap) {
pp_string (buffer, " (escaped heap)"); pp_string (buffer, "nonlocal");
else if (pt->vars_contains_escaped) comma = ", ";
pp_string (buffer, " (escaped)"); }
if (pt->vars_contains_escaped)
{
pp_string (buffer, comma);
pp_string (buffer, "escaped");
comma = ", ";
}
if (pt->vars_contains_escaped_heap)
{
pp_string (buffer, comma);
pp_string (buffer, "escaped heap");
comma = ", ";
}
if (pt->vars_contains_restrict)
{
pp_string (buffer, comma);
pp_string (buffer, "restrict");
}
pp_string (buffer, ")");
}
} }
} }
......
2016-05-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/71062
* gcc.dg/torture/pr71062.c: New testcase.
2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com> 2016-05-12 Ilya Enkovich <ilya.enkovich@intel.com>
PR tree-optimization/71006 PR tree-optimization/71006
......
/* { dg-do run } */
extern void abort (void);
char bar;
int __attribute__((noinline,noclone))
foo (char *__restrict p)
{
if (p == &bar)
return 1;
return 0;
}
int main()
{
if (foo (&bar) != 1)
abort ();
return 0;
}
...@@ -363,14 +363,17 @@ ptrs_compare_unequal (tree ptr1, tree ptr2) ...@@ -363,14 +363,17 @@ ptrs_compare_unequal (tree ptr1, tree ptr2)
else if (obj1 && TREE_CODE (ptr2) == SSA_NAME) else if (obj1 && TREE_CODE (ptr2) == SSA_NAME)
{ {
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr2); struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr2);
if (!pi) /* We may not use restrict to optimize pointer comparisons.
See PR71062. So we have to assume that restrict-pointed-to
may be in fact obj1. */
if (!pi || pi->pt.vars_contains_restrict)
return false; return false;
return !pt_solution_includes (&pi->pt, obj1); return !pt_solution_includes (&pi->pt, obj1);
} }
else if (TREE_CODE (ptr1) == SSA_NAME && obj2) else if (TREE_CODE (ptr1) == SSA_NAME && obj2)
{ {
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr1); struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr1);
if (!pi) if (!pi || pi->pt.vars_contains_restrict)
return false; return false;
return !pt_solution_includes (&pi->pt, obj2); return !pt_solution_includes (&pi->pt, obj2);
} }
...@@ -521,17 +524,31 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt) ...@@ -521,17 +524,31 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt)
fprintf (file, ", points-to vars: "); fprintf (file, ", points-to vars: ");
dump_decl_set (file, pt->vars); dump_decl_set (file, pt->vars);
if (pt->vars_contains_nonlocal if (pt->vars_contains_nonlocal
&& pt->vars_contains_escaped_heap) || pt->vars_contains_escaped
fprintf (file, " (nonlocal, escaped heap)"); || pt->vars_contains_escaped_heap
else if (pt->vars_contains_nonlocal || pt->vars_contains_restrict)
&& pt->vars_contains_escaped) {
fprintf (file, " (nonlocal, escaped)"); const char *comma = "";
else if (pt->vars_contains_nonlocal) fprintf (file, " (");
fprintf (file, " (nonlocal)"); if (pt->vars_contains_nonlocal)
else if (pt->vars_contains_escaped_heap) {
fprintf (file, " (escaped heap)"); fprintf (file, "nonlocal");
else if (pt->vars_contains_escaped) comma = ", ";
fprintf (file, " (escaped)"); }
if (pt->vars_contains_escaped)
{
fprintf (file, "%sescaped", comma);
comma = ", ";
}
if (pt->vars_contains_escaped_heap)
{
fprintf (file, "%sescaped heap", comma);
comma = ", ";
}
if (pt->vars_contains_restrict)
fprintf (file, "%srestrict", comma);
fprintf (file, ")");
}
} }
} }
......
...@@ -47,7 +47,6 @@ struct GTY(()) pt_solution ...@@ -47,7 +47,6 @@ struct GTY(()) pt_solution
includes memory at address NULL. */ includes memory at address NULL. */
unsigned int null : 1; unsigned int null : 1;
/* Nonzero if the vars bitmap includes a variable included in 'nonlocal'. */ /* Nonzero if the vars bitmap includes a variable included in 'nonlocal'. */
unsigned int vars_contains_nonlocal : 1; unsigned int vars_contains_nonlocal : 1;
/* Nonzero if the vars bitmap includes a variable included in 'escaped'. */ /* Nonzero if the vars bitmap includes a variable included in 'escaped'. */
...@@ -55,6 +54,9 @@ struct GTY(()) pt_solution ...@@ -55,6 +54,9 @@ struct GTY(()) pt_solution
/* Nonzero if the vars bitmap includes a anonymous heap variable that /* Nonzero if the vars bitmap includes a anonymous heap variable that
escaped the function and thus became global. */ escaped the function and thus became global. */
unsigned int vars_contains_escaped_heap : 1; unsigned int vars_contains_escaped_heap : 1;
/* Nonzero if the vars bitmap includes a anonymous variable used to
represent storage pointed to by a restrict qualified pointer. */
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;
......
...@@ -6254,6 +6254,9 @@ set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt, ...@@ -6254,6 +6254,9 @@ set_uids_in_ptset (bitmap into, bitmap from, struct pt_solution *pt,
pt->vars_contains_escaped_heap = vi->is_heap_var; pt->vars_contains_escaped_heap = vi->is_heap_var;
} }
if (vi->is_restrict_var)
pt->vars_contains_restrict = true;
if (TREE_CODE (vi->decl) == VAR_DECL if (TREE_CODE (vi->decl) == VAR_DECL
|| TREE_CODE (vi->decl) == PARM_DECL || TREE_CODE (vi->decl) == PARM_DECL
|| TREE_CODE (vi->decl) == RESULT_DECL) || TREE_CODE (vi->decl) == RESULT_DECL)
...@@ -7505,7 +7508,7 @@ make_pass_build_ealias (gcc::context *ctxt) ...@@ -7505,7 +7508,7 @@ make_pass_build_ealias (gcc::context *ctxt)
/* 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, false, NULL }; = { true, false, false, false, false, false, false, false, false, NULL };
/* Associate node with varinfo DATA. Worker for /* Associate node with varinfo DATA. Worker for
cgraph_for_symbol_thunks_and_aliases. */ cgraph_for_symbol_thunks_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