* 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
+2019-05-29 Jakub Jelinek <jakub@redhat.com>
+
+ * 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.
+
2019-05-28 Bill Schmidt <wschmidt@linux.ibm.com>
Michael Meissner <meissner@linux.ibm.com>
struct gimplify_omp_ctx *outer_context;
splay_tree variables;
hash_set<tree> *privatized_types;
+ tree clauses;
/* Iteration variables in an OMP_FOR. */
vec<tree> loop_iter_var;
location_t location;
struct gimplify_omp_ctx *ctx, *outer_ctx;
tree c;
hash_map<tree, tree> *struct_map_to_clause = NULL;
- tree *prev_list_p = NULL;
+ tree *prev_list_p = NULL, *orig_list_p = list_p;
int handled_depend_iterators = -1;
int nowait = -1;
}
if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c))
{
- if (code == OMP_FOR || code == OMP_SECTIONS)
+ if (code == OMP_FOR
+ || code == OMP_SECTIONS
+ || region_type == ORT_COMBINED_PARALLEL)
flags |= GOVD_LASTPRIVATE_CONDITIONAL;
else
{
list_p = &OMP_CLAUSE_CHAIN (c);
}
+ ctx->clauses = *orig_list_p;
gimplify_omp_ctxp = ctx;
if (struct_map_to_clause)
delete struct_map_to_clause;
tree clause;
bool private_debug;
+ if (gimplify_omp_ctxp->region_type == ORT_COMBINED_PARALLEL
+ && (flags & GOVD_LASTPRIVATE_CONDITIONAL) != 0)
+ flags = GOVD_SHARED | GOVD_SEEN | GOVD_WRITTEN;
if (flags & (GOVD_EXPLICIT | GOVD_LOCAL))
return 0;
if ((flags & GOVD_SEEN) == 0)
omp_find_stores_op, &wi);
}
}
+
+ if (ctx->region_type == ORT_WORKSHARE
+ && ctx->outer_context
+ && ctx->outer_context->region_type == ORT_COMBINED_PARALLEL)
+ {
+ for (c = ctx->outer_context->clauses; c; c = OMP_CLAUSE_CHAIN (c))
+ if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
+ && OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c))
+ {
+ decl = OMP_CLAUSE_DECL (c);
+ splay_tree_node n
+ = splay_tree_lookup (ctx->outer_context->variables,
+ (splay_tree_key) decl);
+ gcc_checking_assert (!splay_tree_lookup (ctx->variables,
+ (splay_tree_key) decl));
+ omp_add_variable (ctx, decl, n->value);
+ tree c2 = copy_node (c);
+ OMP_CLAUSE_CHAIN (c2) = *list_p;
+ *list_p = c2;
+ if ((n->value & GOVD_FIRSTPRIVATE) == 0)
+ continue;
+ c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c),
+ OMP_CLAUSE_FIRSTPRIVATE);
+ OMP_CLAUSE_DECL (c2) = decl;
+ OMP_CLAUSE_CHAIN (c2) = *list_p;
+ *list_p = c2;
+ }
+ }
while ((c = *list_p) != NULL)
{
splay_tree_node n;
decl = OMP_CLAUSE_DECL (c);
n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl);
remove = !(n->value & GOVD_SEEN);
+ if ((n->value & GOVD_LASTPRIVATE_CONDITIONAL) != 0
+ && code == OMP_PARALLEL
+ && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
+ remove = true;
if (! remove)
{
bool shared = OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED;
&& DECL_P (decl)
&& omp_shared_to_firstprivate_optimizable_decl_p (decl))
omp_mark_stores (gimplify_omp_ctxp->outer_context, decl);
+ if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (c) && code == OMP_PARALLEL)
+ remove = true;
break;
case OMP_CLAUSE_ALIGNED:
2019-05-29 Jakub Jelinek <jakub@redhat.com>
+ * 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.
+
PR c/90628
* c-c++-common/builtin-arith-overflow-3.c: New test.
for (i = 0; i < 32; i++)
if (p[i])
c = i;
- #pragma omp parallel for lastprivate (conditional: d) /* { dg-message "not supported yet" } */
+ #pragma omp parallel for lastprivate (conditional: d)
for (i = 0; i < 32; i++)
if (p[i])
d = i;
for (k = 0; k < 2; ++k)
;
}
+ #pragma omp parallel for lastprivate (conditional: i) /* { dg-warning "conditional 'lastprivate' on loop iterator 'i' ignored" } */
+ for (i = 0; i < 32; i++)
+ ;
+ #pragma omp parallel for collapse (3) lastprivate (conditional: i) /* { dg-warning "conditional 'lastprivate' on loop iterator 'i' ignored" } */
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; ++j)
+ for (k = 0; k < 2; ++k)
+ ;
+ #pragma omp parallel for collapse (3) lastprivate (conditional: j) /* { dg-warning "conditional 'lastprivate' on loop iterator 'j' ignored" } */
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; ++j)
+ for (k = 0; k < 2; ++k)
+ ;
+ #pragma omp parallel for collapse (3) lastprivate (conditional: k) /* { dg-warning "conditional 'lastprivate' on loop iterator 'k' ignored" } */
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 32; ++j)
+ for (k = 0; k < 2; ++k)
+ ;
}
--- /dev/null
+int x = 6, w = 8;
+int bar (int);
+
+void
+foo ()
+{
+ int y = 5, i;
+ #pragma omp teams num_teams(1) firstprivate (x) shared (y) shared (w)
+ {
+ int z = 7;
+ #pragma omp parallel for firstprivate (x, y, z, w) lastprivate (conditional: x, y, z, w)
+ for (i = 0; i < 64; i++)
+ if (bar (i))
+ {
+ x = i;
+ y = i + 1;
+ z = i + 2;
+ w = i + 3;
+ }
+ bar (y);
+ bar (z);
+ }
+}
+2019-05-29 Jakub Jelinek <jakub@redhat.com>
+
+ * 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.
+
2019-05-27 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c-c++-common/lastprivate_conditional_4.c: New test.
--- /dev/null
+#include <stdlib.h>
+
+int x;
+long long y;
+int r, s, t;
+
+void
+foo (const char *a)
+{
+ #pragma omp 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 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 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 ()
+{
+ #pragma omp parallel
+ {
+ foo ("\0\1\2\3\0\5");
+ if (x != 5 || y != 3)
+ abort ();
+ #pragma omp barrier
+ foo ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7)
+ abort ();
+ #pragma omp barrier
+ foo ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1)
+ abort ();
+ #pragma omp barrier
+ foo ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3)
+ abort ();
+ #pragma omp barrier
+ bar ("\0\1\2\4\0\5");
+ if (x != 5 || y != 4 || t != 2)
+ abort ();
+ #pragma omp barrier
+ bar ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7 || t != 4)
+ abort ();
+ #pragma omp barrier
+ bar ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1 || t != 6)
+ abort ();
+ #pragma omp barrier
+ bar ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3 || t != 8)
+ abort ();
+ #pragma omp barrier
+ baz ("\0\1\2\4\0\5");
+ if (x != 5 || y != 4 || r != 1 || s != 3)
+ abort ();
+ #pragma omp barrier
+ baz ("\6\0\0\0\0\0\7");
+ if (x != 6 || y != 7 || r != 2 || s != 6)
+ abort ();
+ #pragma omp barrier
+ baz ("\7\6\5\4\3\2\1");
+ if (x != 2 || y != 1 || r != 3 || s != 9)
+ abort ();
+ #pragma omp barrier
+ baz ("\0\0\4\3\0\7");
+ if (x != 7 || y != 3 || r != 4 || s != 12)
+ abort ();
+ }
+ return 0;
+}
--- /dev/null
+/* { 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;
+}
--- /dev/null
+#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;
+}
+++ /dev/null
-#include <stdlib.h>
-
-int x;
-long long y;
-int r, s, t;
-
-void
-foo (const char *a)
-{
- #pragma omp 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 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 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 ()
-{
- #pragma omp parallel
- {
- foo ("\0\1\2\3\0\5");
- if (x != 5 || y != 3)
- abort ();
- #pragma omp barrier
- foo ("\6\0\0\0\0\0\7");
- if (x != 6 || y != 7)
- abort ();
- #pragma omp barrier
- foo ("\7\6\5\4\3\2\1");
- if (x != 2 || y != 1)
- abort ();
- #pragma omp barrier
- foo ("\0\0\4\3\0\7");
- if (x != 7 || y != 3)
- abort ();
- #pragma omp barrier
- bar ("\0\1\2\4\0\5");
- if (x != 5 || y != 4 || t != 2)
- abort ();
- #pragma omp barrier
- bar ("\6\0\0\0\0\0\7");
- if (x != 6 || y != 7 || t != 4)
- abort ();
- #pragma omp barrier
- bar ("\7\6\5\4\3\2\1");
- if (x != 2 || y != 1 || t != 6)
- abort ();
- #pragma omp barrier
- bar ("\0\0\4\3\0\7");
- if (x != 7 || y != 3 || t != 8)
- abort ();
- #pragma omp barrier
- baz ("\0\1\2\4\0\5");
- if (x != 5 || y != 4 || r != 1 || s != 3)
- abort ();
- #pragma omp barrier
- baz ("\6\0\0\0\0\0\7");
- if (x != 6 || y != 7 || r != 2 || s != 6)
- abort ();
- #pragma omp barrier
- baz ("\7\6\5\4\3\2\1");
- if (x != 2 || y != 1 || r != 3 || s != 9)
- abort ();
- #pragma omp barrier
- baz ("\0\0\4\3\0\7");
- if (x != 7 || y != 3 || r != 4 || s != 12)
- abort ();
- }
- return 0;
-}