re PR tree-optimization/53185 (segmentation fault in vectorizable_load)
authorMichael Matz <matz@suse.de>
Wed, 9 May 2012 16:08:26 +0000 (16:08 +0000)
committerMichael Matz <matz@gcc.gnu.org>
Wed, 9 May 2012 16:08:26 +0000 (16:08 +0000)
PR tree-optimization/53185
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable
peeling when we see strided loads.

testsuite/
* gcc.dg/vect/pr53185.c: New test.

From-SVN: r187340

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr53185.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 237ae1c781ce5029bea0687cdd42ab074710cf2a..7af99fc387c9796929f021ce0dd1ffae8cc4ad3f 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-09  Michael Matz  <matz@suse.de>
+
+       PR tree-optimization/53185
+       * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Disable
+       peeling when we see strided loads.
+
 2012-05-09  Matthias Klose  <doko@ubuntu.com>
 
        * gcc-ar.c (main): Don't check for execute bits for the plugin.
index 06c1f9d852afa1dab732007b27de4ac450e653e2..3f1b78771892bf9e721a3087ce268ab1a9ce54ae 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-09  Michael Matz  <matz@suse.de>
+
+       PR tree-optimization/53185
+       * gcc.dg/vect/pr53185.c: New test.
+
 2012-05-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR middle-end/53249
diff --git a/gcc/testsuite/gcc.dg/vect/pr53185.c b/gcc/testsuite/gcc.dg/vect/pr53185.c
new file mode 100644 (file)
index 0000000..af1efba
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+unsigned short a, e;
+int *b, *d;
+int c;
+extern int fn2();
+void fn1 () {
+  void *f;
+  for (;;) {
+    fn2 ();
+    b = f;
+    e = 0;
+    for (; e < a; ++e)
+      b[e] = d[e * c];
+  }
+}
index 74640345915f453f6e0ac705fc5fbbeb94375abd..715e3ffde616e847766afe9ce5269e9050d9e4aa 100644 (file)
@@ -1507,6 +1507,17 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
           && GROUP_FIRST_ELEMENT (stmt_info) != stmt)
         continue;
 
+      /* FORNOW: Any strided load prevents peeling.  The induction
+         variable analysis will fail when the prologue loop is generated,
+        and so we can't generate the new base for the pointer.  */
+      if (STMT_VINFO_STRIDE_LOAD_P (stmt_info))
+       {
+         if (vect_print_dump_info (REPORT_DETAILS))
+           fprintf (vect_dump, "strided load prevents peeling");
+         do_peeling = false;
+         break;
+       }
+
       /* For invariant accesses there is nothing to enhance.  */
       if (integer_zerop (DR_STEP (dr)))
        continue;