Commit 94e136b9 by Yuri Rumyantsev Committed by Ilya Enkovich

re PR middle-end/71734 (FAIL: libgomp.fortran/simd4.f90 -O3 -g execution test)

gcc/

2016-07-18  Yuri Rumyantsev  <ysrumyan@gmail.com>

	PR tree-optimization/71734
	* tree-ssa-loop-im.c (ref_indep_loop_p_1): Add REF_LOOP argument which
	contains REF, use it to check safelen, assume that safelen value
	must be greater 1, fix style.
	(ref_indep_loop_p_2): Add REF_LOOP argument.
	(ref_indep_loop_p): Pass LOOP as additional argument to
	ref_indep_loop_p_2.

gcc/testsuite/

2016-07-18  Yuri Rumyantsev  <ysrumyan@gmail.com>

	PR tree-optimization/71734
	* g++.dg/vect/pr70729.cc: Delete redundant dg options, fix style.

From-SVN: r238435
parent 7072df0a
2016-07-18 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/71734
* tree-ssa-loop-im.c (ref_indep_loop_p_1): Add REF_LOOP argument which
contains REF, use it to check safelen, assume that safelen value
must be greater 1, fix style.
(ref_indep_loop_p_2): Add REF_LOOP argument.
(ref_indep_loop_p): Pass LOOP as additional argument to
ref_indep_loop_p_2.
2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com>
* cfgexpand.c (expand_stack_vars): Implement synamic stack space * cfgexpand.c (expand_stack_vars): Implement synamic stack space
......
2016-07-18 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/71734
* g++.dg/vect/pr70729.cc: Delete redundant dg options, fix style.
2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-07-18 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/warn-dynamicstack-1.c: New test. * gcc.target/s390/warn-dynamicstack-1.c: New test.
......
// { dg-do compile } // { dg-do compile }
// { dg-require-effective-target vect_simd_clones } // { dg-additional-options "-ffast-math -fopenmp-simd" }
// { dg-additional-options "-Ofast" } // { dg-additional-options "-msse2" { target x86_64-*-* i?86-*-* } }
// { dg-additional-options "-mavx2 -fopenmp-simd" { target x86_64-*-* i?86-*-* } }
#include <string.h> #include <string.h>
#include <xmmintrin.h> #include <xmmintrin.h>
inline void* my_alloc(size_t bytes) {return _mm_malloc(bytes, 128);} inline void* my_alloc (size_t bytes) {return _mm_malloc (bytes, 128);}
inline void my_free(void* memory) {_mm_free(memory);} inline void my_free (void* memory) {_mm_free (memory);}
template <typename T> template <typename T>
class Vec class Vec
...@@ -18,13 +17,13 @@ class Vec ...@@ -18,13 +17,13 @@ class Vec
public: public:
Vec (int n) : isize(n) {data = (T*)my_alloc(isize*sizeof(T));} Vec (int n) : isize (n) {data = (T*)my_alloc (isize*sizeof (T));}
~Vec () {my_free(data);} ~Vec () {my_free(data);}
Vec& operator = (const Vec& other) Vec& operator = (const Vec& other)
{ {
if (this != &other) if (this != &other)
memcpy(data, other.data, isize*sizeof(T)); memcpy (data, other.data, isize*sizeof (T));
return *this; return *this;
} }
...@@ -67,7 +66,7 @@ struct Ss ...@@ -67,7 +66,7 @@ struct Ss
void Ss::foo (float *in, float w) void Ss::foo (float *in, float w)
{ {
#pragma omp simd #pragma omp simd
for (int i=0; i<S_n; i++) for (int i = 0; i < S_n; i++)
{ {
float w1 = C2[S_n + i] * w; float w1 = C2[S_n + i] * w;
v1.v_i[i] += (int)w1; v1.v_i[i] += (int)w1;
...@@ -75,4 +74,4 @@ void Ss::foo (float *in, float w) ...@@ -75,4 +74,4 @@ void Ss::foo (float *in, float w)
} }
} }
// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } // { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { target x86_64-*-* i?86-*-* } } }
...@@ -2109,11 +2109,12 @@ record_dep_loop (struct loop *loop, im_mem_ref *ref, bool stored_p) ...@@ -2109,11 +2109,12 @@ record_dep_loop (struct loop *loop, im_mem_ref *ref, bool stored_p)
loop = loop_outer (loop); loop = loop_outer (loop);
} }
/* Returns true if REF is independent on all other memory references in /* Returns true if REF in REF_LOOP is independent on all other memory
LOOP. */ references in LOOP. */
static bool static bool
ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p) ref_indep_loop_p_1 (struct loop *ref_loop, struct loop *loop,
im_mem_ref *ref, bool stored_p)
{ {
bitmap refs_to_check; bitmap refs_to_check;
unsigned i; unsigned i;
...@@ -2128,13 +2129,14 @@ ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p) ...@@ -2128,13 +2129,14 @@ 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 (ref_loop->safelen > 1)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
fprintf(dump_file,"Consider REF independent in loop#%d\n", loop->num); fprintf (dump_file,"REF is independent in ref_loop#%d\n",
print_generic_expr(dump_file, ref->mem.ref, TDF_SLIM); ref_loop->num);
fprintf(dump_file, "\n"); print_generic_expr (dump_file, ref->mem.ref, TDF_SLIM);
fprintf (dump_file, "\n");
} }
return true; return true;
} }
...@@ -2149,11 +2151,13 @@ ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p) ...@@ -2149,11 +2151,13 @@ ref_indep_loop_p_1 (struct loop *loop, im_mem_ref *ref, bool stored_p)
return true; return true;
} }
/* Returns true if REF is independent on all other memory references in /* Returns true if REF in REF_LOOP is independent on all other memory
LOOP. Wrapper over ref_indep_loop_p_1, caching its results. */ references in LOOP. Wrapper over ref_indep_loop_p_1, caching its
results. */
static bool static bool
ref_indep_loop_p_2 (struct loop *loop, im_mem_ref *ref, bool stored_p) ref_indep_loop_p_2 (struct loop *ref_loop, struct loop *loop,
im_mem_ref *ref, bool stored_p)
{ {
stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num)); stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num));
...@@ -2165,12 +2169,12 @@ ref_indep_loop_p_2 (struct loop *loop, im_mem_ref *ref, bool stored_p) ...@@ -2165,12 +2169,12 @@ ref_indep_loop_p_2 (struct loop *loop, im_mem_ref *ref, bool stored_p)
struct loop *inner = loop->inner; struct loop *inner = loop->inner;
while (inner) while (inner)
{ {
if (!ref_indep_loop_p_2 (inner, ref, stored_p)) if (!ref_indep_loop_p_2 (ref_loop, inner, ref, stored_p))
return false; return false;
inner = inner->next; inner = inner->next;
} }
bool indep_p = ref_indep_loop_p_1 (loop, ref, stored_p); bool indep_p = ref_indep_loop_p_1 (ref_loop, loop, ref, stored_p);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n", fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n",
...@@ -2209,7 +2213,7 @@ ref_indep_loop_p (struct loop *loop, im_mem_ref *ref) ...@@ -2209,7 +2213,7 @@ ref_indep_loop_p (struct loop *loop, im_mem_ref *ref)
{ {
gcc_checking_assert (MEM_ANALYZABLE (ref)); gcc_checking_assert (MEM_ANALYZABLE (ref));
return ref_indep_loop_p_2 (loop, ref, false); return ref_indep_loop_p_2 (loop, loop, ref, false);
} }
/* Returns true if we can perform store motion of REF from LOOP. */ /* Returns true if we can perform store motion of REF from LOOP. */
......
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