tree-vect-loop.c (vect_analyze_loop_2): Check and skip loop if it has no enough itera...
authorBin Cheng <bin.cheng@arm.com>
Thu, 13 Oct 2016 10:58:26 +0000 (10:58 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Thu, 13 Oct 2016 10:58:26 +0000 (10:58 +0000)
* tree-vect-loop.c (vect_analyze_loop_2): Check and skip loop if it
has no enough iterations for LOOP_VINFO_PEELING_FOR_GAPS.

gcc/testsuite
* gcc.dg/vect/vect-98.c: Refine test case.
* gcc.dg/vect/vect-strided-a-u8-i8-gap2.c: Increase niters.
* gcc.dg/vect/vect-strided-u8-i8-gap2.c: Ditto.
* gcc.dg/vect/vect-strided-u8-i8-gap4.c: Ditto.

From-SVN: r241097

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-98.c
gcc/testsuite/gcc.dg/vect/vect-strided-a-u8-i8-gap2.c
gcc/testsuite/gcc.dg/vect/vect-strided-u8-i8-gap2.c
gcc/testsuite/gcc.dg/vect/vect-strided-u8-i8-gap4.c
gcc/tree-vect-loop.c

index d51c0eb779c18598c241cbe2d56d1692a01e5a25..33159c1138f1813b280e56b9163d572419c4bf1e 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-13  Bin Cheng  <bin.cheng@arm.com>
+
+       * tree-vect-loop.c (vect_analyze_loop_2): Check and skip loop if it
+       has no enough iterations for LOOP_VINFO_PEELING_FOR_GAPS.
+
 2016-10-13  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-vect-loop.c (vectorizable_live_operation): Support handling
index 5dc04c5e65974d42816b5d75e785ab17252c1c49..25fd0428575a43af321cfbe300201a9fad8aaa60 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-13  Bin Cheng  <bin.cheng@arm.com>
+
+       * gcc.dg/vect/vect-98.c: Refine test case.
+       * gcc.dg/vect/vect-strided-a-u8-i8-gap2.c: Increase niters.
+       * gcc.dg/vect/vect-strided-u8-i8-gap2.c: Ditto.
+       * gcc.dg/vect/vect-strided-u8-i8-gap4.c: Ditto.
+
 2016-10-13  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/77946
index 99256a7c8786b9b3911e61e2ca055fb8d7ed7959..2055cce70b20b96dd69d06775e3d6deb9f27e3b2 100644 (file)
@@ -3,6 +3,7 @@
 #include <stdarg.h>
 #include "tree-vect.h"
 
+#define M 8
 #define N 4
 #define DOT4( a, b )  ( a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3] )
 
@@ -11,15 +12,15 @@ int main1 (int ia[][N])
 {
   int i, j;
   int ib[N] = {0,3,6,9};
-  int ic[N][N];
+  int ic[M][M];
 
-  for (i = 0; i < N; i++)
+  for (i = 0; i < M; i++)
     {
        ic[0][i] = DOT4 (ia[i], ib);
     }
 
   /* check results: */  
-  for (i = 0; i < N; i++)
+  for (i = 0; i < M; i++)
     {
        if (ic[0][i] != DOT4 (ia[i], ib))
            abort();
@@ -30,7 +31,8 @@ int main1 (int ia[][N])
 
 int main (void)
 { 
-  int ia[N][N] = {{1,2,3,4},{2,3,5,7},{2,4,6,8},{22,43,55,77}};
+  int ia[M][N] = {{1,2,3,4},{2,3,5,7},{2,4,6,8},{22,43,55,77},
+                 {13,17,19,23},{29,31,37,41},{3,7,2,1},{4,9,8,3}};
 
   check_vect ();
 
index 42ed2b7193a727e6c2951bf461fba44e1da418c2..24c7cc3517a8313e570164f78e75cc89381c9c85 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdarg.h>
 #include "tree-vect.h"
 
-#define N 16 
+#define N 24
 
 typedef struct {
    unsigned char a;
index dddce8543d8a4631c87b2cfee31cb892c1e2c4c5..23cea24540db4c7edfa28fff1de8bab45ad16ce4 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdarg.h>
 #include "tree-vect.h"
 
-#define N 16 
+#define N 24
 
 typedef struct {
    unsigned char a;
index 6face14feb57caac6b8ccee72eb6543c1850f681..1b36df53d73a0b93d369c0e22891f8b9adf431a1 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdarg.h>
 #include "tree-vect.h"
 
-#define N 16 
+#define N 24
 
 typedef struct {
    unsigned char a;
index 7b0431ec1ffc987a99c7934386733975d231a48d..be6f3fb6c65ae5da484cd55cd7fe69327f0d2d37 100644 (file)
@@ -2059,6 +2059,25 @@ start_over:
       return false;
     }
 
+  /* If epilog loop is required because of data accesses with gaps,
+     one additional iteration needs to be peeled.  Check if there is
+     enough iterations for vectorization.  */
+  if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)
+      && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
+    {
+      int vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
+      tree scalar_niters = LOOP_VINFO_NITERSM1 (loop_vinfo);
+
+      if (wi::to_widest (scalar_niters) < vf)
+       {
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_NOTE, vect_location,
+                            "loop has no enough iterations to support"
+                            " peeling for gaps.\n");
+         return false;
+       }
+    }
+
   /* Analyze cost.  Decide if worth while to vectorize.  */
   int min_profitable_estimate, min_profitable_iters;
   vect_estimate_min_profitable_iters (loop_vinfo, &min_profitable_iters,