aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-07-20 13:21:42 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-07-20 13:21:42 +0200
commit554a530ff81870098572832eed8ca00b3593bb41 (patch)
tree7d7930d120a4adebe92eebe4c63a801388f5a6a5 /libgomp
parentb6339213ff68ac5a87b7fdda878f26b52d801b76 (diff)
downloadgcc-554a530ff81870098572832eed8ca00b3593bb41.zip
gcc-554a530ff81870098572832eed8ca00b3593bb41.tar.gz
gcc-554a530ff81870098572832eed8ca00b3593bb41.tar.bz2
tree.def (OMP_LOOP): New tree code.
* tree.def (OMP_LOOP): New tree code. * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE_BIND. (enum omp_clause_bind_kind): New enum. (struct tree_omp_clause): Add subcode.bind_kind. * tree.h (OMP_LOOP_CHECK): Rename to ... (OMP_LOOPING_CHECK): ... this. (OMP_FOR_BODY, OMP_FOR_CLAUSES, OMP_FOR_INIT, OMP_FOR_COND, OMP_FOR_INCR, OMP_FOR_PRE_BODY, OMP_FOR_ORIG_DECLS): Use OMP_LOOPING_CHECK instead of OMP_LOOP_CHECK. (OMP_CLAUSE_BIND_KIND): Define. * tree.c (omp_clause_num_ops, omp_clause_code_name): Add bind clause entries. (walk_tree_1): Handle OMP_CLAUSE_BIND. * tree-pretty-print.c (dump_omp_clause): Likewise. (dump_generic_node): Handle OMP_LOOP. * gimplify.c (enum omp_region_type): Add ORT_IMPLICIT_TARGET. (in_omp_construct): New variable. (is_gimple_stmt): Handle OMP_LOOP. (gimplify_scan_omp_clauses): For lastprivate don't set check_non_private if code == OMP_LOOP. For reduction clause on OMP_LOOP combined with parallel or teams propagate as shared on the combined construct. Handle OMP_CLAUSE_BIND. (gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_BIND. (gimplify_omp_for): Pass OMP_LOOP instead of OMP_{FOR,DISTRIBUTE} for constructs from a loop construct to gimplify_scan_omp_clauses. Don't predetermine iterator linear on OMP_SIMD from loop construct. (replace_reduction_placeholders, gimplify_omp_loop): New functions. (gimplify_omp_workshare): Use ORT_IMPLICIT_TARGET instead of trying to match the implicit ORT_TARGET construct around whole body. Temporarily clear in_omp_construct when processing body. (gimplify_expr): Handle OMP_LOOP. For OMP_MASTER, OMP_TASKGROUP etc. temporarily set in_omp_construct when processing body. (gimplify_body): Create ORT_IMPLICIT_TARGET instead of ORT_TARGET. * omp-low.c (struct omp_context): Add loop_p. (build_outer_var_ref): Treat ctx->loop_p similarly to simd construct in that the original var might be private. (scan_sharing_clauses): Handle OMP_CLAUSE_BIND. (check_omp_nesting_restrictions): Adjust nesting restrictions for addition of loop construct. (scan_omp_1_stmt): Allow setjmp inside of loop construct. gcc/c-family/ * c-pragma.h (enum pragma_kind): Add PRAGMA_OMP_LOOP. (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_BIND. * c-pragma.c (omp_pragmas_simd): Add PRAGMA_OMP_LOOP entry. * c-common.h (enum c_omp_clause_split): Add C_OMP_CLAUSE_SPLIT_LOOP. * c-omp.c (c_omp_split_clauses): Add support for 4 new combined constructs with the loop construct. gcc/c/ * c-parser.c (c_parser_omp_clause_name): Handle bind clause. (c_parser_omp_clause_bind): New function. (c_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_BIND. (OMP_LOOP_CLAUSE_MASK): Define. (c_parser_omp_loop): New function. (c_parser_omp_parallel, c_parser_omp_teams): Handle parsing of loop combined with parallel or teams. (c_parser_omp_construct): Handle PRAGMA_OMP_LOOP. * c-typeck.c (c_finish_omp_clauses): Handle OMP_CLAUSE_BIND. gcc/cp/ * cp-tree.h (OMP_FOR_GIMPLIFYING_P): Use OMP_LOOPING_CHECK instead of OMP_LOOP_CHECK. * parser.c (cp_parser_omp_clause_name): Handle bind clause. (cp_parser_omp_clause_bind): New function. (cp_parser_omp_all_clauses): Handle PRAGMA_OMP_CLAUSE_BIND. (OMP_LOOP_CLAUSE_MASK): Define. (cp_parser_omp_loop): New function. (cp_parser_omp_parallel, cp_parser_omp_teams): Handle parsing of loop combined with parallel or teams. (cp_parser_omp_construct): Handle PRAGMA_OMP_LOOP. (cp_parser_pragma): Likewise. * pt.c (tsubst_expr): Handle OMP_LOOP. * semantics.c (finish_omp_clauses): Handle OMP_CLAUSE_BIND. gcc/testsuite/ * c-c++-common/gomp/cancel-1.c: Adjust expected diagnostic wording. * c-c++-common/gomp/clauses-1.c (foo, baz, bar): Add order(concurrent) clause where allowed. Add combined constructs with loop with all possible clauses. (qux): New function. * c-c++-common/gomp/loop-1.c: New test. * c-c++-common/gomp/loop-2.c: New test. * c-c++-common/gomp/loop-3.c: New test. * c-c++-common/gomp/loop-4.c: New test. * c-c++-common/gomp/loop-5.c: New test. * c-c++-common/gomp/order-3.c: Adjust expected diagnostic wording. * c-c++-common/gomp/simd-setjmp-1.c: New test. * c-c++-common/gomp/teams-2.c: Adjust expected diagnostic wording. libgomp/ * testsuite/libgomp.c-c++-common/loop-1.c: New test. From-SVN: r273621
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog4
-rw-r--r--libgomp/testsuite/libgomp.c-c++-common/loop-1.c127
2 files changed, 131 insertions, 0 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 53125a5..547ce4e 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,7 @@
+2019-07-20 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/libgomp.c-c++-common/loop-1.c: New test.
+
2019-07-08 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c++/scan-13.C: Replace xfail with target x86.
diff --git a/libgomp/testsuite/libgomp.c-c++-common/loop-1.c b/libgomp/testsuite/libgomp.c-c++-common/loop-1.c
new file mode 100644
index 0000000..de69608
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c-c++-common/loop-1.c
@@ -0,0 +1,127 @@
+extern
+#ifdef __cplusplus
+"C"
+#endif
+void abort (void);
+#define N 256
+int r;
+
+void
+foo (int *a)
+{
+ int i, j;
+ #pragma omp loop bind(thread) order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1)
+ for (i = 0; i < N; i++)
+ {
+ j = i - 2;
+ a[i] = j;
+ r += j;
+ }
+}
+
+void
+bar (int *a)
+{
+ int i, j;
+ #pragma omp loop bind(parallel) order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1)
+ for (i = 0; i < N; i++)
+ {
+ j = i;
+ a[i] = j;
+ r += j;
+ }
+}
+
+void
+baz (int *a)
+{
+ int i, j;
+ #pragma omp loop bind(teams) order(concurrent) private (j) lastprivate (i) reduction(+:r)
+ for (i = 0; i < N; i++)
+ {
+ j = i + 2;
+ a[i] = j;
+ r += j;
+ }
+}
+
+int
+main ()
+{
+ int a[N], i, j;
+ foo (a);
+ for (i = 0; i < N; ++i)
+ if (a[i] != i - 2)
+ abort ();
+ else
+ a[i] = -35;
+ if (r != N * (N - 5) / 2)
+ abort ();
+ else
+ r = 0;
+ bar (a);
+ for (i = 0; i < N; ++i)
+ if (a[i] != i)
+ abort ();
+ else
+ a[i] = -35;
+ if (r != N * (N - 1) / 2)
+ abort ();
+ else
+ r = 0;
+ #pragma omp parallel loop private (j) lastprivate (i) reduction(+:r)
+ for (i = 0; i < N; i++)
+ {
+ j = i + 4;
+ a[i] = j;
+ r += j;
+ }
+ if (i != N)
+ abort ();
+ for (i = 0; i < N; ++i)
+ if (a[i] != i + 4)
+ abort ();
+ else
+ a[i] = -35;
+ if (r != N * (N + 7) / 2)
+ abort ();
+ else
+ r = 0;
+ #pragma omp parallel
+ bar (a);
+ for (i = 0; i < N; ++i)
+ if (a[i] != i)
+ abort ();
+ else
+ a[i] = -35;
+ if (r != N * (N - 1) / 2)
+ abort ();
+ else
+ r = 0;
+ #pragma omp teams
+ baz (a);
+ for (i = 0; i < N; ++i)
+ if (a[i] != i + 2)
+ abort ();
+ else
+ a[i] = -35;
+ if (r != N * (N + 3) / 2)
+ abort ();
+ else
+ r = 0;
+ #pragma omp teams loop order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1)
+ for (i = 0; i < N; i++)
+ {
+ j = i - 4;
+ a[i] = j;
+ r += j;
+ }
+ if (i != N)
+ abort ();
+ for (i = 0; i < N; ++i)
+ if (a[i] != i - 4)
+ abort ();
+ if (r != N * (N - 9) / 2)
+ abort ();
+ return 0;
+}