From 19695f4d99e51181c37958680c99502e6f4edd08 Mon Sep 17 00:00:00 2001 From: Chung-Lin Tang Date: Tue, 19 Feb 2019 14:10:15 +0000 Subject: [PATCH] re PR c/87924 (OpenACC wait clauses without async-arguments) 2019-02-19 Chung-Lin Tang PR c/87924 gcc/c/ * c-parser.c (c_parser_oacc_clause_wait): Add representation of wait clause without argument as 'wait (GOMP_ASYNC_NOVAL)', adjust comments. gcc/cp/ * parser.c (cp_parser_oacc_clause_wait): Add representation of wait clause without argument as 'wait (GOMP_ASYNC_NOVAL)', adjust comments. gcc/fortran/ * openmp.c (gfc_match_omp_clauses): Add representation of wait clause without argument as 'wait (GOMP_ASYNC_NOVAL)'. libgomp/ * oacc-parallel.c (GOACC_parallel_keyed): Remove condition on call to goacc_wait(). (goacc_wait): Handle ACC_ASYNC_NOVAL case, remove goacc_thread() call and related adjustment. Reviewed-by: Thomas Schwinge From-SVN: r269016 --- gcc/c/ChangeLog | 6 ++++++ gcc/c/c-parser.c | 10 +++++++++- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 14 ++++++++++---- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/openmp.c | 14 +++++++++++++- libgomp/ChangeLog | 8 ++++++++ libgomp/oacc-parallel.c | 21 +++++++++++++-------- 8 files changed, 71 insertions(+), 14 deletions(-) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1def92af99a..b76f5b1fae6 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2019-02-19 Chung-Lin Tang + + PR c/87924 + * c-parser.c (c_parser_oacc_clause_wait): Add representation of wait + clause without argument as 'wait (GOMP_ASYNC_NOVAL)', adjust comments. + 2019-02-15 Jakub Jelinek PR c/89340 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index cacbf0ac495..6c1f3076241 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -13412,7 +13412,7 @@ c_parser_oacc_clause_tile (c_parser *parser, tree list) } /* OpenACC: - wait ( int-expr-list ) */ + wait [( int-expr-list )] */ static tree c_parser_oacc_clause_wait (c_parser *parser, tree list) @@ -13421,6 +13421,14 @@ c_parser_oacc_clause_wait (c_parser *parser, tree list) if (c_parser_peek_token (parser)->type == CPP_OPEN_PAREN) list = c_parser_oacc_wait_list (parser, clause_loc, list); + else + { + tree c = build_omp_clause (clause_loc, OMP_CLAUSE_WAIT); + + OMP_CLAUSE_DECL (c) = build_int_cst (integer_type_node, GOMP_ASYNC_NOVAL); + OMP_CLAUSE_CHAIN (c) = list; + list = c; + } return list; } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2373c98b618..9c42190f04a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-02-19 Chung-Lin Tang + + PR c/87924 + * parser.c (cp_parser_oacc_clause_wait): Add representation of wait + clause without argument as 'wait (GOMP_ASYNC_NOVAL)', adjust comments. + 2019-02-19 Jakub Jelinek PR c++/89387 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index adb5f6f27a1..f8d44e06ec3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -32867,17 +32867,23 @@ cp_parser_oacc_wait_list (cp_parser *parser, location_t clause_loc, tree list) } /* OpenACC: - wait ( int-expr-list ) */ + wait [( int-expr-list )] */ static tree cp_parser_oacc_clause_wait (cp_parser *parser, tree list) { location_t location = cp_lexer_peek_token (parser->lexer)->location; - if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_PAREN) - return list; + if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN) + list = cp_parser_oacc_wait_list (parser, location, list); + else + { + tree c = build_omp_clause (location, OMP_CLAUSE_WAIT); - list = cp_parser_oacc_wait_list (parser, location, list); + OMP_CLAUSE_DECL (c) = build_int_cst (integer_type_node, GOMP_ASYNC_NOVAL); + OMP_CLAUSE_CHAIN (c) = list; + list = c; + } return list; } diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 43eda8c56d7..989bf9aba74 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-02-19 Chung-Lin Tang + + PR c/87924 + * openmp.c (gfc_match_omp_clauses): Add representation of wait clause + without argument as 'wait (GOMP_ASYNC_NOVAL)'. + 2019-02-18 Thomas Koenig PR fortran/87689 diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 8651afaee4f..11dd3ae0ada 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -1885,7 +1885,19 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, break; } else if (m == MATCH_NO) - needs_space = true; + { + gfc_expr *expr + = gfc_get_constant_expr (BT_INTEGER, + gfc_default_integer_kind, + &gfc_current_locus); + mpz_set_si (expr->value.integer, GOMP_ASYNC_NOVAL); + gfc_expr_list **expr_list = &c->wait_list; + while (*expr_list) + expr_list = &(*expr_list)->next; + *expr_list = gfc_get_expr_list (); + (*expr_list)->expr = expr; + needs_space = true; + } continue; } if ((mask & OMP_CLAUSE_WORKER) diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 4d1eca4d75d..f310c2f6c24 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,11 @@ +2019-02-19 Chung-Lin Tang + + PR c/87924 + * oacc-parallel.c (GOACC_parallel_keyed): Remove condition on call to + goacc_wait(). + (goacc_wait): Handle ACC_ASYNC_NOVAL case, remove goacc_thread() call + and related adjustment. + 2019-01-30 Jakub Jelinek PR c++/88988 diff --git a/libgomp/oacc-parallel.c b/libgomp/oacc-parallel.c index d8a08e974a2..b77c5e8b9c5 100644 --- a/libgomp/oacc-parallel.c +++ b/libgomp/oacc-parallel.c @@ -206,9 +206,7 @@ GOACC_parallel_keyed (int flags_m, void (*fn) (void *), case GOMP_LAUNCH_WAIT: { unsigned num_waits = GOMP_LAUNCH_OP (tag); - - if (num_waits) - goacc_wait (async, num_waits, &ap); + goacc_wait (async, num_waits, &ap); break; } @@ -514,13 +512,20 @@ GOACC_enter_exit_data (int flags_m, size_t mapnum, static void goacc_wait (int async, int num_waits, va_list *ap) { - struct goacc_thread *thr = goacc_thread (); - struct gomp_device_descr *acc_dev = thr->dev; - while (num_waits--) { int qid = va_arg (*ap, int); - + + /* Waiting on ACC_ASYNC_NOVAL maps to 'wait all'. */ + if (qid == acc_async_noval) + { + if (async == acc_async_sync) + acc_wait_all (); + else + acc_wait_all_async (async); + break; + } + if (acc_async_test (qid)) continue; @@ -531,7 +536,7 @@ goacc_wait (int async, int num_waits, va_list *ap) launching on, the queue itself will order work as required, so there's no need to wait explicitly. */ else - acc_dev->openacc.async_wait_async_func (qid, async); + acc_wait_async (qid, async); } }