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
This commit is contained in:
parent
cf48d8c4dc
commit
763baff6f5
7 changed files with 106 additions and 26 deletions
|
@ -1,3 +1,16 @@
|
|||
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>
|
||||
|
||||
* doc/invoke.texi: Explain connection between -fsanitize-recover=address
|
||||
|
|
|
@ -632,17 +632,37 @@ pp_points_to_solution (pretty_printer *buffer, struct pt_solution *pt)
|
|||
}
|
||||
pp_right_brace (buffer);
|
||||
if (pt->vars_contains_nonlocal
|
||||
&& pt->vars_contains_escaped_heap)
|
||||
pp_string (buffer, " (nonlocal, escaped heap)");
|
||||
else if (pt->vars_contains_nonlocal
|
||||
&& pt->vars_contains_escaped)
|
||||
pp_string (buffer, " (nonlocal, escaped)");
|
||||
else if (pt->vars_contains_nonlocal)
|
||||
pp_string (buffer, " (nonlocal)");
|
||||
else if (pt->vars_contains_escaped_heap)
|
||||
pp_string (buffer, " (escaped heap)");
|
||||
else if (pt->vars_contains_escaped)
|
||||
pp_string (buffer, " (escaped)");
|
||||
|| pt->vars_contains_escaped
|
||||
|| pt->vars_contains_escaped_heap
|
||||
|| pt->vars_contains_restrict)
|
||||
{
|
||||
const char *comma = "";
|
||||
pp_string (buffer, " (");
|
||||
if (pt->vars_contains_nonlocal)
|
||||
{
|
||||
pp_string (buffer, "nonlocal");
|
||||
comma = ", ";
|
||||
}
|
||||
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, ")");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
PR tree-optimization/71006
|
||||
|
|
20
gcc/testsuite/gcc.dg/torture/pr71062.c
Normal file
20
gcc/testsuite/gcc.dg/torture/pr71062.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* { 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)
|
|||
else if (obj1 && TREE_CODE (ptr2) == SSA_NAME)
|
||||
{
|
||||
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 !pt_solution_includes (&pi->pt, obj1);
|
||||
}
|
||||
else if (TREE_CODE (ptr1) == SSA_NAME && obj2)
|
||||
{
|
||||
struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr1);
|
||||
if (!pi)
|
||||
if (!pi || pi->pt.vars_contains_restrict)
|
||||
return false;
|
||||
return !pt_solution_includes (&pi->pt, obj2);
|
||||
}
|
||||
|
@ -521,17 +524,31 @@ dump_points_to_solution (FILE *file, struct pt_solution *pt)
|
|||
fprintf (file, ", points-to vars: ");
|
||||
dump_decl_set (file, pt->vars);
|
||||
if (pt->vars_contains_nonlocal
|
||||
&& pt->vars_contains_escaped_heap)
|
||||
fprintf (file, " (nonlocal, escaped heap)");
|
||||
else if (pt->vars_contains_nonlocal
|
||||
&& pt->vars_contains_escaped)
|
||||
fprintf (file, " (nonlocal, escaped)");
|
||||
else if (pt->vars_contains_nonlocal)
|
||||
fprintf (file, " (nonlocal)");
|
||||
else if (pt->vars_contains_escaped_heap)
|
||||
fprintf (file, " (escaped heap)");
|
||||
else if (pt->vars_contains_escaped)
|
||||
fprintf (file, " (escaped)");
|
||||
|| pt->vars_contains_escaped
|
||||
|| pt->vars_contains_escaped_heap
|
||||
|| pt->vars_contains_restrict)
|
||||
{
|
||||
const char *comma = "";
|
||||
fprintf (file, " (");
|
||||
if (pt->vars_contains_nonlocal)
|
||||
{
|
||||
fprintf (file, "nonlocal");
|
||||
comma = ", ";
|
||||
}
|
||||
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
|
|||
includes memory at address NULL. */
|
||||
unsigned int null : 1;
|
||||
|
||||
|
||||
/* Nonzero if the vars bitmap includes a variable included in 'nonlocal'. */
|
||||
unsigned int vars_contains_nonlocal : 1;
|
||||
/* Nonzero if the vars bitmap includes a variable included in 'escaped'. */
|
||||
|
@ -55,6 +54,9 @@ struct GTY(()) pt_solution
|
|||
/* Nonzero if the vars bitmap includes a anonymous heap variable that
|
||||
escaped the function and thus became global. */
|
||||
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. */
|
||||
bitmap vars;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
if (vi->is_restrict_var)
|
||||
pt->vars_contains_restrict = true;
|
||||
|
||||
if (TREE_CODE (vi->decl) == VAR_DECL
|
||||
|| TREE_CODE (vi->decl) == PARM_DECL
|
||||
|| TREE_CODE (vi->decl) == RESULT_DECL)
|
||||
|
@ -7505,7 +7508,7 @@ make_pass_build_ealias (gcc::context *ctxt)
|
|||
|
||||
/* IPA PTA solutions for ESCAPED. */
|
||||
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
|
||||
cgraph_for_symbol_thunks_and_aliases. */
|
||||
|
|
Loading…
Add table
Reference in a new issue