re PR tree-optimization/91975 (worse code for small array copy using pointer arithmet...
authorRichard Biener <rguenther@suse.de>
Mon, 7 Oct 2019 07:53:45 +0000 (07:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 7 Oct 2019 07:53:45 +0000 (07:53 +0000)
2019-10-07  Richard Biener  <rguenther@suse.de>

PR tree-optimization/91975
* tree-ssa-loop-ivcanon.c (constant_after_peeling): Consistently
handle invariants.

* g++.dg/tree-ssa/ivopts-3.C: Adjust.
* gcc.dg/vect/vect-profile-1.c: Disable cunrolli.
* gcc.dg/vect/vect-double-reduc-6.c: Disable unrolling of
the innermost loop.
* gcc.dg/vect/vect-93.c: Likewise.
* gcc.dg/vect/vect-105.c: Likewise.
* gcc.dg/vect/pr79920.c: Likewise.
* gcc.dg/vect/no-vfa-vect-102.c: Likewise.
* gcc.dg/vect/no-vfa-vect-101.c: Likewise.
* gcc.dg/vect/pr83202-1.c: Operate on a larger array.
* gfortran.dg/vect/vect-8.f90: Likewise.
* gcc.dg/tree-ssa/cunroll-2.c: Scan early unrolling dump instead
of late one.

From-SVN: r276645

14 files changed:
gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/ivopts-3.C
gcc/testsuite/gcc.dg/tree-ssa/cunroll-2.c
gcc/testsuite/gcc.dg/vect/no-vfa-vect-101.c
gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c
gcc/testsuite/gcc.dg/vect/pr79920.c
gcc/testsuite/gcc.dg/vect/pr83202-1.c
gcc/testsuite/gcc.dg/vect/vect-105.c
gcc/testsuite/gcc.dg/vect/vect-93.c
gcc/testsuite/gcc.dg/vect/vect-double-reduc-6.c
gcc/testsuite/gcc.dg/vect/vect-profile-1.c
gcc/testsuite/gfortran.dg/vect/vect-8.f90
gcc/tree-ssa-loop-ivcanon.c

index 4b7cb0e59246df247ae7d130732d4dec4681eb31..ef1eb5973cc85e4ac8bff76d9e6bf008be7101af 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-07  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/91975
+       * tree-ssa-loop-ivcanon.c (constant_after_peeling): Consistently
+       handle invariants.
+
 2019-10-06  Richard Sandiford  <richard.sandiford@arm.com>
 
        * var-tracking.c (dataflow_set_clear_at_call): Hoist temporary
index 2c7d62a5f664af6c737102fc9367ccc7c04ee01a..e8e006061ece95311a9a027fbda1504553f925aa 100644 (file)
@@ -1,3 +1,20 @@
+2019-10-07  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/91975
+       * g++.dg/tree-ssa/ivopts-3.C: Adjust.
+       * gcc.dg/vect/vect-profile-1.c: Disable cunrolli.
+       * gcc.dg/vect/vect-double-reduc-6.c: Disable unrolling of
+       the innermost loop.
+       * gcc.dg/vect/vect-93.c: Likewise.
+       * gcc.dg/vect/vect-105.c: Likewise.
+       * gcc.dg/vect/pr79920.c: Likewise.
+       * gcc.dg/vect/no-vfa-vect-102.c: Likewise.
+       * gcc.dg/vect/no-vfa-vect-101.c: Likewise.
+       * gcc.dg/vect/pr83202-1.c: Operate on a larger array.
+       * gfortran.dg/vect/vect-8.f90: Likewise.
+       * gcc.dg/tree-ssa/cunroll-2.c: Scan early unrolling dump instead
+       of late one.
+
 2019-10-05  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/47045
index 07ff1b770f87e01354b3c1e7f3f6bf106868eaa8..6760a5b185176e781afb3dded2e09793b3cf7ba6 100644 (file)
@@ -70,6 +70,8 @@ int main ( int , char** ) {
     return 0;
 }
 
-// Verify that on x86_64 and i?86 we use a single IV for the innermost loop
+// Verify that on x86_64 and i?86 we unroll the innsermost loop and
+// use three IVs for the then innermost loop
 
-// { dg-final { scan-tree-dump "Selected IV set for loop \[0-9\]* at \[^ \]*:64, 3 avg niters, 1 IVs" "ivopts" { target x86_64-*-* i?86-*-* } } }
+// { dg-final { scan-tree-dump "Selected IV set for loop \[0-9\]* at \[^ \]*:63, 127 avg niters, 3 IVs" "ivopts" { target x86_64-*-* i?86-*-* } } }
+// { dg-final { scan-tree-dump-not "Selected IV set for loop \[0-9\]* at \[^ \]*:64" "ivopts" { target x86_64-*-* i?86-*-* } } }
index b1d1c7d3d852c00ca269ab9fe49f717bf42a562c..ae3fec9974971a42f5c0e16f242fccd635738db9 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O3 -fdump-tree-cunroll-details" } */
+/* { dg-options "-O3 -fdump-tree-cunrolli-details" } */
 int a[2];
 int test2 (void);
 void
@@ -14,4 +14,4 @@ test(int c)
     }
 }
 /* We are not able to get rid of the final conditional because the loop has two exits.  */
