/* { dg-do compile } */
|
/* { dg-do compile } */
|
/* { dg-require-effective-target vect_int } */
|
/* { dg-require-effective-target vect_int } */
|
/* { dg-require-effective-target vect_float } */
|
/* { dg-require-effective-target vect_float } */
|
|
|
#define N 16
|
#define N 16
|
|
|
void fbar (float *);
|
void fbar (float *);
|
void ibar (int *);
|
void ibar (int *);
|
void sbar (short *);
|
void sbar (short *);
|
|
|
/* multiple loops */
|
/* multiple loops */
|
|
|
foo (int n)
|
foo (int n)
|
{
|
{
|
float a[N+1];
|
float a[N+1];
|
float b[N];
|
float b[N];
|
float c[N];
|
float c[N];
|
float d[N];
|
float d[N];
|
int ia[N];
|
int ia[N];
|
int ib[N];
|
int ib[N];
|
int ic[N];
|
int ic[N];
|
int i,j;
|
int i,j;
|
int diff = 0;
|
int diff = 0;
|
char cb[N];
|
char cb[N];
|
char cc[N];
|
char cc[N];
|
char image[N][N];
|
char image[N][N];
|
char block[N][N];
|
char block[N][N];
|
|
|
/* Not vectorizable yet (cross-iteration cycle). */
|
/* Not vectorizable yet (cross-iteration cycle). */
|
diff = 0;
|
diff = 0;
|
for (i = 0; i < N; i++) {
|
for (i = 0; i < N; i++) {
|
diff += (cb[i] - cc[i]);
|
diff += (cb[i] - cc[i]);
|
}
|
}
|
ibar (&diff);
|
ibar (&diff);
|
|
|
|
|
/* Not vectorizable yet (outer-loop: not attempted.
|
/* Not vectorizable yet (outer-loop: not attempted.
|
inner-loop: cross iteration cycle; multi-dimensional arrays). */
|
inner-loop: cross iteration cycle; multi-dimensional arrays). */
|
diff = 0;
|
diff = 0;
|
for (i = 0; i < N; i++) {
|
for (i = 0; i < N; i++) {
|
for (i = 0; i < N; i++) {
|
for (i = 0; i < N; i++) {
|
diff += (image[i][j] - block[i][j]);
|
diff += (image[i][j] - block[i][j]);
|
}
|
}
|
}
|
}
|
ibar (&diff);
|
ibar (&diff);
|
|
|
|
|
/* Vectorizable. */
|
/* Vectorizable. */
|
for (i = 0; i < N; i++){
|
for (i = 0; i < N; i++){
|
a[i] = b[i];
|
a[i] = b[i];
|
}
|
}
|
fbar (a);
|
fbar (a);
|
|
|
|
|
/* Vectorizable. */
|
/* Vectorizable. */
|
for (i = 0; i < N; i++){
|
for (i = 0; i < N; i++){
|
a[i] = b[i] + c[i] + d[i];
|
a[i] = b[i] + c[i] + d[i];
|
}
|
}
|
fbar (a);
|
fbar (a);
|
|
|
|
|
/* Strided access. Vectorizable on platforms that support load of strided
|
/* Strided access. Vectorizable on platforms that support load of strided
|
accesses (extract of even/odd vector elements). */
|
accesses (extract of even/odd vector elements). */
|
for (i = 0; i < N/2; i++){
|
for (i = 0; i < N/2; i++){
|
a[i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
|
a[i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
|
d[i] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
|
d[i] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
|
}
|
}
|
fbar (a);
|
fbar (a);
|
|
|
|
|
/* Vectorizable. */
|
/* Vectorizable. */
|
for (i = 0; i < N; i++){
|
for (i = 0; i < N; i++){
|
a[i] = b[i] + c[i];
|
a[i] = b[i] + c[i];
|
d[i] = b[i] + c[i];
|
d[i] = b[i] + c[i];
|
ia[i] = ib[i] + ic[i];
|
ia[i] = ib[i] + ic[i];
|
}
|
}
|
ibar (ia);
|
ibar (ia);
|
fbar (a);
|
fbar (a);
|
fbar (d);
|
fbar (d);
|
|
|
/* Not vetorizable yet (too conservative dependence test). */
|
/* Not vetorizable yet (too conservative dependence test). */
|
for (i = 0; i < N; i++){
|
for (i = 0; i < N; i++){
|
a[i] = b[i] + c[i];
|
a[i] = b[i] + c[i];
|
a[i+1] = b[i] + c[i];
|
a[i+1] = b[i] + c[i];
|
}
|
}
|
fbar (a);
|
fbar (a);
|
}
|
}
|
|
|
/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target vect_extract_even_odd_wide } } } */
|
/* { dg-final { scan-tree-dump-times "vectorized 4 loops" 1 "vect" { target vect_extract_even_odd_wide } } } */
|
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail vect_extract_even_odd_wide } } } */
|
/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail vect_extract_even_odd_wide } } } */
|
/* { dg-final { cleanup-tree-dump "vect" } } */
|
/* { dg-final { cleanup-tree-dump "vect" } } */
|
|
|