Handle single restrict pointer in struct in create_variable_info_for_1
authorTom de Vries <tom@codesourcery.com>
Tue, 22 Sep 2015 08:15:32 +0000 (08:15 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Tue, 22 Sep 2015 08:15:32 +0000 (08:15 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr67666.C [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 8ffb990dd28ac9badf166fcd0ee1c405ec477de5..3dd8a1d6d8a68792a18924b46537fbaa90083b3d 100644 (file)
@@ -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
index 8e642a852a9f6f4baf60f0feaa5f0b9c7f426b64..0f5d39c3586bbe3f8150f8469ade01dff62ba49a 100644 (file)
@@ -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 (file)
index 0000000..ad162f4
--- /dev/null
@@ -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" } }
index cf2b2f45de53062c72a76bdb28273205d0a3f40f..66772cdfd5f38857a31e26d95a62b0eafe025878 100644 (file)
@@ -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;