-/* { dg-final { scan-tree-dump "loop with 1 iterations completely unrolled" "cunroll"} } */
+/* { dg-final { scan-tree-dump "loop with 2 iterations completely unrolled" "cunrolli"} } */
index 91eb28218bd15db2310ec05d768c54832fc834ea..ce934279ddfe073a96ef8cd7e0d383ca979bda7a 100644 (file)
@@ -22,6 +22,7 @@ int main1 (int x, int y) {
   p = (struct extraction *) malloc (sizeof (struct extraction));
 
   /* Not vectorizable: different unknown offset.  */
+#pragma GCC unroll 0
   for (i = 0; i < N; i++)
     {
       *((int *)p + x + i) = a[i];
index 51f62788dbfd8da183d60ebb69cd8580eb11f3a7..d9e0529e73f0a566220020ad671f432f3e72299f 100644 (file)
@@ -28,6 +28,7 @@ int main1 (int x, int y) {
     }
 
   /* Not vectorizable: distance 1.  */
+#pragma GCC unroll 0
   for (i = 0; i < N - 1; i++)
     {
        *((int *)p + x + i + 1) = *((int *)p + x + i);
index 276a2806f0c4da3f7870c37010d8f1b0c99fe721..38e0fef779a0b568c09ba826533e896bf671f998 100644 (file)
@@ -14,6 +14,7 @@ compute_integral (double w_1[18])
 
   for (int ip_1 = 0; ip_1 < 2; ++ip_1)
     {
+#pragma GCC unroll 0
       for (int i_0 = 0; i_0 < 6; ++i_0)
        t33[ip_1][i_0] = ((w_1[i_0*3] * t32[ip_1][0])
                          + (w_1[i_0*3+2] * t32[ip_1][2]));
index 33c83de29b8749cc9b3070a2bf0948a8a3d5705f..ac12f079839ba5b86efa8ba9ed3dc23bb48c40e7 100644 (file)
@@ -1,9 +1,9 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target vect_double } */
 
-void test(double data[8][8])
+void test(double data[16][16])
 {
-  for (int i = 0; i < 8; i++)
+  for (int i = 0; i < 16; i++)
     {
       for (int j = 0; j < i; j+=4)
        {
index 0024457f9e275cd7dda9ed053119eccdfa6c7701..17b6e89d8f69053b5825c859f3ab5c68c49b3a5d 100644 (file)
@@ -35,6 +35,7 @@ int main1 (int x) {
   /* Vectorizable: distance > number of iterations.  */
   for (i = 1; i < N; i++)
   {
+#pragma GCC unroll 0
     for (j = 0; j < N; j++)
     {
        *((int *)p + x + i + j) = *((int *)p + x + i + j + 5);
index 397c2ed05aaee71177d3efabcf60bcd6efd69571..c3e12783b2c47a4e296fd47cc9dc8e73b7ccebb0 100644 (file)
@@ -29,6 +29,7 @@ main1 (float *pa)
        abort ();
     }
 
+#pragma GCC unroll 0
   for (i = 1; i <= N2; i++)
     {
       pa[i] = 3.0;
index 3a4f087da81da39795a3440b3838a1789fb47575..85aec1bf609582988f06826afb6b7ce77d6d83de 100644 (file)
@@ -19,6 +19,7 @@ foo ()
     {
       sum = 1;
       for (j = 0; j < K; j++) 
+#pragma GCC unroll 0
         for (i = 0; i < K; i++)
           sum *= in[i+k][j];
       out[k] = sum;
index 93d7ad13147534f7dc95db763a487e326619fed6..922f965806f92368fc6748cf4a61176620e8631b 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target vect_int } */
-/* { dg-additional-options "-fdump-tree-vect-details-blocks" } */
+/* { dg-additional-options "-fdump-tree-vect-details-blocks -fdisable-tree-cunrolli" } */
 
 /* At least one of these should correspond to a full vector.  */
 
index e26cdf95e5158152c790dcaed420ef6ddae4849f..386f7de4a7e46f0825aa0f8d7afc0142a1d52914 100644 (file)
@@ -247,7 +247,7 @@ nl1= 1
 nl2= 2
 fw= 2.000D0
   DO ky= 2,n
-DO kx= 2,3
+DO kx= 2,4
     du1ky= u1(kx,ky+1,nl1)-u1(kx,ky-1,nl1)
     du2ky= u2(kx,ky+1,nl1)-u2(kx,ky-1,nl1)
     du3ky= u3(kx,ky+1,nl1)-u3(kx,ky-1,nl1)
index 5952cad7bba729153a66edff57301cf734a5ee1b..d38959c3aa2bc363e72ff1e0e4acb2d4b3356aba 100644 (file)
@@ -195,9 +195,8 @@ constant_after_peeling (tree op, gimple *stmt, class loop *loop)
   /* Induction variables are constants when defined in loop.  */
   if (loop_containing_stmt (stmt) != loop)
     return false;
-  tree ev = analyze_scalar_evolution (loop, op);
-  if (chrec_contains_undetermined (ev)
-      || chrec_contains_symbols (ev))
+  tree ev = instantiate_parameters (loop, analyze_scalar_evolution (loop, op));
+  if (chrec_contains_undetermined (ev))
     return false;
   return true;
 }