aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-vfa-vect-102.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-vfa-vect-102a.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-vfa-vect-depend-1.c55
-rw-r--r--gcc/testsuite/gcc.dg/vect/no-vfa-vect-dv-2.c5
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-104.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-outer-5.c9
-rw-r--r--gcc/testsuite/gfortran.dg/vect/no-vfa-pr32377.f9020
-rw-r--r--gcc/tree-vect-analyze.c11
10 files changed, 111 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7ddcc3e..2c1b6d5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-12 Ira Rosen <irar@il.ibm.com>
+
+ 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 <dorit@il.ibm.com>
PR tree-optimization/33373
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 621d8bd..cce7b21 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2007-09-12 Ira Rosen <irar@il.ibm.com>
+
+ 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 <rguenther@suse.de>
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 da62074..e49633e 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 56ea53d..da8afaa1 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 0000000..b8731a0
--- /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 <stdarg.h>
+#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 30d229c..1a49ef2 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 a4675e6..5ea2f80 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 54eb3b9..c9fc1e0 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 <stdio.h>
#include <stdarg.h>
#include <signal.h>
#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<N; j+=4)
s += C[j];
- B[i] = B[i+3] + s;
+ B[i+3] = B[i] + s;
}
/* check results: */
for (i = 0; i < 4; i++)
{
- s = 0;
- for (j=0; j<N; j+=4)
- s += C[j];
- if (B[i] != D[i+3] + s)
+ if (B[i] != E[i])
abort ();
}
diff --git a/gcc/testsuite/gfortran.dg/vect/no-vfa-pr32377.f90 b/gcc/testsuite/gfortran.dg/vect/no-vfa-pr32377.f90
new file mode 100644
index 0000000..4842190
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/no-vfa-pr32377.f90
@@ -0,0 +1,20 @@
+! { dg-do compile }
+
+subroutine s243(ntimes,ld,n,ctime,dtime,a,b,c,d,e,aa,bb,cc)
+
+integer ntimes,ld,n,i,nl
+real a(n),b(n),c(n),d(n),e(n),aa(ld,n),bb(ld,n),cc(ld,n)
+real t1,t2,chksum,ctime,dtime,cs1d
+ b(:n-1)= b(:n-1)+(c(:n-1)+e(:n-1))*d(:n-1)
+ a(:n-1)= b(:n-1)+a(2:n)*d(:n-1)
+ return
+end
+
+! Currently only the first loop gets vectorized.
+! For the second loop vectorization fails because of
+! "affine-affine test failed: missing iteration counts."
+! See PR 32377 for more details.
+
+! { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail *-*-* } } }
+! { dg-final { cleanup-tree-dump "vect" } }
+
diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c
index 51f0294..c9f559b 100644
--- a/gcc/tree-vect-analyze.c
+++ b/gcc/tree-vect-analyze.c
@@ -1212,12 +1212,15 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
continue;
}
- if (abs (dist) >= 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;
}