Commit fafe9318 by Yuri Rumyantsev Committed by Ilya Enkovich

re PR tree-optimization/70729 (Loop marked with omp simd pragma is not vectorized)

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
parent 54d19c3b
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> 2016-06-29 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/71625 PR tree-optimization/71625
......
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> 2016-06-29 Thomas Schwinge <thomas@codesourcery.com>
* c-c++-common/gomp/cancel-1.c: Extend. * c-c++-common/gomp/cancel-1.c: Extend.
......
// { 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" } }
...@@ -2128,6 +2128,17 @@ ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p) ...@@ -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)) if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID))
return false; 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) EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi)
{ {
aref = memory_accesses.refs_list[i]; aref = memory_accesses.refs_list[i];
......
...@@ -6968,6 +6968,9 @@ vect_transform_loop (loop_vec_info loop_vinfo) ...@@ -6968,6 +6968,9 @@ vect_transform_loop (loop_vec_info loop_vinfo)
FOR_EACH_VEC_ELT (LOOP_VINFO_SLP_INSTANCES (loop_vinfo), i, instance) FOR_EACH_VEC_ELT (LOOP_VINFO_SLP_INSTANCES (loop_vinfo), i, instance)
vect_free_slp_instance (instance); vect_free_slp_instance (instance);
LOOP_VINFO_SLP_INSTANCES (loop_vinfo).release (); 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 /* The code below is trying to perform simple optimization - revert
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment