diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-10-27 09:22:07 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-10-27 09:22:07 +0200 |
commit | 2084b5f42a4432da8b0625f9c669bf690ec46468 (patch) | |
tree | b600a0ba8491e143aec0a29d2b0a761a02673917 /libgomp/testsuite/libgomp.c/loop-27.c | |
parent | 6b0f35299bd1468ebc13b900a73b7cac6181a2aa (diff) | |
download | gcc-2084b5f42a4432da8b0625f9c669bf690ec46468.zip gcc-2084b5f42a4432da8b0625f9c669bf690ec46468.tar.gz gcc-2084b5f42a4432da8b0625f9c669bf690ec46468.tar.bz2 |
openmp: Allow non-rectangular loops with pointer iterators
This patch handles pointer iterators for non-rectangular loops. They are
more limited than integral iterators of non-rectangular loops, in particular
only var-outer, var-outer + a2, a2 + var-outer or var-outer - a2 can appear
in lb or ub where a2 is some integral loop invariant expression, so no e.g.
multiplication etc.
2021-10-27 Jakub Jelinek <jakub@redhat.com>
gcc/
* omp-expand.c (expand_omp_for_init_counts): Handle non-rectangular
iterators with pointer types.
(expand_omp_for_init_vars, extract_omp_for_update_vars): Likewise.
gcc/c-family/
* c-omp.c (c_omp_check_loop_iv_r): Don't clear 3rd bit for
POINTER_PLUS_EXPR.
(c_omp_check_nonrect_loop_iv): Handle POINTER_PLUS_EXPR.
(c_omp_check_loop_iv): Set kind even if the iterator is non-integral.
gcc/testsuite/
* c-c++-common/gomp/loop-8.c: New test.
* c-c++-common/gomp/loop-9.c: New test.
libgomp/
* testsuite/libgomp.c/loop-26.c: New test.
* testsuite/libgomp.c/loop-27.c: New test.
Diffstat (limited to 'libgomp/testsuite/libgomp.c/loop-27.c')
-rw-r--r-- | libgomp/testsuite/libgomp.c/loop-27.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c/loop-27.c b/libgomp/testsuite/libgomp.c/loop-27.c new file mode 100644 index 0000000..3353b87 --- /dev/null +++ b/libgomp/testsuite/libgomp.c/loop-27.c @@ -0,0 +1,180 @@ +/* { dg-do run } */ + +extern void abort (void); + +int x; +short *i, *j; +int ii, jj; +short *volatile a; +short *volatile b; +volatile int c, e, f, g; +short *volatile d; +int k[11][20]; +short v[84]; + +int +main () +{ + int niters; + for (ii = 1; ii <= 10; ii++) + for (jj = 1; jj <= ii + 5; jj++) + k[ii][jj] = 1; + a = &v[42 + 1]; b = &v[42 + 11]; c = 1; d = &v[42 + 1]; e = 6; f = 1; + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = &v[42 + 1]; i <= &v[42 + 10]; i++) + for (j = &v[42 + 1]; j <= i + 5; j++) + { + if (i < &v[42 + 1] || i > &v[42 + 10] || j < &v[42 + 1] || j > i + 5 || k[i - &v[42]][j - &v[42]] != 1) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 11] || j != &v[42 + 16] || x != 10255 || niters != 105) + abort (); + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = a; i < b; i += c) + for (j = d; j < e + i; j += f) + { + if (i < &v[42 + 1] || i > &v[42 + 10] || j < &v[42 + 1] || j > i + 5 || k[i - &v[42]][j - &v[42]] != 2) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 11] || j != &v[42 + 16] || x != 10255 || niters != 105) + abort (); + for (ii = 1; ii <= 10; ii++) + for (jj = 1; jj <= ii + 5; jj++) + if (k[ii][jj] == 3) + k[ii][jj] = 0; + else + abort (); + for (ii = 0; ii < 11; ii++) + for (jj = 0; jj < 20; jj++) + if (k[ii][jj] != 0) + abort (); + for (ii = 0; ii < 10; ii++) + for (jj = 0; jj < ii; jj++) + k[ii][jj] = 1; + a = &v[42]; b = &v[42 + 10]; c = 1; d = &v[42]; e = 0; f = 1; + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = &v[42]; i < &v[42 + 10]; i++) + for (j = &v[42]; j < i; j++) + { + if (i < &v[42] || i >= &v[42 + 10] || j < &v[42] || j >= i || k[i - &v[42]][j - &v[42]] != 1) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 10] || j != &v[42 + 9] || x != 9224 || niters != 45) + abort (); + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = a; i < b; i += c) + for (j = d; j < i - e; j += f) + { + if (i < &v[42] || i >= &v[42 + 10] || j < &v[42] || j >= i || k[i - &v[42]][j - &v[42]] != 2) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 10] || j != &v[42 + 9] || x != 9224 || niters != 45) + abort (); + for (ii = 0; ii < 10; ii++) + for (jj = 0; jj < ii; jj++) + if (k[ii][jj] == 3) + k[ii][jj] = 0; + else + abort (); + for (ii = 0; ii < 11; ii++) + for (jj = 0; jj < 20; jj++) + if (k[ii][jj] != 0) + abort (); + for (ii = 0; ii < 10; ii++) + for (jj = ii + 1; jj < ii + 4; jj++) + k[ii][jj] = 1; + a = &v[42]; b = &v[42 + 10]; c = 1; e = 1; f = 1; g = -4; + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = &v[42]; i < &v[42 + 10]; i++) + for (j = i + 1; j < i + 4; j++) + { + if (i < &v[42] || i >= &v[42 + 10] || j < i + 1 || j >= i + 4 || k[i - &v[42]][j - &v[42]] != 1) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 10] || j != &v[42 + 13] || x != 9228 || niters != 30) + abort (); + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = a; i < b; i += c) + for (j = i + e; j < i - g; j += f) + { + if (i < &v[42] || i >= &v[42 + 10] || j < i + 1 || j >= i + 4 || k[i - &v[42]][j - &v[42]] != 2) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 10] || j != &v[42 + 13] || x != 9228 || niters != 30) + abort (); + for (ii = 0; ii < 10; ii++) + for (jj = ii + 1; jj < ii + 4; jj++) + if (k[ii][jj] == 3) + k[ii][jj] = 0; + else + abort (); + for (ii = 0; ii < 11; ii++) + for (jj = 0; jj < 20; jj++) + if (k[ii][jj] != 0) + abort (); + for (ii = 1; ii < 10; ii += 2) + for (jj = 1; jj < ii + 1; jj++) + k[ii][jj] = 1; + a = &v[42 + 1]; b = &v[42 + 10]; c = 2; d = &v[42 + 1]; e = 1; f = 1; + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = &v[42 + 1]; i < &v[42 + 10]; i += 2) + for (j = &v[42 + 1]; j < i + 1; j++) + { + if (i < &v[42 + 1] || i >= &v[42 + 10] || j < &v[42 + 1] || j >= i + 1 || k[i - &v[42]][j - &v[42]] != 1) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 11] || j != &v[42 + 10] || x != 9225 || niters != 25) + abort (); + niters = 0; i = &v[0]; j = &v[0]; x = -100; + #pragma omp parallel for collapse(2) lastprivate (i, j, x) reduction(+:niters) + for (i = a; i < b; i += c) + for (j = d; j < i + e; j += f) + { + if (i < &v[42 + 1] || i >= &v[42 + 10] || j < &v[42 + 1] || j >= i + 1 || k[i - &v[42]][j - &v[42]] != 2) + abort (); + k[i - &v[42]][j - &v[42]]++; + x = (i - &v[42]) * 1024 + ((j - &v[42]) & 1023); + niters++; + } + if (i != &v[42 + 11] || j != &v[42 + 10] || x != 9225 || niters != 25) + abort (); + for (ii = 1; ii < 10; ii += 2) + for (jj = 1; jj < ii + 1; jj++) + if (k[ii][jj] == 3) + k[ii][jj] = 0; + else + abort (); + for (ii = 0; ii < 11; ii++) + for (jj = 0; jj < 20; jj++) + if (k[ii][jj] != 0) + abort (); + return 0; +} |