I realized last week that the previous version of this patch series that I posted on Nov 15:
https://gcc.gnu.org/pipermail/gcc-patches/2024-November/669053.html collided with Paul-Antoine's "dispatch" construct patches that were pushed a few days later, and no longer applied cleanly. I've prepared this new version to fix up the merge conflicts. Only part 2 of the series has any substantive code changes (mainly in gimplify_omp_dispatch and gimplify_call_expr), and there is a new testcase added in part 7 to test the intersection of dynamic selectors and the dispatch construct. I still hope this functionality can make it into GCC 15. -Sandra Sandra Loosemore (10): OpenMP: New tree nodes for metadirective and dynamic selector support. OpenMP: Re-work and extend context selector resolution OpenMP: Remove dead code from declare variant reimplementation OpenMP: Robustify C front end handling of attribute-syntax pragmas OpenMP: Add C support for metadirectives and dynamic selectors. OpenMP: C++ support for metadirectives and dynamic selectors. OpenMP: Shared metadirective/dynamic selector tests for C and C++ OpenMP: Fortran support for metadirectives and dynamic selectors OpenMP: Update "declare target"/OpenMP context interaction OpenMP: Update documentation of metadirective implementation status. gcc/Makefile.in | 2 +- gcc/c-family/c-attribs.cc | 2 - gcc/c-family/c-common.h | 4 +- gcc/c-family/c-gimplify.cc | 27 + gcc/c-family/c-omp.cc | 60 +- gcc/c-family/c-pragma.cc | 1 + gcc/c-family/c-pragma.h | 1 + gcc/c/c-decl.cc | 8 +- gcc/c/c-parser.cc | 537 +++- gcc/cgraph.cc | 2 - gcc/cgraph.h | 12 +- gcc/cgraphclones.cc | 2 +- gcc/cp/cp-tree.h | 2 + gcc/cp/decl.cc | 2 +- gcc/cp/decl2.cc | 9 +- gcc/cp/parser.cc | 542 +++- gcc/cp/parser.h | 6 + gcc/cp/pt.cc | 126 + gcc/cp/semantics.cc | 3 +- gcc/doc/generic.texi | 63 + gcc/fold-const.cc | 2 + gcc/fortran/decl.cc | 29 + gcc/fortran/dump-parse-tree.cc | 20 + gcc/fortran/gfortran.h | 21 +- gcc/fortran/io.cc | 2 +- gcc/fortran/match.h | 2 + gcc/fortran/openmp.cc | 302 ++- gcc/fortran/parse.cc | 582 +++-- gcc/fortran/parse.h | 8 +- gcc/fortran/resolve.cc | 6 + gcc/fortran/st.cc | 4 + gcc/fortran/symbol.cc | 25 +- gcc/fortran/trans-decl.cc | 5 +- gcc/fortran/trans-openmp.cc | 238 +- gcc/fortran/trans-stmt.h | 1 + gcc/fortran/trans.cc | 1 + gcc/gimple-expr.cc | 5 + gcc/gimple.cc | 4 +- gcc/gimplify.cc | 657 ++++- gcc/gimplify.h | 2 +- gcc/ipa-free-lang-data.cc | 2 +- gcc/ipa.cc | 3 - gcc/lto-cgraph.cc | 12 +- gcc/lto-streamer-out.cc | 3 +- gcc/lto-streamer.h | 6 - gcc/lto/lto-partition.cc | 5 +- gcc/omp-expand.cc | 6 +- gcc/omp-general.cc | 2203 +++++++++-------- gcc/omp-general.h | 44 +- gcc/omp-low.cc | 18 + gcc/omp-offload.cc | 97 +- gcc/omp-simd-clone.cc | 4 +- gcc/passes.cc | 3 +- gcc/symtab.cc | 2 +- .../c-c++-common/gomp/attrs-metadirective-1.c | 47 + .../c-c++-common/gomp/attrs-metadirective-2.c | 76 + .../c-c++-common/gomp/attrs-metadirective-3.c | 24 + .../c-c++-common/gomp/attrs-metadirective-4.c | 43 + .../c-c++-common/gomp/attrs-metadirective-5.c | 26 + .../c-c++-common/gomp/attrs-metadirective-6.c | 33 + .../c-c++-common/gomp/attrs-metadirective-7.c | 37 + .../c-c++-common/gomp/attrs-metadirective-8.c | 18 + .../gomp/declare-target-indirect-2.c | 10 +- .../c-c++-common/gomp/declare-variant-12.c | 14 +- .../c-c++-common/gomp/declare-variant-13.c | 6 +- .../c-c++-common/gomp/declare-variant-14.c | 2 +- .../c-c++-common/gomp/declare-variant-2.c | 4 +- .../c-c++-common/gomp/declare-variant-8.c | 4 +- .../gomp/declare-variant-arg-exprs.c | 29 + .../gomp/declare-variant-dynamic-1.c | 26 + .../gomp/declare-variant-dynamic-2.c | 30 + .../c-c++-common/gomp/metadirective-1.c | 58 + .../c-c++-common/gomp/metadirective-2.c | 75 + .../c-c++-common/gomp/metadirective-3.c | 23 + .../c-c++-common/gomp/metadirective-4.c | 42 + .../c-c++-common/gomp/metadirective-5.c | 25 + .../c-c++-common/gomp/metadirective-6.c | 32 + .../c-c++-common/gomp/metadirective-7.c | 36 + .../c-c++-common/gomp/metadirective-8.c | 17 + .../gomp/metadirective-construct.c | 178 ++ .../c-c++-common/gomp/metadirective-device.c | 149 ++ .../gomp/metadirective-no-score.c | 95 + .../gomp/metadirective-target-device.c | 149 ++ .../c-c++-common/gomp/reverse-offload-1.c | 2 +- .../g++.dg/gomp/declare-variant-class-1.C | 32 + .../g++.dg/gomp/declare-variant-class-2.C | 37 + .../g++.dg/gomp/metadirective-template-1.C | 74 + gcc/testsuite/gcc.dg/gomp/metadirective-1.c | 15 + .../gfortran.dg/gomp/declare-variant-12.f90 | 14 +- .../gfortran.dg/gomp/declare-variant-13.f90 | 25 +- .../gfortran.dg/gomp/declare-variant-14.f90 | 28 +- .../gfortran.dg/gomp/declare-variant-8.f90 | 12 +- .../gfortran.dg/gomp/metadirective-1.f90 | 80 + .../gfortran.dg/gomp/metadirective-10.f90 | 40 + .../gfortran.dg/gomp/metadirective-11.f90 | 33 + .../gfortran.dg/gomp/metadirective-12.f90 | 18 + .../gfortran.dg/gomp/metadirective-2.f90 | 62 + .../gfortran.dg/gomp/metadirective-3.f90 | 25 + .../gfortran.dg/gomp/metadirective-4.f90 | 39 + .../gfortran.dg/gomp/metadirective-5.f90 | 30 + .../gfortran.dg/gomp/metadirective-6.f90 | 31 + .../gfortran.dg/gomp/metadirective-7.f90 | 37 + .../gfortran.dg/gomp/metadirective-8.f90 | 22 + .../gfortran.dg/gomp/metadirective-9.f90 | 30 + .../gomp/metadirective-construct.f90 | 260 ++ .../gomp/metadirective-no-score.f90 | 122 + gcc/testsuite/gfortran.dg/gomp/pure-1.f90 | 7 + gcc/testsuite/gfortran.dg/gomp/pure-2.f90 | 8 - gcc/tree-cfg.cc | 1 + gcc/tree-inline.cc | 15 +- gcc/tree-pretty-print.cc | 81 + gcc/tree-ssa-operands.cc | 4 + gcc/tree.def | 34 + gcc/tree.h | 22 + libgomp/libgomp.texi | 21 +- .../libgomp.c++/metadirective-template-1.C | 39 + .../libgomp.c++/metadirective-template-2.C | 43 + .../libgomp.c++/metadirective-template-3.C | 43 + .../libgomp.c-c++-common/dispatch-3.c | 100 + .../libgomp.c-c++-common/metadirective-1.c | 37 + .../libgomp.c-c++-common/metadirective-2.c | 43 + .../libgomp.c-c++-common/metadirective-3.c | 36 + .../libgomp.c-c++-common/metadirective-4.c | 54 + .../libgomp.c-c++-common/metadirective-5.c | 48 + .../metadirective-late-1.c | 66 + .../metadirective-late-2.c | 66 + .../metadirective-target-device.c | 76 + .../libgomp.fortran/metadirective-1.f90 | 61 + .../libgomp.fortran/metadirective-2.f90 | 40 + .../libgomp.fortran/metadirective-3.f90 | 29 + .../libgomp.fortran/metadirective-4.f90 | 46 + .../libgomp.fortran/metadirective-5.f90 | 44 + .../libgomp.fortran/metadirective-6.f90 | 58 + 133 files changed, 7560 insertions(+), 1673 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-1.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-2.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-3.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-4.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-5.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-6.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-7.c create mode 100644 gcc/testsuite/c-c++-common/gomp/attrs-metadirective-8.c create mode 100644 gcc/testsuite/c-c++-common/gomp/declare-variant-arg-exprs.c create mode 100644 gcc/testsuite/c-c++-common/gomp/declare-variant-dynamic-1.c create mode 100644 gcc/testsuite/c-c++-common/gomp/declare-variant-dynamic-2.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-1.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-2.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-3.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-4.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-5.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-6.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-7.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-8.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-construct.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-device.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-no-score.c create mode 100644 gcc/testsuite/c-c++-common/gomp/metadirective-target-device.c create mode 100644 gcc/testsuite/g++.dg/gomp/declare-variant-class-1.C create mode 100644 gcc/testsuite/g++.dg/gomp/declare-variant-class-2.C create mode 100644 gcc/testsuite/g++.dg/gomp/metadirective-template-1.C create mode 100644 gcc/testsuite/gcc.dg/gomp/metadirective-1.c create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-1.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-10.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-11.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-12.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-2.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-3.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-4.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-5.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-6.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-7.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-8.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-9.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-construct.f90 create mode 100644 gcc/testsuite/gfortran.dg/gomp/metadirective-no-score.f90 create mode 100644 libgomp/testsuite/libgomp.c++/metadirective-template-1.C create mode 100644 libgomp/testsuite/libgomp.c++/metadirective-template-2.C create mode 100644 libgomp/testsuite/libgomp.c++/metadirective-template-3.C create mode 100644 libgomp/testsuite/libgomp.c-c++-common/dispatch-3.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-1.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-2.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-3.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-4.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-5.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-late-1.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-late-2.c create mode 100644 libgomp/testsuite/libgomp.c-c++-common/metadirective-target-device.c create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-1.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-2.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-3.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-4.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-5.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/metadirective-6.f90 -- 2.25.1