re PR tree-optimization/70729 (Loop marked with omp simd pragma is not vectorized)
authorYuri Rumyantsev <ysrumyan@gmail.com>
Wed, 29 Jun 2016 10:16:43 +0000 (10:16 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Wed, 29 Jun 2016 10:16:43 +0000 (10:16 +0000)
gcc/

2016-06-29  Yuri Rumyantsev  <ysrumyan@gmail.com>

PR tree-optimization/70729
* tree-ssa-loop-im.c (ref_indep_loop_p_1): Consider memory reference as
independent in loops having positive safelen value.
* tree-vect-loop.c (vect_transform_loop): Clear-up safelen value since
it may be not valid after vectorization.

gcc/testsuite/

2016-06-29  Yuri Rumyantsev  <ysrumyan@gmail.com>

PR tree-optimization/70729
* g++.dg/vect/pr70729.cc: New test.

From-SVN: r237844

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr70729.cc [new file with mode: 0644]
gcc/tree-ssa-loop-im.c
gcc/tree-vect-loop.c

index 2d4f9b3f6e3a82ad16682e25553793f969fdae5e..a086524676949c56077e275058a43173aeddb52b 100644 (file)
@@ -1,3 +1,11 @@
+2016-06-29  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       PR tree-optimization/70729
+       * tree-ssa-loop-im.c (ref_indep_loop_p_1): Consider memory reference as
+       independent in loops having positive safelen value.
+       * tree-vect-loop.c (vect_transform_loop): Clear-up safelen value since
+       it may be not valid after vectorization.
+
 2016-06-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/71625
index bc85add977db4bc360a3ed3bf6727dafab180944..471e39a24e4f5489110013eefd8932f970341e0b 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-29  Yuri Rumyantsev  <ysrumyan@gmail.com>
+
+       PR tree-optimization/70729
+       * g++.dg/vect/pr70729.cc: New test.
+
 2016-06-29  Thomas Schwinge  <thomas@codesourcery.com>
 
        * c-c++-common/gomp/cancel-1.c: Extend.
diff --git a/gcc/testsuite/g++.dg/vect/pr70729.cc b/gcc/testsuite/g++.dg/vect/pr70729.cc
new file mode 100644 (file)
index 0000000..0d5d353
--- /dev/null
@@ -0,0 +1,78 @@
+// { dg-do compile }
+// { dg-require-effective-target vect_simd_clones }
+// { dg-additional-options "-Ofast" }
+// { dg-additional-options "-mavx2 -fopenmp-simd" { target x86_64-*-* i?86-*-* } }
+
+
+#include <string.h>
+#include <xmmintrin.h>
+
+inline void* my_alloc(size_t bytes) {return _mm_malloc(bytes, 128);}
+inline void my_free(void* memory) {_mm_free(memory);}
+
+template <typename T>
+class Vec
+{
+  const int isize;
+       T* data;
+
+public:
+
+  Vec (int n) : isize(n) {data = (T*)my_alloc(isize*sizeof(T));}
+  ~Vec () {my_free(data);}
+
+  Vec& operator = (const Vec& other)   
+    {
+      if (this != &other)
+       memcpy(data, other.data, isize*sizeof(T));
+      return *this;
+    }
+
+  T& operator [] (int i) {return data[i];}
+  const T& operator [] (int i) const {return data[i];}
+  T& at (int i)  {return data[i];}
+  const T& at (int i) const {return data[i];}
+
+  operator T* ()  {return data;}
+  int size () const {return isize;}
+};
+
+template <typename T>                                  
+class Cl
+{
+public:
+
+  Cl (int n, int m);
+  const int N, M;
+  Vec<T> v_x, v_y;
+  Vec<int> v_i;
+  Vec<float> v_z;
+};
+
+struct Ss
+{
+    const int S_n, S_m;
+    Cl<float> v1;
+    float* C1;
+    float* C2;
+    Ss (int n1, int n2): S_n(n1), S_m(n2), v1(n1, n2)
+      {
+       C1 = new float[n1 * 3];
+       C2 = new float[n2 * 4]; 
+      }
+
+    ~Ss () { delete C1; delete C2;}
+   void foo (float *in, float w);
+};
+void Ss::foo (float *in, float w)
+{
+#pragma omp simd
+  for (int i=0; i<S_n; i++)
+    {
+      float w1 = C2[S_n + i] * w;
+      v1.v_i[i] += (int)w1;
+      C1[S_n + i] += w1;
+    }
+}
+// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } }
index b9cd0f6bac6b94192bf1d2bf2d88387ddcb8adf3..ee048263ca2863f56f48a87cd35a5d16a5dc3e69 100644 (file)
@@ -2128,6 +2128,17 @@ ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p)
   if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID))
     return false;
 
+  if (loop->safelen > 0)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       {
+         fprintf(dump_file,"Consider REF independent in loop#%d\n", loop->num);
+         print_generic_expr(dump_file, ref->mem.ref, TDF_SLIM);
+         fprintf(dump_file, "\n");
+       }
+      return true;
+    }
+
   EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi)
     {
       aref = memory_accesses.refs_list[i];
index 6c0337bbbcbebd6443fd3bcef45c1b23a7833486..5e4007642b7045e8b65710ed52c30a4eee504e8e 100644 (file)
@@ -6968,6 +6968,9 @@ vect_transform_loop (loop_vec_info loop_vinfo)
   FOR_EACH_VEC_ELT (LOOP_VINFO_SLP_INSTANCES (loop_vinfo), i, instance)
     vect_free_slp_instance (instance);
   LOOP_VINFO_SLP_INSTANCES (loop_vinfo).release ();
+  /* Clear-up safelen field since its value is invalid after vectorization
+     since vectorized loop can have loop-carried dependencies.  */
+  loop->safelen = 0;
 }
 
 /* The code below is trying to perform simple optimization - revert