re PR tree-optimization/65518 (gcc consumes all memory with -O3)
authorRichard Biener <rguenther@suse.de>
Mon, 23 Mar 2015 14:59:57 +0000 (14:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 23 Mar 2015 14:59:57 +0000 (14:59 +0000)
2015-03-23  Richard Biener  <rguenther@suse.de>

PR tree-optimization/65518
* tree-vect-stmts.c (vectorizable_load): Reject single-element
interleaving cases we generate absymal code for.

* gcc.dg/vect/pr65518.c: New testcase.

From-SVN: r221595

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

index cb657f66fa8577ca01edfb1e59a7823a719e16af..724d13fd0d8c558a2ff282583b78acf92387d0f7 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-23  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/65518
+       * tree-vect-stmts.c (vectorizable_load): Reject single-element
+       interleaving cases we generate absymal code for.
+
 2015-03-23  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/65494
index cafb23b4b27e58b9d28534ddb5e779c307d4131a..e6e63d1a10e9141622435a41dc7ae1611103ad2f 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-23  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/65518
+       * gcc.dg/vect/pr65518.c: New testcase.
+
 2015-03-23  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/65494
diff --git a/gcc/testsuite/gcc.dg/vect/pr65518.c b/gcc/testsuite/gcc.dg/vect/pr65518.c
new file mode 100644 (file)
index 0000000..dc400c6
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do run } */\r
+\r
+extern void abort (void);\r
+\r
+typedef struct giga\r
+{\r
+  unsigned int g[16];\r
+} giga;\r
+\r
+unsigned long __attribute__((noinline,noclone))\r
+addfst(giga const *gptr, int num)\r
+{\r
+  unsigned int retval = 0;\r
+  int i;\r
+  for (i = 0; i < num; i++)\r
+    retval += gptr[i].g[0];\r
+  return retval;\r
+}\r
+\r
+int main ()\r
+{\r
+  struct giga g[8];\r
+  unsigned int n = 1;\r
+  int i, j;\r
+  for (i = 0; i < 8; ++i)\r
+    for (j = 0; j < 16; ++j)\r
+      {\r
+       g[i].g[j] = n++;\r
+       __asm__ volatile ("");\r
+      }\r
+  if (addfst (g, 8) != 456)\r
+    abort ();\r
+  return 0;\r
+}\r
+\r
+/* We don't want to vectorize the single-element interleaving in the way\r
+   we currently do that (without ignoring not needed vectors in the\r
+   gap between gptr[0].g[0] and gptr[1].g[0]), because that's very\r
+   sub-optimal and causes memory explosion (even though the cost model\r
+   should reject that in the end).  */\r
+\r
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops in function" 2 "vect" } } */\r
+/* { dg-final { cleanup-tree-dump "vect" } } */\r
index e0cebc685b16f74bf401fff846d02b175a6016f2..de35508d560436578b8935bd4f0095d813520d14 100644 (file)
@@ -5780,6 +5780,22 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
       gcc_assert (! nested_in_vect_loop && !STMT_VINFO_GATHER_P (stmt_info));
 
       first_stmt = GROUP_FIRST_ELEMENT (stmt_info);
+
+      /* If this is single-element interleaving with an element distance
+         that leaves unused vector loads around punt - we at least create
+        very sub-optimal code in that case (and blow up memory,
+        see PR65518).  */
+      if (first_stmt == stmt
+         && !GROUP_NEXT_ELEMENT (stmt_info)
+         && GROUP_SIZE (stmt_info) > TYPE_VECTOR_SUBPARTS (vectype))
+       {
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                            "single-element interleaving not supported "
+                            "for not adjacent vector loads\n");
+         return false;
+       }
+
       if (!slp && !PURE_SLP_STMT (stmt_info))
        {
          group_size = GROUP_SIZE (vinfo_for_stmt (first_stmt));