Add support for device-modifiers for 'omp target device'.
authorMarcel Vollweiler <marcel@codesourcery.com>
Tue, 31 Aug 2021 13:09:40 +0000 (06:09 -0700)
committerMarcel Vollweiler <marcel@codesourcery.com>
Tue, 31 Aug 2021 13:19:31 +0000 (06:19 -0700)
commit03be3cfeef7b3811acb6c4a8da2fc5c1e25d3e4c
tree6ccba78c726f6621e6851caf061f944bc7b5c9d3
parent69b09c5599b201ac039db564c303f7b20d87e0df
Add support for device-modifiers for 'omp target device'.

'device_num' and 'ancestor' are now parsed on target device constructs for C,
C++, and Fortran (see OpenMP specification 5.0, p. 170). When 'ancestor' is
 used, then 'sorry, not supported' is output. Moreover, the restrictions for
'ancestor' are implemented (see OpenMP specification 5.0, p. 174f).

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_clause_device): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_clause_device): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.
* semantics.c (finish_omp_clauses): Error handling. Constant device ids must
evaluate to '1' if 'ancestor' is used.

gcc/fortran/ChangeLog:

* gfortran.h: Add variable for 'ancestor' in struct gfc_omp_clauses.
* openmp.c (gfc_match_omp_clauses): Parse device-modifiers 'device_num'
and 'ancestor' in 'target device' clauses.
* trans-openmp.c (gfc_trans_omp_clauses): Set OMP_CLAUSE_DEVICE_ANCESTOR.

gcc/ChangeLog:

* gimplify.c (gimplify_scan_omp_clauses): Error handling. 'ancestor' only
allowed on target constructs and only with particular other clauses.
* omp-expand.c (expand_omp_target): Output of 'sorry, not supported' if
'ancestor' is used.
* omp-low.c (check_omp_nesting_restrictions): Error handling. No nested OpenMP
structs when 'ancestor' is used.
(scan_omp_1_stmt): No usage of OpenMP runtime routines in a target region when
'ancestor' is used.
* tree-pretty-print.c (dump_omp_clause): Append 'ancestor'.
* tree.h (OMP_CLAUSE_DEVICE_ANCESTOR): Define macro.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/target-device-1.c: New test.
* c-c++-common/gomp/target-device-2.c: New test.
* c-c++-common/gomp/target-device-ancestor-1.c: New test.
* c-c++-common/gomp/target-device-ancestor-2.c: New test.
* c-c++-common/gomp/target-device-ancestor-3.c: New test.
* c-c++-common/gomp/target-device-ancestor-4.c: New test.
* gfortran.dg/gomp/target-device-1.f90: New test.
* gfortran.dg/gomp/target-device-2.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-1.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-2.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-3.f90: New test.
* gfortran.dg/gomp/target-device-ancestor-4.f90: New test.
23 files changed:
gcc/c/c-parser.c
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/fortran/gfortran.h
gcc/fortran/openmp.c
gcc/fortran/trans-openmp.c
gcc/gimplify.c
gcc/omp-expand.c
gcc/omp-low.c
gcc/testsuite/c-c++-common/gomp/target-device-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/target-device-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/target-device-ancestor-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/target-device-ancestor-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/target-device-ancestor-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/target-device-ancestor-4.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-ancestor-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-ancestor-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-ancestor-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/target-device-ancestor-4.f90 [new file with mode: 0644]
gcc/tree-pretty-print.c
gcc/tree.h