aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-10-27 09:22:07 +0200
committerJakub Jelinek <jakub@redhat.com>2021-10-27 09:22:07 +0200
commit2084b5f42a4432da8b0625f9c669bf690ec46468 (patch)
treeb600a0ba8491e143aec0a29d2b0a761a02673917 /gcc/testsuite
parent6b0f35299bd1468ebc13b900a73b7cac6181a2aa (diff)
downloadgcc-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.c10
-rw-r--r--gcc/testsuite/c-c++-common/gomp/loop-9.c38
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" } */
+ ;
+}