aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-05-29 09:51:43 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-05-29 09:51:43 +0200
commit7e47198b802ed52fb8bb314b75ddf3cd84b2d9f4 (patch)
treee9533c1c58c656e54720467040cf9dc16c2c2968 /libgomp/testsuite
parent357a352fe3a3a96b1a8c321f36a010e3798abdeb (diff)
downloadgcc-7e47198b802ed52fb8bb314b75ddf3cd84b2d9f4.zip
gcc-7e47198b802ed52fb8bb314b75ddf3cd84b2d9f4.tar.gz
gcc-7e47198b802ed52fb8bb314b75ddf3cd84b2d9f4.tar.bz2
gimplify.c (struct gimplify_omp_ctx): Add clauses member.
* gimplify.c (struct gimplify_omp_ctx): Add clauses member. (gimplify_scan_omp_clauses): Initialize ctx->clauses. (gimplify_adjust_omp_clauses_1): Transform lastprivate conditional explicit clause on combined parallel into implicit shared clause. (gimplify_adjust_omp_clauses): Move lastprivate conditional clause and firstprivate if the decl has one too from combined parallel to the worksharing construct. gcc/testsuite/ * c-c++-common/gomp/lastprivate-conditional-2.c (foo): Don't expect sorry on lastprivate conditional on parallel for. * c-c++-common/gomp/lastprivate-conditional-3.c (foo): Add tests for lastprivate conditional warnings on parallel for constructs. * c-c++-common/gomp/lastprivate-conditional-4.c: New test. libgomp/ * testsuite/libgomp.c-c++-common/lastprivate_conditional_4.c: Rename to ... * testsuite/libgomp.c-c++-common/lastprivate-conditional-4.c: ... this. * testsuite/libgomp.c-c++-common/lastprivate-conditional-5.c: New test. * testsuite/libgomp.c-c++-common/lastprivate-conditional-6.c: New test. From-SVN: r271733
Diffstat (limited to 'libgomp/testsuite')
-rw-r--r--libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-4.c (renamed from libgomp/testsuite/libgomp.c-c++-common/lastprivate_conditional_4.c)0
-rw-r--r--libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-5.c143
-rw-r--r--libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-6.c159
3 files changed, 302 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c-c++-common/lastprivate_conditional_4.c b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-4.c
index bc102a1..bc102a1 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/lastprivate_conditional_4.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-4.c
diff --git a/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-5.c b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-5.c
new file mode 100644
index 0000000..de6b9a8
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-5.c
@@ -0,0 +1,143 @@
+/* { dg-do run } */
+/* { dg-require-effective-target tls_runtime } */
+/* { dg-additional-options "-std=gnu99" {target c } } */
+
+#include <omp.h>
+#include <stdlib.h>
+
+int r, s, u, v, r2, s2, u2, v2, r3, s3, u3, v3;
+long long w, w2, w3, p, p2, p3;
+int *x, *x2, *x3;
+short y, y2, y3;
+int z;
+int thr1, thr2;
+#pragma omp threadprivate (thr1, thr2)
+
+void
+foo (int *a, long long int b, long long int c)
+{
+ int i;
+ long long j;
+ #pragma omp parallel for lastprivate (conditional: u, x)
+ for (i = 15; i < 64; i++)
+ {
+ if ((a[i] % 5) == 3)
+ u = i;
+ if ((a[i] % 7) == 2)
+ x = &a[i];
+ }
+ #pragma omp parallel for lastprivate (conditional: v) reduction (+:r, s) schedule (nonmonotonic: static)
+ for (i = -3; i < 119; i += 2)
+ {
+ ++s;
+ if ((a[i + 4] % 11) == 9)
+ v = i;
+ else
+ ++r;
+ }
+ #pragma omp parallel for schedule (monotonic: static) lastprivate (conditional: w)
+ for (j = b; j < b + 115 * c; j += (b & 3) + 7)
+ if ((a[j] % 13) == 5)
+ w = j * 2;
+ #pragma omp parallel for schedule (auto) lastprivate (conditional: p) collapse(3)
+ for (i = -5; i < (int) (b + 5); i += 2)
+ for (j = b + 12 + c; j > b; --j)
+ for (int k = 0; k < 5; k += c)
+ if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6)
+ p = i * 10000 + j * 100 + k;
+
+ #pragma omp parallel for schedule (nonmonotonic: static, 2) lastprivate (conditional: u2, x2)
+ for (i = 15; i < 64; i++)
+ {
+ if ((a[i] % 5) == 3)
+ u2 = i;
+ if ((a[i] % 7) == 2)
+ x2 = &a[i];
+ }
+ #pragma omp parallel for schedule (static, 3) lastprivate (conditional: v2) reduction (+:r2, s2)
+ for (i = -3; i < 119; i += 2)
+ {
+ ++s2;
+ if ((a[i + 4] % 11) == 9)
+ v2 = i;
+ else
+ ++r2;
+ }
+ #pragma omp parallel for lastprivate (conditional: w2) schedule (static, 1)
+ for (j = b; j < b + 115 * c; j += (b & 3) + 7)
+ if ((a[j] % 13) == 5)
+ w2 = j * 2;
+ #pragma omp parallel for schedule (static, 3) collapse (3) lastprivate (conditional: p2)
+ for (i = -5; i < (int) (b + 5); i += 2)
+ for (j = b + 12 + c; j > b; --j)
+ for (int k = 0; k < 5; k += c)
+ if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6)
+ p2 = i * 10000 + j * 100 + k;
+
+ #pragma omp parallel for lastprivate (conditional: u3, x3) schedule (runtime)
+ for (i = 15; i < 64; i++)
+ {
+ if ((a[i] % 5) == 3)
+ u3 = i;
+ if ((a[i] % 7) == 2)
+ x3 = &a[i];
+ }
+ #pragma omp parallel for lastprivate (conditional: v3) reduction (+:r3, s3) schedule (nonmonotonic: dynamic)
+ for (i = -3; i < 119; i += 2)
+ {
+ ++s3;
+ if ((a[i + 4] % 11) == 9)
+ v3 = i;
+ else
+ ++r3;
+ }
+ #pragma omp parallel for schedule (monotonic: guided, 3) lastprivate (conditional: w3)
+ for (j = b; j < b + 115 * c; j += (b & 3) + 7)
+ if ((a[j] % 13) == 5)
+ w3 = j * 2;
+ #pragma omp parallel for schedule (dynamic, 4) lastprivate (conditional: p3) collapse(3)
+ for (i = -5; i < (int) (b + 5); i += 2)
+ for (j = b + 12 + c; j > b; --j)
+ for (int k = 0; k < 5; k += c)
+ if (((((i + 5) * 13 + (13 - j)) * 5 + k) % 17) == 6)
+ p3 = i * 10000 + j * 100 + k;
+
+ /* Nasty testcase, verify that even a no-op assignment is accounted
+ for in lastprivate(conditional:). */
+ #pragma omp parallel for schedule (monotonic: static, 2) firstprivate (z) \
+ lastprivate (conditional: z)
+ for (int k = -2000; k < 8000; ++k)
+ {
+ if (k < 3000 && (k & 3) == 1)
+ {
+ z = k;
+ thr1 = k;
+ }
+ else if (k == 7931)
+ {
+ z = z;
+ thr2 = 1;
+ }
+ }
+
+ if (thr2 && z != thr1)
+ abort ();
+}
+
+int
+main ()
+{
+ int a[128], i;
+ volatile int j = 0;
+ for (i = 0; i < 128; i++)
+ a[i] = i;
+ w = 1234;
+ foo (a, j, j + 1);
+ if (u != 63 || v != 115 || w != 140 || x != &a[58] || r != 55 || s != 61 || p != 30104)
+ abort ();
+ if (u2 != 63 || v2 != 115 || w2 != 140 || x2 != &a[58] || r2 != 55 || s2 != 61 || p2 != 30104)
+ abort ();
+ if (u3 != 63 || v3 != 115 || w3 != 140 || x3 != &a[58] || r3 != 55 || s3 != 61 || p3 != 30104)
+ abort ();
+ return 0;
+}
diff --git a/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-6.c b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-6.c
new file mode 100644
index 0000000..d213793
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-c++-common/lastprivate-conditional-6.c
@@ -0,0 +1,159 @@
+#include <stdlib.h>
+
+int x;
+long long y;
+int r, s, t;
+
+void
+foo (const char *a)
+{
+ #pragma omp parallel sections lastprivate (conditional: x, y)
+ {
+ if (a[0])
+ x = a[0];
+ #pragma omp section
+ {
+ if (a[1])
+ x = a[1];
+ if (a[2])
+ y = a[2];
+ }
+ #pragma omp section
+ if (a[3])
+ y = a[3];
+ #pragma omp section
+ if (a[4])
+ x = a[4];
+ #pragma omp section
+ {
+ if (a[5])
+ x = a[5];
+ if (a[6])
+ y = a[6];
+ }
+ }
+}
+
+void
+bar (const char *a)
+{
+ #pragma omp parallel sections lastprivate (conditional: x, y) reduction (task, +: t)
+ {
+ if (a[0])
+ x = a[0];
+ #pragma omp section
+ {
+ if (a[1])
+ x = a[1];
+ if (a[2])
+ y = a[2];
+ #pragma omp task in_reduction (+: t)
+ t++;
+ }
+ #pragma omp section
+ if (a[3])
+ y = a[3];
+ #pragma omp section
+ if (a[4])
+ x = a[4];
+ #pragma omp section
+ {
+ #pragma omp task in_reduction (+: t)
+ ++t;
+ if (a[5])
+ x = a[5];
+ if (a[6])
+ y = a[6];
+ }
+ }
+}
+
+void
+baz (const char *a)
+{
+ #pragma omp parallel sections lastprivate (conditional: x, y) reduction (+: r, s)
+ {
+ if (a[0])
+ x = a[0];
+ #pragma omp section
+ {
+ if (a[1])
+ x = a[1];
+ ++r;
+ ++s;
+ if (a[2])
+ y = a[2];
+ }
+ #pragma omp section
+ if (a[3])
+ y = a[3];
+ #pragma omp section
+ {
+ ++s;
+ if (a[4])
+ x = a[4];
+ }
+ #pragma omp section
+ {
+ if (a[5])
+ x = a[5];
+ if (a[6])
+ y = a[6];
+ ++s;
+ }
+ }
+}
+
+int
+main ()
+{
+ foo ("\0\1\2\3\0\5");
+ if (x != 5 || y != 3)
+ abort ();
+
+ foo ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7)
+ abort ();
+
+ foo ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1)
+ abort ();
+
+ foo ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3)
+ abort ();
+
+ bar ("\0\1\2\4\0\5");
+ if (x != 5 || y != 4 || t != 2)
+ abort ();
+
+ bar ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7 || t != 4)
+ abort ();
+
+ bar ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1 || t != 6)
+ abort ();
+
+ bar ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3 || t != 8)
+ abort ();
+
+ baz ("\0\1\2\4\0\5");
+ if (x != 5 || y != 4 || r != 1 || s != 3)
+ abort ();
+
+ baz ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7 || r != 2 || s != 6)
+ abort ();
+
+ baz ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1 || r != 3 || s != 9)
+ abort ();
+
+ baz ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3 || r != 4 || s != 12)
+ abort ();
+
+ return 0;
+}