re PR fortran/62283 (basic-block vectorization fails)
authorRichard Biener <rguenther@suse.de>
Thu, 28 Aug 2014 13:13:45 +0000 (13:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 28 Aug 2014 13:13:45 +0000 (13:13 +0000)
2014-08-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/62283
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment):
Do not peel loops for alignment where the vector loop likely
doesn't run at least VF times.

* gfortran.dg/vect/pr62283.f: New testcase.
* gcc.dg/tree-ssa/cunroll-5.c: Adjust.
* gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Likewise.
* gcc.dg/vect/costmodel/i386/costmodel-vect-33.c: Likewise.
* gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Likewise.
* gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c: Likewise.
* gcc.dg/vect/vect-33.c: Likewise.

From-SVN: r214678

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/cunroll-5.c
gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-31.c
gcc/testsuite/gcc.dg/vect/costmodel/i386/costmodel-vect-33.c
gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c
gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c
gcc/testsuite/gcc.dg/vect/vect-33.c
gcc/testsuite/gfortran.dg/vect/pr62283.f [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 28a3219aacfdb7ad3ea4f1555c2b8a82983f9242..347075d40f44c308feba12d46f78c03c852ac15b 100644 (file)
@@ -1,3 +1,10 @@
+2014-08-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/62283
+       * tree-vect-data-refs.c (vect_enhance_data_refs_alignment):
+       Do not peel loops for alignment where the vector loop likely
+       doesn't run at least VF times.
+
 2014-08-28  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-ssa-loop-ivopts.c (iv_ca_add_use): Delete parameter
index acacc53821dfba2a6e80ed9dbab90d1b11f7d0c4..91a98e8ab0d24b3de10ab035a8345c2aabc594b4 100644 (file)
@@ -1,3 +1,14 @@
+2014-08-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/62283
+       * gfortran.dg/vect/pr62283.f: New testcase.
+       * gcc.dg/tree-ssa/cunroll-5.c: Adjust.
+       * gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Likewise.
+       * gcc.dg/vect/costmodel/i386/costmodel-vect-33.c: Likewise.
+       * gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Likewise.
+       * gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c: Likewise.
+       * gcc.dg/vect/vect-33.c: Likewise.
+
 2014-08-28  Yury Gribov  <y.gribov@samsung.com>
 
        * c-c++-common/asan/pr62089.c: Fix test on 32-bit platforms.
index 1e9b8bfbab008b50b5b55fbba9c093b86785973d..2739c290af69d0b5283b11a7f94eacc17d7f40d0 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -fdump-tree-cunroll-details" } */
+/* { dg-options "-O3 -fdump-tree-cunroll-details -fno-tree-vectorize" } */
 int *a;
 test(int c)
 { 
index 137267619f2f3cc62547fa92a0fd24c57cd0f6a0..3c9bfdaa044fb32612170cd5fee3731fc2bf1fb5 100644 (file)
@@ -86,6 +86,5 @@ int main (void)
   return main1 ();
 } 
 
-/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index 5676b247069a12a0ef4dcc76a1daf1027e064f50..86bfb58b0a93f05bdad137d3cdad8da0f619e1ea 100644 (file)
@@ -36,5 +36,5 @@ int main (void)
   return main1 ();
 } 
 
-/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index 137267619f2f3cc62547fa92a0fd24c57cd0f6a0..3c9bfdaa044fb32612170cd5fee3731fc2bf1fb5 100644 (file)
@@ -86,6 +86,5 @@ int main (void)
   return main1 ();
 } 
 
-/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index 5676b247069a12a0ef4dcc76a1daf1027e064f50..86bfb58b0a93f05bdad137d3cdad8da0f619e1ea 100644 (file)
@@ -36,5 +36,5 @@ int main (void)
   return main1 ();
 } 
 
-/* { dg-final { scan-tree-dump-times "vectorization not profitable" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
index 43daaa807049f417516139e43fa462c2e3820ab9..85429046dbf21f2de9be1616128efef3d0052f4b 100644 (file)
@@ -38,7 +38,7 @@ int main (void)
 
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect"  } } */
-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
-/* { dg-final { scan-tree-dump "Alignment of access forced using peeling" "vect" { target vector_alignment_reachable } } } */
-/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { {! vector_alignment_reachable} && {! vect_hw_misalign} } } } } */
+/* { dg-final { scan-tree-dump "Vectorizing an unaligned access" "vect" { target { vect_hw_misalign && { ! vect64 } } } } } */
+/* { dg-final { scan-tree-dump "Alignment of access forced using peeling" "vect" { target { vector_alignment_reachable && vect64 } } } } */
+/* { dg-final { scan-tree-dump-times "Alignment of access forced using versioning" 1 "vect" { target { { {! vector_alignment_reachable} || {! vect64} } && {! vect_hw_misalign} } } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gfortran.dg/vect/pr62283.f b/gcc/testsuite/gfortran.dg/vect/pr62283.f
new file mode 100644 (file)
index 0000000..038a998
--- /dev/null
@@ -0,0 +1,17 @@
+C { dg-do compile }
+C { dg-additional-options "-fvect-cost-model=dynamic" }
+      subroutine test2(x,y)
+      real x(4),y(4)
+      beta=3.141593
+      do i=1,4
+        y(i)=y(i)+beta*x(i)
+      end do
+      end
+
+      subroutine test3(x,y)
+      real x(4),y(4)
+      beta=3.141593
+      y=y+beta*x
+      end
+C { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { target { vect_hw_misalign } } } }
+C { dg-final { cleanup-tree-dump "vect" } }
index 893ad5aa0d2ae71db0ebd606a50ee2390da045bc..8785d10395d366126ef4b3049f60053fb34d758e 100644 (file)
@@ -1515,10 +1515,20 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
       || !slpeel_can_duplicate_loop_p (loop, single_exit (loop)))
     do_peeling = false;
 
-  if (do_peeling && all_misalignments_unknown
+  /* If we don't know how many times the peeling loop will run
+     assume it will run VF-1 times and disable peeling if the remaining
+     iters are less than the vectorization factor.  */
+  if (do_peeling
+      && all_misalignments_unknown
+      && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+      && (LOOP_VINFO_INT_NITERS (loop_vinfo)
+         < 2 * (unsigned) LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1))
+    do_peeling = false;
+
+  if (do_peeling
+      && all_misalignments_unknown
       && vect_supportable_dr_alignment (dr0, false))
     {
-
       /* Check if the target requires to prefer stores over loads, i.e., if
          misaligned stores are more expensive than misaligned loads (taking
          drs with same alignment into account).  */
@@ -1605,6 +1615,14 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
                                                   &body_cost_vec);
       if (!dr0 || !npeel)
         do_peeling = false;
+
+      /* If peeling by npeel will result in a remaining loop not iterating
+         enough to be vectorized then do not peel.  */
+      if (do_peeling
+         && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+         && (LOOP_VINFO_INT_NITERS (loop_vinfo)
+             < LOOP_VINFO_VECT_FACTOR (loop_vinfo) + npeel))
+       do_peeling = false;
     }
 
   if (do_peeling)