From f5d8ed2c51c746d3d1e31fad0b55fb3a43a981c7 Mon Sep 17 00:00:00 2001 From: Ira Rosen Date: Wed, 12 Sep 2007 08:48:44 +0000 Subject: [PATCH] tree-vect-analyze.c (vect_analyze_data_ref_dependence): Distinguish between positive and negative dependence distance using DDR_REVERSED_P. * tree-vect-analyze.c (vect_analyze_data_ref_dependence): Distinguish between positive and negative dependence distance using DDR_REVERSED_P. From-SVN: r128420 --- gcc/ChangeLog | 6 ++ gcc/testsuite/ChangeLog | 10 ++++ gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c | 4 +- gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c | 4 +- .../gcc.dg/vect/no-vfa-vect-depend-1.c | 55 +++++++++++++++++++ gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c | 5 +- gcc/testsuite/gcc.dg/vect/vect-104.c | 4 +- gcc/testsuite/gcc.dg/vect/vect-outer-5.c | 9 ++- .../gfortran.dg/vect/no-vfa-pr32377.f90 | 20 +++++++ gcc/tree-vect-analyze.c | 11 ++-- 10 files changed, 111 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c create mode 100644 gcc/testsuite/gfortran.dg/vect/no-vfa-pr32377.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ddcc3ebade..2c1b6d5c3a1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-09-12 Ira Rosen + + PR tree-optimization/32377 + * tree-vect-analyze.c (vect_analyze_data_ref_dependence): Distinguish + between positive and negative dependence distance using DDR_REVERSED_P. + 2007-09-12 Dorit Nuzman PR tree-optimization/33373 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 621d8bd0213..cce7b21c2e4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2007-09-12 Ira Rosen + + PR tree-optimization/32377 + * gcc.dg/vect/no-vfa-vect-102a.c: Change the test to check positive + dependence distance. + * gcc.dg/vect/vect-outer-5.c, gcc.dg/vect/no-vfa-vect-102.c, + gcc.dg/vect/vect-104.c, no-vfa-vect-dv-2.c: Likewise. + * gcc.dg/vect/no-vfa-vect-depend-1.c, + gfortran.dg/vect/no-vfa-pr32377.f90: New. + 2007-09-12 Richard Guenther PR middle-end/33382 diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c index da620746b6c..e49633e0253 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c @@ -32,13 +32,13 @@ int main1 (int x, int y) { /* Not vectorizable: distance 1. */ for (i = 0; i < N - 1; i++) { - *((int *)p + x + i) = *((int *)p + x + i + 1); + *((int *)p + x + i + 1) = *((int *)p + x + i); } /* check results: */ for (i = 0; i < N; i++) { - if (p->a[i] != b[i]) + if (p->a[i] != 1) abort(); } return 0; diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c index 56ea53d8833..da8afaa1a7d 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c @@ -32,13 +32,13 @@ int main1 (int x, int y) { /* Not vectorizable: distance 1. */ for (i = 0; i < N - 1; i++) { - p->a[x + i] = p->a[x + i + 1]; + p->a[x + i + 1] = p->a[x + i]; } /* check results: */ for (i = 0; i < N; i++) { - if (p->a[i] != b[i]) + if (p->a[i] != 1) abort(); } return 0; diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c new file mode 100644 index 00000000000..b8731a0475f --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c @@ -0,0 +1,55 @@ +/* { dg-require-effective-target vect_int } */ + +#include +#include "tree-vect.h" + +#define N 17 + +__attribute__ ((noinline)) +int main1 () +{ + int i; + int ia[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48}; + int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48}; + int res[N] = {12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,48}; + + /* Not vectorizable due to data dependence: dependence distance 1. */ + for (i = 0; i < N - 1; i++) + { + ia[i+1] = ia[i] * 4; + } + + /* check results: */ + for (i = 0; i < N - 1; i++) + { + if (ia[i] != 0) + abort (); + } + + /* Vectorizable. Dependence distance -1. */ + for (i = 0; i < N - 1; i++) + { + ib[i] = ib[i+1] * 4; + } + + /* check results: */ + for (i = 0; i < N - 1; i++) + { + if (ib[i] != res[i]) + abort (); + } + + return 0; +} + +int main (void) +{ + check_vect(); + + return main1 (); +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ +/* { dg-final { scan-tree-dump-times "dependence distance >= VF or negative" 1 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c index 30d229c1996..1a49ef26911 100644 --- a/gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c +++ b/gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c @@ -15,6 +15,7 @@ int main () int B[N]; int C[N]; int D[N]; + int E[N] = {0,1,2,0}; int i, j; @@ -57,13 +58,13 @@ int main () /* Not vectorizable */ for (i = 0; i < 4; i++) { - C[i] = C[i+3]; + C[i+3] = C[i]; } /* check results: */ for (i = 0; i < 4; i++) { - if (C[i] != D[i+3]) + if (C[i] != E[i]) abort (); } diff --git a/gcc/testsuite/gcc.dg/vect/vect-104.c b/gcc/testsuite/gcc.dg/vect/vect-104.c index a4675e61679..5ea2f801a28 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-104.c +++ b/gcc/testsuite/gcc.dg/vect/vect-104.c @@ -14,7 +14,7 @@ struct extraction static int a[N][N] = {{1,2,3},{4,5,6},{7,8,9}}; static int b[N][N] = {{17,24,7},{0,2,3},{4,31,82}}; -static int c[N][N] = {{1,2,3},{4,6,8},{8,9,9}}; +static int c[N][N] = {{1,2,3},{4,5,5},{5,5,5}}; volatile int foo; __attribute__ ((noinline)) @@ -39,7 +39,7 @@ int main1 (int x) { { for (j = 0; j < N; j++) { - *((int *)p + x + i + j) = *((int *)p + x + i + j + 1); + *((int *)p + x + i + j + 1) = *((int *)p + x + i + j); } } diff --git a/gcc/testsuite/gcc.dg/vect/vect-outer-5.c b/gcc/testsuite/gcc.dg/vect/vect-outer-5.c index 54eb3b9246f..c9fc1e0f40b 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-outer-5.c +++ b/gcc/testsuite/gcc.dg/vect/vect-outer-5.c @@ -1,5 +1,6 @@ /* { dg-require-effective-target vect_int } */ +#include #include #include #include "tree-vect.h" @@ -16,6 +17,7 @@ int main1 () float B[N] __attribute__ ((__aligned__(16))); float C[N] __attribute__ ((__aligned__(16))); float D[N] __attribute__ ((__aligned__(16))); + float E[4] = {0,1,2,480}; float s; int i, j; @@ -53,16 +55,13 @@ int main1 () s = 0; for (j=0; j= vectorization_factor) + if (abs (dist) >= vectorization_factor + || (dist > 0 && DDR_REVERSED_P (ddr))) { - /* Dependence distance does not create dependence, as far as vectorization - is concerned, in this case. */ + /* Dependence distance does not create dependence, as far as + vectorization is concerned, in this case. If DDR_REVERSED_P the + order of the data-refs in DDR was reversed (to make distance + vector positive), and the actual distance is negative. */ if (vect_print_dump_info (REPORT_DR_DETAILS)) - fprintf (vect_dump, "dependence distance >= VF."); + fprintf (vect_dump, "dependence distance >= VF or negative."); continue; } -- 2.30.2