diff options
author | Ira Rosen <irar@il.ibm.com> | 2009-07-20 11:59:10 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2009-07-20 11:59:10 +0000 |
commit | 4bbe826276ddc92d622b519659c52ca7027a823c (patch) | |
tree | b5c54f986ec049e40252b92d71e7729a749daaa7 /gcc/testsuite/gcc.dg/vect | |
parent | 9e7c935a29fe3d44f60a40960ee4791aab285423 (diff) | |
download | gcc-4bbe826276ddc92d622b519659c52ca7027a823c.zip gcc-4bbe826276ddc92d622b519659c52ca7027a823c.tar.gz gcc-4bbe826276ddc92d622b519659c52ca7027a823c.tar.bz2 |
tree-vectorizer.h (vectorizable_condition): Add parameters.
* tree-vectorizer.h (vectorizable_condition): Add parameters.
* tree-vect-loop.c (vect_is_simple_reduction): Support COND_EXPR.
(get_initial_def_for_reduction): Likewise.
(vectorizable_reduction): Skip the check of first operand in case
of COND_EXPR. Add check that it is outer loop vectorization if
nested cycle was detected. Call vectorizable_condition() for
COND_EXPR. If reduction epilogue cannot be created do not fail for
nested cycles (if it is not double reduction). Assert that there
is only one type in the loop in case of COND_EXPR. Call
vectorizable_condition() to vectorize COND_EXPR.
* tree-vect-stmts.c (vectorizable_condition): Update comment.
Add parameters. Allow nested cycles if called from
vectorizable_reduction(). Use reduction vector variable if provided.
(vect_analyze_stmt): Call vectorizable_reduction() before
vectorizable_condition().
(vect_transform_stmt): Update call to vectorizable_condition().
From-SVN: r149806
Diffstat (limited to 'gcc/testsuite/gcc.dg/vect')
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-1.c | 58 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-2.c | 49 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-3.c | 66 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-4.c | 63 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-5.c | 62 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-cond-6.c | 60 |
6 files changed, 358 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-1.c b/gcc/testsuite/gcc.dg/vect/vect-cond-1.c new file mode 100644 index 0000000..4ee6713 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-1.c @@ -0,0 +1,58 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdlib.h> +#include <stdio.h> +#include "tree-vect.h" + +#define M 32 +#define N 16 + +int x_in[M]; +int x_out[M]; +int c[N] = {3,2,1,10,1,42,3,4,50,9,32,8,11,10,1,2}; +int a[N+1] = {0,16,32,48,64,128,256,512,0,16,32,48,64,128,256,512,1024}; +int check_result[M] = {1024,1024,1024,256,256,256,256,256,256,256,256,128,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48}; + +__attribute__ ((noinline)) void +foo () +{ + int j, i, x; + int curr_a, next_a; + + for (j = 0; j < M; j++) + { + x = x_in[j]; + curr_a = a[0]; + + for (i = 0; i < N; i++) + { + next_a = a[i+1]; + curr_a = x > c[i] ? curr_a : next_a; + } + + x_out[j] = curr_a; + } +} + +int main (void) +{ + int i,j; + + check_vect (); + + for (j = 0; j < M; j++) + x_in[j] = j; + + foo (); + + for (j = 0; j < M; j++) + if (x_out[j] != check_result[j]) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + + diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-2.c b/gcc/testsuite/gcc.dg/vect/vect-cond-2.c new file mode 100644 index 0000000..c4dc5ab --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-2.c @@ -0,0 +1,49 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdlib.h> +#include <stdio.h> +#include "tree-vect.h" + +#define N 16 + +int c[N] = {3,2,1,10,1,42,3,4,50,9,32,8,11,10,1,2}; +int a[N+1] = {0,16,32,48,64,128,256,512,0,16,32,48,64,128,256,512,1024}; + +__attribute__ ((noinline)) void +foo (int *x) +{ + int i; + int curr_a, flag, next_a; + + curr_a = a[0]; + + for (i = 0; i < N; i++) + { + flag = *x > c[i]; + next_a = a[i+1]; + curr_a = flag ? curr_a : next_a; + } + + *x = curr_a; +} + +int main (void) +{ + int x = 7; + + check_vect (); + + foo (&x); + + if (x != 256) + abort (); + + return 0; +} + +/* The order of computation should not be changed for cond_expr, therefore, + it cannot be vectorized in reduction. */ +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + + diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-3.c b/gcc/testsuite/gcc.dg/vect/vect-cond-3.c new file mode 100644 index 0000000..56cfbb2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-3.c @@ -0,0 +1,66 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdlib.h> +#include <stdio.h> +#include "tree-vect.h" + +#define M 32 +#define N 16 + +int x_in[M]; +int x_out_a[M], x_out_b[M]; +int c[N] = {3,2,1,10,1,42,3,4,50,9,32,8,11,10,1,2}; +int a[N+1] = {0,16,32,48,64,128,256,512,0,16,32,48,64,128,256,512,1024}; +int b[N+1] = {17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}; +int check_result_a[M] = {1024,1024,1024,256,256,256,256,256,256,256,256,128,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48}; +int check_result_b[M] = {17,17,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + +__attribute__ ((noinline)) void +foo () +{ + int j, i, x; + int curr_a, flag, next_a, curr_b, next_b; + + for (j = 0; j < M; j++) + { + x = x_in[j]; + curr_a = a[0]; + curr_b = b[0]; + + for (i = 0; i < N; i++) + { + flag = x > c[i]; + next_a = a[i+1]; + next_b = b[i+1]; + curr_a = flag ? curr_a : next_a; + curr_b = flag ? next_b : curr_b; + } + + x_out_a[j] = curr_a; + x_out_b[j] = curr_b; + } +} + +int main (void) +{ + int i,j; + + check_vect (); + + for (j = 0; j < M; j++) + x_in[j] = j; + + foo (); + + for (j = 0; j < M; j++) + if (x_out_a[j] != check_result_a[j] + || x_out_b[j] != check_result_b[j]) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + + diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-4.c b/gcc/testsuite/gcc.dg/vect/vect-cond-4.c new file mode 100644 index 0000000..c3a1585 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-4.c @@ -0,0 +1,63 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdlib.h> +#include <stdio.h> +#include "tree-vect.h" + +#define M 32 +#define N 16 + +int x_in[M]; +int x_out_a[M], x_out_b[M]; +int c[N] = {3,2,1,10,1,42,3,4,50,9,32,8,11,10,1,2}; +int a[N+1] = {0,16,32,48,64,128,256,512,0,16,32,48,64,128,256,512,1024}; +int b[N+1] = {17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}; +int check_result_a[M] = {1024,1024,1024,256,256,256,256,256,256,256,256,128,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48}; +int check_result_b[M] = {17,17,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + +__attribute__ ((noinline)) void +foo (int z) +{ + int j, i, x; + int curr_a, flag, next_a, curr_b, next_b; + + for (j = 0; j < M; j++) + { + x = x_in[j]; + curr_a = a[0]; + curr_b = b[0]; + + for (i = 0; i < N; i++) + { + curr_a = x > c[i] ? curr_a : z; + curr_b = x > c[i] ? next_b : 5; + } + + x_out_a[j] = curr_a; + x_out_b[j] = curr_b; + } +} + +int main (void) +{ + int i,j; + + check_vect (); + + for (j = 0; j < M; j++) + x_in[j] = j; + + foo (125); + + for (j = 0; j < M; j++) + if (x_out_a[j] != 125 + || x_out_b[j] != 5) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + + diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-5.c b/gcc/testsuite/gcc.dg/vect/vect-cond-5.c new file mode 100644 index 0000000..0996a92 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-5.c @@ -0,0 +1,62 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdarg.h> +#include <stdio.h> +#include "tree-vect.h" + +#define K 32 + +int cond_array[2*K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); +int a[K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); +int out[K]; +int check_result[K] = {2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +__attribute__ ((noinline)) void +foo (int c) +{ + int res, i, j, k, next; + + for (k = 0; k < K; k++) + { + res = 0; + for (j = 0; j < K; j++) + for (i = 0; i < K; i++) + { + next = a[i][j]; + res = c > cond_array[i+k][j] ? next : res; + } + + out[k] = res; + } +} + +int main () +{ + int i, j, k; + + check_vect (); + + for (j = 0; j < K; j++) + { + for (i = 0; i < 2*K; i++) + cond_array[i][j] = i+j; + + for (i = 0; i < K; i++) + a[i][j] = i+2; + } + + foo(5); + + for (k = 0; k < K; k++) + if (out[k] != check_result[k]) + abort (); + + return 0; +} + +/* Double reduction with cond_expr is not supported, since eventhough the order + of computation is the same, but vector results should be reduced to scalar + result, which can'be done for cond_expr. */ +/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + diff --git a/gcc/testsuite/gcc.dg/vect/vect-cond-6.c b/gcc/testsuite/gcc.dg/vect/vect-cond-6.c new file mode 100644 index 0000000..e5e9391 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-cond-6.c @@ -0,0 +1,60 @@ +/* { dg-require-effective-target vect_condition } */ + +#include <stdarg.h> +#include <stdio.h> +#include "tree-vect.h" + +#define K 32 + +int cond_array[2*K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); +int a[K][K] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))); +int out[K]; + +__attribute__ ((noinline)) void +foo (int c) +{ + int res, i, j, k, next; + + for (k = 0; k < K; k++) + { + for (j = 0; j < K; j++) + { + res = 0; + for (i = 0; i < K; i++) + { + next = a[i][j]; + res = c > cond_array[i+k][j] ? next : res; + } + + out[j] = res; + } + } +} + +int main () +{ + int i, j, k; + + check_vect (); + + for (j = 0; j < K; j++) + { + for (i = 0; i < 2*K; i++) + cond_array[i][j] = i+j; + + for (i = 0; i < K; i++) + a[i][j] = i+2; + } + + foo(125); + + for (k = 0; k < K; k++) + if (out[k] != 33) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" } } */ +/* { dg-final { cleanup-tree-dump "vect" } } */ + |