diff options
author | Richard Biener <rguenther@suse.de> | 2016-05-12 13:05:13 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-05-12 13:05:13 +0000 |
commit | 763baff6f54ec6070e0ec6497363f5116ab4c874 (patch) | |
tree | 84e63fa7e081279f7a68aca414b7f88e4487c667 /gcc/tree-ssa-alias.c | |
parent | cf48d8c4dc0556d165cd369eb5fa4d77fe823e59 (diff) | |
download | gcc-763baff6f54ec6070e0ec6497363f5116ab4c874.zip gcc-763baff6f54ec6070e0ec6497363f5116ab4c874.tar.gz gcc-763baff6f54ec6070e0ec6497363f5116ab4c874.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r-- | gcc/tree-ssa-alias.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 58920e0..b663ddf 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -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, ")"); + } } } |