tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi in the tail of...
authorYuri Rumyantsev <ysrumyan@gmail.com>
Thu, 8 Oct 2015 14:28:53 +0000 (14:28 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Thu, 8 Oct 2015 14:28:53 +0000 (14:28 +0000)
gcc/

* tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi
in the tail of outer-loop.

gcc/testsuite/

* gcc.dg/vect/vect-outer-simd-3.c: New test.

From-SVN: r228601

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-outer-simd-3.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index b872a4d5edddb3f29ef4e6784b6140fb5dcd424c..7ae4f39fb7df906c8e929c47ccf6b17f501b7209 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-08  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       * tree-vect-loop.c (vect_analyze_loop_operations): Skip virtual phi
+       in the tail of outer-loop.
+
 2015-10-08  David Edelsohn  <dje.gcc@gmail.com>
 
        * config/rs6000/rs6000.c (rs6000_xcoff_debug_unwind_info): Always
index ef2faab16a1041a59e25bedf7b205349899bb7f4..638751eaf931db6a90dbd778efde9709e8c91496 100644 (file)
@@ -1,3 +1,7 @@
+2015-10-08  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       * gcc.dg/vect/vect-outer-simd-3.c: New test.
+
 2015-10-08  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        * gcc.dg/loop-unswitch-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/vect-outer-simd-3.c b/gcc/testsuite/gcc.dg/vect/vect-outer-simd-3.c
new file mode 100644 (file)
index 0000000..59e54db
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-require-effective-target vect_simd_clones } */
+/* { dg-additional-options "-O3 -fopenmp-simd -ffast-math" } */
+#include <stdlib.h>
+#include "tree-vect.h"
+#define N 64
+
+float *px, *py;
+float *tx, *ty;
+float *x1, *z1, *t1, *t2;
+int bound[N];
+
+static void inline bar(const float cx, float cy,
+                         float *vx, float *vy, int n)
+{
+  int j;
+    for (j = 0; j < n; ++j)
+    {
+        const float dx  = cx - px[j];
+        const float dy  = cy - py[j];
+        *vx               -= dx * tx[j];
+        *vy               -= dy * ty[j];
+    }
+}
+
+__attribute__((noinline, noclone)) void foo1 ()
+{
+  int i;
+  int n = bound[63];
+#pragma omp simd
+  for (i=0; i<N; i++)
+    bar(px[i], py[i], x1+i, z1+i, n);
+}
+
+__attribute__((noinline, noclone)) void foo2 ()
+{
+  volatile int i;
+  int n = bound[63];
+  for (i=0; i<N; i++)
+    bar(px[i], py[i], x1+i, z1+i, n);
+}
+
+
+int main()
+{
+  float *X = (float*)malloc(N * 8 * sizeof (float));
+  int i;
+  /* check_vect (); */
+  px = &X[0];
+  py = &X[N * 1];
+  tx = &X[N * 2];
+  ty = &X[N * 3];
+  x1 = &X[N * 4];
+  z1 = &X[N * 5];
+  t1 = &X[N * 6];
+  t2 = &X[N * 7];
+
+  for (i=0; i<N; i++)
+    {
+      px[i] = (float) (i+2);
+      tx[i] = (float) (i+1);
+      py[i] = (float) (i+4);
+      ty[i] = (float) (i+3);
+      x1[i] = z1[i] = 1.0f;
+      bound[i] = i + 1;
+    }
+  foo1 ();  /* vector variant.  */
+  for (i=0; i<N;i++)
+    {
+      t1[i] = x1[i]; x1[i] = 1.0f;
+      t2[i] = z1[i]; z1[i] = 1.0f;
+    }
+  foo2 ();  /* scalar variant.  */
+  for (i=0; i<N; i++)
+    if (x1[i] != t1[i] || z1[i] != t2[i])
+      abort ();
+  return 0;
+}
+/* { dg-final { scan-tree-dump "OUTER LOOP VECTORIZED" "vect" } } */
index 26b7f8c058271597edd346e2da953b0d03a3b4ac..8ab1cdf3ac7319babbdf7cf70d5497925dfc911b 100644 (file)
@@ -1463,6 +1463,8 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo)
               dump_gimple_stmt (MSG_NOTE, TDF_SLIM, phi, 0);
               dump_printf (MSG_NOTE, "\n");
             }
+         if (virtual_operand_p (gimple_phi_result (phi)))
+           continue;
 
           /* Inner-loop loop-closed exit phi in outer-loop vectorization
              (i.e., a phi in the tail of the outer-loop).  */