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 /gcc/testsuite | |
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 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/loop-8.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/loop-9.c | 38 |
2 files changed, 48 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/gomp/loop-8.c b/gcc/testsuite/c-c++-common/gomp/loop-8.c new file mode 100644 index 0000000..d66bbcd --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/loop-8.c @@ -0,0 +1,10 @@ +void +foo (void) +{ + int a[1024]; + int *p, *q; + #pragma omp parallel for collapse(2) + for (p = &a[0]; p < &a[512]; p++) + for (q = p + 64; q < p + 128; q++) + ; +} diff --git a/gcc/testsuite/c-c++-common/gomp/loop-9.c b/gcc/testsuite/c-c++-common/gomp/loop-9.c new file mode 100644 index 0000000..a64ad98 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/loop-9.c @@ -0,0 +1,38 @@ +int *qux (int *); + +void +foo (void) +{ + int a[1024]; + int *p; + short *q; + __PTRDIFF_TYPE__ r; + #pragma omp parallel for collapse(2) + for (p = &a[0]; p < &a[512]; p++) + for (q = (short *) p + 64; q < (short *) p + 128; q++) /* { dg-error "outer iteration variable 'p' used in initializer expression has type other than 'short int ?\\\*'" } */ + ; + #pragma omp parallel for collapse(2) + for (p = &a[0]; p < &a[512]; p++) + for (r = &a[32] - p; r < 32; r++) /* { dg-error "initializer expression refers to iteration variable 'p'" } */ + ; + #pragma omp parallel for collapse(2) + for (r = 0; r < 64; r++) + for (p = &a[0] + r; p < &a[32] + 3 * r; p++) /* { dg-error "initializer expression refers to iteration variable 'r'" } */ + ; +} + +void +bar (void) +{ + int a[1024]; + int *p, *q, *r; + #pragma omp parallel for collapse(2) + for (p = &a[0]; p < &a[512]; p++) + for (q = p + (&a[16] - qux (p)); q < &a[32]; q++) /* { dg-error "initializer expression refers to iteration variable 'p'" } */ + ; + #pragma omp parallel for collapse(3) + for (p = &a[0]; p < &a[512]; p++) + for (q = &a[0]; q < &a[512]; q++) + for (r = p; r < q + 32; r++) /* { dg-error "two different outer iteration variables 'p' and 'q' used in a single loop" } */ + ; +} |