https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/214726
>From 24dca41a2df7fc4d30445757a735e03b43e02935 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <[email protected]> Date: Thu, 6 Aug 2026 15:09:24 -0500 Subject: [PATCH] [OpenMP] Create separate directives for two variants of ORDERED The ORDERED directive comes in two flavors, standalone and block- associated. Create two different directive ids, one for each kind. This will allow a more precise connection between the directive id and its properties. This does not remove OMPD_ordered, nor does it change clang or flang beyond the minimum required to keep working as before. --- clang/lib/Parse/ParseOpenMP.cpp | 7 +++++++ llvm/include/llvm/Frontend/OpenMP/OMP.td | 18 ++++++++++++++++++ .../Frontend/OpenMPDirectiveNameParserTest.cpp | 18 +++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 6b4a6017669b2..a6c639bf0b3aa 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -63,6 +63,13 @@ static OpenMPDirectiveKind checkOpenMPDirectiveName(Parser &P, StringRef Name) { unsigned Version = P.getLangOpts().OpenMP; auto [D, VR] = getOpenMPDirectiveKindAndVersions(Name); + // There are multiple kinds corresponding to "ordered", and it's + // unspecified which one we get, so normalize it to OMPD_ordered. + if (D == Directive::OMPD_ordered_blockassoc || + D == Directive::OMPD_ordered_standalone) + D = OMPD_ordered; + if (Kind == Directive::OMPD_ordered_standalone) + Kind = OMPD_ordered; assert(D == Kind && "Directive kind mismatch"); // Ignore the case Version > VR.Max: In OpenMP 6.0 all prior spellings // are explicitly allowed. diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td index 037a506c8b175..8e53fc07e7b28 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMP.td +++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td @@ -1096,6 +1096,24 @@ def OMP_Ordered : Directive<[Spelling<"ordered">]> { // There is also a block-associated "ordered" directive. let category = CA_Executable; } +def OMP_OrderedStandalone : Directive<[Spelling<"ordered">]> { + let name = "ordered_standalone"; + let allowedClauses = [ + VersionedClause<OMPC_Depend>, + VersionedClause<OMPC_Doacross, 52>, + ]; + let association = AS_None; + let category = CA_Executable; +} +def OMP_OrderedBlockassoc : Directive<[Spelling<"ordered">]> { + let name = "ordered_blockassoc"; + let allowedOnceClauses = [ + VersionedClause<OMPC_Simd>, + VersionedClause<OMPC_Threads>, + ]; + let association = AS_Block; + let category = CA_Executable; +} def OMP_Parallel : Directive<[Spelling<"parallel">]> { let allowedClauses = [ VersionedClause<OMPC_Allocate, 50>, diff --git a/llvm/unittests/Frontend/OpenMPDirectiveNameParserTest.cpp b/llvm/unittests/Frontend/OpenMPDirectiveNameParserTest.cpp index 3d6ccc744b362..f47d80a983fbf 100644 --- a/llvm/unittests/Frontend/OpenMPDirectiveNameParserTest.cpp +++ b/llvm/unittests/Frontend/OpenMPDirectiveNameParserTest.cpp @@ -81,9 +81,21 @@ getParamName1(const testing::TestParamInfo<Tokenize::ParamType> &Info) { return prepareParamName(Name); } +static std::vector<omp::Directive> getDirectiveSet() { + // The variants of the ORDERED construct share the same spelling, so only + // use one of them, otherwise the test will fail to instantiate. + std::vector<omp::Directive> Dirs; + for (omp::Directive D : llvm::omp::directives()) { + if (D == omp::Directive::OMPD_ordered || + D == omp::Directive::OMPD_ordered_blockassoc) + continue; + Dirs.push_back(D); + } + return Dirs; +} + INSTANTIATE_TEST_SUITE_P(DirectiveNameParserTest, Tokenize, - testing::ValuesIn(llvm::omp::directives()), - getParamName1); + testing::ValuesIn(getDirectiveSet()), getParamName1); // Test parsing of valid names. @@ -122,7 +134,7 @@ getParamName2(const testing::TestParamInfo<ParseValid::ParamType> &Info) { INSTANTIATE_TEST_SUITE_P( DirectiveNameParserTest, ParseValid, - testing::Combine(testing::ValuesIn(llvm::omp::directives()), + testing::Combine(testing::ValuesIn(getDirectiveSet()), testing::ValuesIn(omp::getOpenMPVersions())), getParamName2); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
