aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-09-22 08:15:32 +0000
committerTom de Vries <vries@gcc.gnu.org>2015-09-22 08:15:32 +0000
commit50b4b446bb3894b6b8a830554009bd9cbdb8009a (patch)
tree2f80601647400b0089de32d9372be9b6f3038dc4
parent6bb4c3e2d8a978c590c01df7807c4e0819b33b85 (diff)
downloadgcc-50b4b446bb3894b6b8a830554009bd9cbdb8009a.zip
gcc-50b4b446bb3894b6b8a830554009bd9cbdb8009a.tar.gz
gcc-50b4b446bb3894b6b8a830554009bd9cbdb8009a.tar.bz2
Handle single restrict pointer in struct in create_variable_info_for_1
2015-09-22 Tom de Vries <tom@codesourcery.com> PR tree-optimization/67666 * tree-ssa-structalias.c (create_variable_info_for_1): Handle struct with single field non-conservative. * g++.dg/pr67666.C: New test. From-SVN: r227996
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr67666.C17
-rw-r--r--gcc/tree-ssa-structalias.c25
4 files changed, 44 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ffb990..3dd8a1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-09-22 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/67666
+ * tree-ssa-structalias.c (create_variable_info_for_1): Handle struct
+ with single field non-conservative.
+
2015-09-21 David S. Miller <davem@davemloft.net>
PR/67622
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8e642a8..0f5d39c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-09-22 Tom de Vries <tom@codesourcery.com>
+
+ PR tree-optimization/67666
+ * g++.dg/pr67666.C: New test.
+
2015-09-21 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67615
diff --git a/gcc/testsuite/g++.dg/pr67666.C b/gcc/testsuite/g++.dg/pr67666.C
new file mode 100644
index 0000000..ad162f4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr67666.C
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-ealias-all" }
+
+struct ps
+{
+ int *__restrict__ p;
+};
+
+void
+f (struct ps &__restrict__ ps1)
+{
+ *(ps1.p) = 1;
+}
+
+// { dg-final { scan-tree-dump-times "clique 1 base 1" 1 "ealias" } }
+// { dg-final { scan-tree-dump-times "clique 1 base 2" 1 "ealias" } }
+// { dg-final { scan-tree-dump-times "(?n)clique .* base .*" 2 "ealias" } }
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index cf2b2f4..66772cd 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -5675,7 +5675,7 @@ create_variable_info_for_1 (tree decl, const char *name)
/* If we didn't end up collecting sub-variables create a full
variable for the decl. */
- if (fieldstack.length () <= 1
+ if (fieldstack.length () == 0
|| fieldstack.length () > MAX_FIELDS_FOR_FIELD_SENSITIVE)
{
vi = new_var_info (decl, name);
@@ -5694,19 +5694,26 @@ create_variable_info_for_1 (tree decl, const char *name)
fieldstack.iterate (i, &fo);
++i, newvi = vi_next (newvi))
{
- const char *newname = "NULL";
+ const char *newname = NULL;
char *tempname;
if (dump_file)
{
- tempname
- = xasprintf ("%s." HOST_WIDE_INT_PRINT_DEC
- "+" HOST_WIDE_INT_PRINT_DEC, name,
- fo->offset, fo->size);
- newname = ggc_strdup (tempname);
- free (tempname);
+ if (fieldstack.length () != 1)
+ {
+ tempname
+ = xasprintf ("%s." HOST_WIDE_INT_PRINT_DEC
+ "+" HOST_WIDE_INT_PRINT_DEC, name,
+ fo->offset, fo->size);
+ newname = ggc_strdup (tempname);
+ free (tempname);
+ }
}
- newvi->name = newname;
+ else
+ newname = "NULL";
+
+ if (newname)
+ newvi->name = newname;
newvi->offset = fo->offset;
newvi->size = fo->size;
newvi->fullsize = vi->fullsize;