re PR tree-optimization/79824 (Failure to peel for gaps leads to read beyond mapped...
authorRichard Biener <rguenther@suse.de>
Mon, 6 Mar 2017 13:58:01 +0000 (13:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 6 Mar 2017 13:58:01 +0000 (13:58 +0000)
2017-03-06  Richard Biener  <rguenther@suse.de>

PR tree-optimization/79824
* tree-vect-stmts.c (get_group_load_store_type): Fix alignment
check disabling peeling for gaps.

* gcc.dg/vect/pr79824-1.c: New testcase.
* gcc.dg/vect/pr79824-2.c: Likewise.

From-SVN: r245922

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr79824-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr79824-2.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index be8b6d9b673df5b6de48d42f28a219e560283705..7c732a1dc77236c88074746de07153b4a994ad06 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-06  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/79824
+       * tree-vect-stmts.c (get_group_load_store_type): Fix alignment
+       check disabling peeling for gaps.
+
 2017-03-06  Toma Tabacu  <toma.tabacu@imgtec.com>
 
        * doc/sourcebuild.texi (Effective-Target Keywords, Environment
index f90154a6fa69a996a08a729a2319f434e08d85a6..51432932bfedb50c65c3bca82fa5020c363ad3de 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-06  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/79824
+       * gcc.dg/vect/pr79824-1.c: New testcase.
+       * gcc.dg/vect/pr79824-2.c: Likewise.
+
 2017-03-06  Toma Tabacu  <toma.tabacu@imgtec.com>
 
        * gcc.dg/lto/pr60449_0.c: Add dg-require-effective-target for
diff --git a/gcc/testsuite/gcc.dg/vect/pr79824-1.c b/gcc/testsuite/gcc.dg/vect/pr79824-1.c
new file mode 100644 (file)
index 0000000..e6b887b
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-require-effective-target mmap } */
+
+#include <sys/mman.h>
+#include <stdio.h>
+#include "tree-vect.h"
+
+#define COUNT 320
+#define MMAP_SIZE 0x10000
+#define ADDRESS 0x1122000000
+#define TYPE double
+
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+void __attribute__((noinline))
+foo (TYPE *__restrict a, TYPE *__restrict b)
+{
+  int n;
+
+  b = __builtin_assume_aligned (b, sizeof (TYPE) * 2);
+  a = __builtin_assume_aligned (a, sizeof (TYPE) * 2);
+  for (n = 0; n < COUNT; n++)
+    a[n] = b[n * 4];
+}
+
+int
+main (void)
+{
+  void *x;
+  size_t b_offset;
+
+  check_vect ();
+
+  x = mmap ((void *) ADDRESS, MMAP_SIZE, PROT_READ | PROT_WRITE,
+           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+  if (x == MAP_FAILED)
+    {
+      perror ("mmap");
+      return 1;
+    }
+
+  b_offset = MMAP_SIZE - (4 * COUNT - 2) * sizeof (TYPE);
+  foo ((TYPE *) x, (TYPE *) ((char *) x + b_offset));
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr79824-2.c b/gcc/testsuite/gcc.dg/vect/pr79824-2.c
new file mode 100644 (file)
index 0000000..629b97e
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-require-effective-target mmap } */
+
+#include <sys/mman.h>
+#include <stdio.h>
+#include "tree-vect.h"
+
+#define COUNT 320
+#define MMAP_SIZE 0x10000
+#define ADDRESS 0x1122000000
+#define TYPE double
+
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+void __attribute__((noinline))
+foo (TYPE *__restrict a, TYPE *__restrict b)
+{
+  int n;
+
+  b = __builtin_assume_aligned (b, sizeof (TYPE) * 2);
+  a = __builtin_assume_aligned (a, sizeof (TYPE) * 2);
+  for (n = 0; n < COUNT; n++)
+    {
+      a[n] = b[n * 4] + b[n * 4 + 1];
+    }
+}
+
+int
+main (void)
+{
+  void *x;
+  size_t b_offset;
+
+  check_vect ();
+
+  x = mmap ((void *) ADDRESS, MMAP_SIZE, PROT_READ | PROT_WRITE,
+           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+  if (x == MAP_FAILED)
+    {
+      perror ("mmap");
+      return 1;
+    }
+
+  b_offset = MMAP_SIZE - (4 * COUNT - 2) * sizeof (TYPE);
+  foo ((TYPE *) x, (TYPE *) ((char *) x + b_offset));
+  return 0;
+}
index c87f72c8af8e82ec569911ad785e36e38de93f3d..9f28321280af53eb899b8381e48db566159f6fc8 100644 (file)
@@ -1731,7 +1731,7 @@ get_group_load_store_type (gimple *stmt, tree vectype, bool slp,
   bool single_element_p = (stmt == first_stmt
                           && !GROUP_NEXT_ELEMENT (stmt_info));
   unsigned HOST_WIDE_INT gap = GROUP_GAP (vinfo_for_stmt (first_stmt));
-  int nunits = TYPE_VECTOR_SUBPARTS (vectype);
+  unsigned nunits = TYPE_VECTOR_SUBPARTS (vectype);
 
   /* True if the vectorized statements would access beyond the last
      statement in the group.  */
@@ -1794,9 +1794,13 @@ get_group_load_store_type (gimple *stmt, tree vectype, bool slp,
       /* If there is a gap at the end of the group then these optimizations
         would access excess elements in the last iteration.  */
       bool would_overrun_p = (gap != 0);
-      /* If the access is aligned an overrun is fine.  */
+      /* If the access is aligned an overrun is fine, but only if the
+         overrun is not inside an unused vector (if the gap is as large
+        or larger than a vector).  */
       if (would_overrun_p
-         && aligned_access_p (STMT_VINFO_DATA_REF (stmt_info)))
+         && gap < nunits
+         && aligned_access_p
+               (STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt))))
        would_overrun_p = false;
       if (!STMT_VINFO_STRIDED_P (stmt_info)
          && (can_overrun_p || !would_overrun_p)