diff options
author | Ira Rosen <ira.rosen@linaro.org> | 2011-09-15 10:46:39 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2011-09-15 10:46:39 +0000 |
commit | e0521991e43afe844ccb206889b54f96890cd86f (patch) | |
tree | 8a5f476c165afd0e2738bb275d1440f1422fb7dc /gcc | |
parent | 4178104336ad9164e960a27477dbd974fb835b48 (diff) | |
download | gcc-e0521991e43afe844ccb206889b54f96890cd86f.zip gcc-e0521991e43afe844ccb206889b54f96890cd86f.tar.gz gcc-e0521991e43afe844ccb206889b54f96890cd86f.tar.bz2 |
tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Allow read-after-read dependencies in basic block SLP.
* tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Allow
read-after-read dependencies in basic block SLP.
From-SVN: r178880
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/bb-slp-25.c | 57 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 5 |
4 files changed, 71 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc1245e..7c44c12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-09-15 Ira Rosen <ira.rosen@linaro.org> + + * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Allow + read-after-read dependencies in basic block SLP. + 2011-09-14 Richard Sandiford <rdsandiford@googlemail.com> * config/sparc/sparc.md: Use match_test rather than eq/ne symbol_ref diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 28d1102..71e748d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-09-15 Ira Rosen <ira.rosen@linaro.org> + + * gcc.dg/vect/bb-slp-25.c: New. + 2011-09-14 Paolo Carlini <paolo.carlini@oracle.com> PR c++/50391 diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-25.c b/gcc/testsuite/gcc.dg/vect/bb-slp-25.c new file mode 100644 index 0000000..6834960 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-25.c @@ -0,0 +1,57 @@ +/* { dg-require-effective-target vect_int } */ + +#include <stdarg.h> +#include "tree-vect.h" + +#define A 3 +#define B 4 +#define N 256 + +short src[N], dst[N]; + +void foo (short * __restrict dst, short * __restrict src, int h, int stride) +{ + int i; + h /= 16; + for (i = 0; i < h; i++) + { + dst[0] += A*src[0] + src[stride]; + dst[1] += A*src[1] + src[1+stride]; + dst[2] += A*src[2] + src[2+stride]; + dst[3] += A*src[3] + src[3+stride]; + dst[4] += A*src[4] + src[4+stride]; + dst[5] += A*src[5] + src[5+stride]; + dst[6] += A*src[6] + src[6+stride]; + dst[7] += A*src[7] + src[7+stride]; + dst += 8; + src += 8; + } +} + + +int main (void) +{ + int i; + + check_vect (); + + for (i = 0; i < N; i++) + { + dst[i] = 0; + src[i] = i; + } + + foo (dst, src, N, 8); + + for (i = 0; i < N/2; i++) + { + if (dst[i] != A * i + i + 8) + abort (); + } + + return 0; +} + +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" { target vect_element_align } } } */ +/* { dg-final { cleanup-tree-dump "slp" } } */ + diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index e4d32e9..33ccf34 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -607,6 +607,11 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr, if (vect_check_interleaving (dra, drb)) return false; + /* Read-read is OK (we need this check here, after checking for + interleaving). */ + if (DR_IS_READ (dra) && DR_IS_READ (drb)) + return false; + if (vect_print_dump_info (REPORT_DR_DETAILS)) { fprintf (vect_dump, "can't determine dependence between "); |