-
Notifications
You must be signed in to change notification settings - Fork 14.2k
[flang][OpenMP] Use new modifiers in IF/LASTPRIVATE #118128
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Again, this simplifies the semantic checks and lowering quite a bit. Update the check for positive alignment to use a more informative message, and to highlight the modifier itsef, not the whole clause. Remove the checks for the allocator expression itself being positive: there is nothing in the spec that says that it should be positive. Remove the "simple" modifier from the AllocateT template, since both simple and complex modifiers are the same thing, only differing in syntax.
The intent is to keep names in sync with the terminology from the OpenMP spec: OmpBindClause::Type -> Binding OmpDefaultClause::Type -> DataSharingAttribute OmpDeviceTypeClause::Type -> DeviceTypeDescription OmpProcBindClause::Type -> AffinityPolicy Add more comments with references to the OpenMP specs.
This is a mostly mechanical change from specific modifiers embedded directly in a clause to the Modifier variant. Additional comments and references to the OpenMP specs were added.
…/spr/m09-affinity-etc
The usual changes, added more references to OpenMP specs.
The usual changes, added more references to OpenMP specs.
@llvm/pr-subscribers-flang-parser @llvm/pr-subscribers-flang-semantics Author: Krzysztof Parzyszek (kparzysz) ChangesThe usual changes, added more references to OpenMP specs. Patch is 42.91 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/118128.diff 17 Files Affected:
diff --git a/flang/examples/FeatureList/FeatureList.cpp b/flang/examples/FeatureList/FeatureList.cpp
index c5cb8c8fdf40bb..41a6255207976d 100644
--- a/flang/examples/FeatureList/FeatureList.cpp
+++ b/flang/examples/FeatureList/FeatureList.cpp
@@ -492,7 +492,8 @@ struct NodeVisitor {
READ_FEATURE(OmpPrescriptiveness)
READ_FEATURE(OmpPrescriptiveness::Value)
READ_FEATURE(OmpIfClause)
- READ_FEATURE(OmpIfClause::DirectiveNameModifier)
+ READ_FEATURE(OmpIfClause::Modifier)
+ READ_FEATURE(OmpDirectiveNameModifier)
READ_FEATURE(OmpLinearClause)
READ_FEATURE(OmpLinearClause::WithModifier)
READ_FEATURE(OmpLinearClause::WithoutModifier)
diff --git a/flang/examples/FlangOmpReport/FlangOmpReportVisitor.cpp b/flang/examples/FlangOmpReport/FlangOmpReportVisitor.cpp
index afabd564ad5bdc..2dc480f0c901b1 100644
--- a/flang/examples/FlangOmpReport/FlangOmpReportVisitor.cpp
+++ b/flang/examples/FlangOmpReport/FlangOmpReportVisitor.cpp
@@ -8,6 +8,7 @@
#include "FlangOmpReportVisitor.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
namespace Fortran {
namespace parser {
@@ -238,9 +239,9 @@ void OpenMPCounterVisitor::Post(const OmpScheduleClause::Kind &c) {
clauseDetails +=
"type=" + std::string{OmpScheduleClause::EnumToString(c)} + ";";
}
-void OpenMPCounterVisitor::Post(const OmpIfClause::DirectiveNameModifier &c) {
+void OpenMPCounterVisitor::Post(const OmpDirectiveNameModifier &c) {
clauseDetails +=
- "name_modifier=" + std::string{OmpIfClause::EnumToString(c)} + ";";
+ "name_modifier=" + llvm::omp::getOpenMPDirectiveName(c.v).str() + ";";
}
void OpenMPCounterVisitor::Post(const OmpCancelType::Type &c) {
clauseDetails += "type=" + std::string{OmpCancelType::EnumToString(c)} + ";";
diff --git a/flang/examples/FlangOmpReport/FlangOmpReportVisitor.h b/flang/examples/FlangOmpReport/FlangOmpReportVisitor.h
index ed202e8ed2a4c7..59bdac8594cb7c 100644
--- a/flang/examples/FlangOmpReport/FlangOmpReportVisitor.h
+++ b/flang/examples/FlangOmpReport/FlangOmpReportVisitor.h
@@ -77,7 +77,7 @@ struct OpenMPCounterVisitor {
void Post(const OmpTaskDependenceType::Value &c);
void Post(const OmpMapType::Value &c);
void Post(const OmpScheduleClause::Kind &c);
- void Post(const OmpIfClause::DirectiveNameModifier &c);
+ void Post(const OmpDirectiveNameModifier &c);
void Post(const OmpCancelType::Type &c);
void Post(const OmpClause &c);
void PostClauseCommon(const ClauseInfo &ci);
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 1ec38de29b85d6..b0b8d8d7ccc556 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -548,10 +548,13 @@ class ParseTreeDumper {
NODE(OmpFromClause, Modifier)
NODE(parser, OmpExpectation)
NODE_ENUM(OmpExpectation, Value)
+ NODE(parser, OmpDirectiveNameModifier)
NODE(parser, OmpIfClause)
- NODE_ENUM(OmpIfClause, DirectiveNameModifier)
- NODE_ENUM(OmpLastprivateClause, LastprivateModifier)
+ NODE(OmpIfClause, Modifier)
NODE(parser, OmpLastprivateClause)
+ NODE(OmpLastprivateClause, Modifier)
+ NODE(parser, OmpLastprivateModifier)
+ NODE_ENUM(OmpLastprivateModifier, Value)
NODE(parser, OmpLinearClause)
NODE(OmpLinearClause, WithModifier)
NODE(OmpLinearClause, WithoutModifier)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index c00560b1f1726a..06c32831d2c60c 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3543,6 +3543,23 @@ struct OmpDeviceModifier {
WRAPPER_CLASS_BOILERPLATE(OmpDeviceModifier, Value);
};
+// Ref: [5.2:72-73,230-323], in 4.5-5.1 it's scattered over individual
+// directives that allow the IF clause.
+//
+// directive-name-modifier ->
+// PARALLEL | TARGET | TARGET DATA |
+// TARGET ENTER DATA | TARGET EXIT DATA |
+// TARGET UPDATE | TASK | TASKLOOP | // since 4.5
+// CANCEL[*] | SIMD | // since 5.0
+// TEAMS // since 5.2
+//
+// [*] The IF clause is allowed on CANCEL in OpenMP 4.5, but only without
+// the directive-name-modifier. For the sake of uniformity CANCEL can be
+// considered a valid value in 4.5 as well.
+struct OmpDirectiveNameModifier {
+ WRAPPER_CLASS_BOILERPLATE(OmpDirectiveNameModifier, llvm::omp::Directive);
+};
+
// Ref: [5.1:205-209], [5.2:166-168]
//
// motion-modifier ->
@@ -3566,6 +3583,15 @@ struct OmpIterator {
WRAPPER_CLASS_BOILERPLATE(OmpIterator, std::list<OmpIteratorSpecifier>);
};
+// Ref: [5.0:288-290], [5.1:321-322], [5.2:115-117]
+//
+// lastprivate-modifier ->
+// CONDITIONAL // since 5.0
+struct OmpLastprivateModifier {
+ ENUM_CLASS(Value, Conditional)
+ WRAPPER_CLASS_BOILERPLATE(OmpLastprivateModifier, Value);
+};
+
// Ref: [4.5:207-210], [5.0:290-293], [5.1:323-325], [5.2:117-120]
//
// linear-modifier ->
@@ -3898,12 +3924,16 @@ struct OmpGrainsizeClause {
std::tuple<MODIFIERS(), ScalarIntExpr> t;
};
-// 2.12 if-clause -> IF ([ directive-name-modifier :] scalar-logical-expr)
+// Ref: [5.2:72-73], in 4.5-5.1 it's scattered over individual directives
+// that allow the IF clause.
+//
+// if-clause ->
+// IF([directive-name-modifier:]
+// scalar-logical-expression) // since 4.5
struct OmpIfClause {
TUPLE_CLASS_BOILERPLATE(OmpIfClause);
- ENUM_CLASS(DirectiveNameModifier, Parallel, Simd, Target, TargetData,
- TargetEnterData, TargetExitData, TargetUpdate, Task, Taskloop, Teams)
- std::tuple<std::optional<DirectiveNameModifier>, ScalarLogicalExpr> t;
+ MODIFIER_BOILERPLATE(OmpDirectiveNameModifier);
+ std::tuple<MODIFIERS(), ScalarLogicalExpr> t;
};
// OMP 5.0 2.19.5.6 in_reduction-clause -> IN_REDUCTION (reduction-identifier:
@@ -3913,13 +3943,15 @@ struct OmpInReductionClause {
std::tuple<OmpReductionIdentifier, OmpObjectList> t;
};
-// OMP 5.0 2.19.4.5 lastprivate-clause ->
-// LASTPRIVATE ([lastprivate-modifier :] list)
-// lastprivate-modifier -> CONDITIONAL
+// Ref: [4.5:199-201], [5.0:288-290], [5.1:321-322], [5.2:115-117]
+//
+// lastprivate-clause ->
+// LASTPRIVATE(list) | // since 4.5
+// LASTPRIVATE([lastprivate-modifier:] list) // since 5.0
struct OmpLastprivateClause {
TUPLE_CLASS_BOILERPLATE(OmpLastprivateClause);
- ENUM_CLASS(LastprivateModifier, Conditional);
- std::tuple<std::optional<LastprivateModifier>, OmpObjectList> t;
+ MODIFIER_BOILERPLATE(OmpLastprivateModifier);
+ std::tuple<MODIFIERS(), OmpObjectList> t;
};
// 2.15.3.7 linear-clause -> LINEAR (linear-list[ : linear-step])
diff --git a/flang/include/flang/Semantics/openmp-modifiers.h b/flang/include/flang/Semantics/openmp-modifiers.h
index dbc554198df21f..4025ce112d9cab 100644
--- a/flang/include/flang/Semantics/openmp-modifiers.h
+++ b/flang/include/flang/Semantics/openmp-modifiers.h
@@ -74,8 +74,10 @@ DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier);
DECLARE_DESCRIPTOR(parser::OmpChunkModifier);
DECLARE_DESCRIPTOR(parser::OmpDependenceType);
DECLARE_DESCRIPTOR(parser::OmpDeviceModifier);
+DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier);
DECLARE_DESCRIPTOR(parser::OmpExpectation);
DECLARE_DESCRIPTOR(parser::OmpIterator);
+DECLARE_DESCRIPTOR(parser::OmpLastprivateModifier);
DECLARE_DESCRIPTOR(parser::OmpLinearModifier);
DECLARE_DESCRIPTOR(parser::OmpMapper);
DECLARE_DESCRIPTOR(parser::OmpMapType);
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index ff2667983d4367..10c31963ec493a 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -825,27 +825,13 @@ Holds make(const parser::OmpClause::Holds &inp,
If make(const parser::OmpClause::If &inp,
semantics::SemanticsContext &semaCtx) {
// inp.v -> parser::OmpIfClause
- using wrapped = parser::OmpIfClause;
-
- CLAUSET_ENUM_CONVERT( //
- convert, wrapped::DirectiveNameModifier, llvm::omp::Directive,
- // clang-format off
- MS(Parallel, OMPD_parallel)
- MS(Simd, OMPD_simd)
- MS(Target, OMPD_target)
- MS(TargetData, OMPD_target_data)
- MS(TargetEnterData, OMPD_target_enter_data)
- MS(TargetExitData, OMPD_target_exit_data)
- MS(TargetUpdate, OMPD_target_update)
- MS(Task, OMPD_task)
- MS(Taskloop, OMPD_taskloop)
- MS(Teams, OMPD_teams)
- // clang-format on
- );
- auto &t0 = std::get<std::optional<wrapped::DirectiveNameModifier>>(inp.v.t);
+ auto &mods = semantics::OmpGetModifiers(inp.v);
+ auto *m0 =
+ semantics::OmpGetUniqueModifier<parser::OmpDirectiveNameModifier>(mods);
auto &t1 = std::get<parser::ScalarLogicalExpr>(inp.v.t);
- return If{{/*DirectiveNameModifier=*/maybeApply(convert, t0),
- /*IfExpression=*/makeExpr(t1, semaCtx)}};
+ return If{
+ {/*DirectiveNameModifier=*/maybeApplyToV([](auto &&s) { return s; }, m0),
+ /*IfExpression=*/makeExpr(t1, semaCtx)}};
}
// Inbranch: empty
@@ -889,20 +875,20 @@ IsDevicePtr make(const parser::OmpClause::IsDevicePtr &inp,
Lastprivate make(const parser::OmpClause::Lastprivate &inp,
semantics::SemanticsContext &semaCtx) {
// inp.v -> parser::OmpLastprivateClause
- using wrapped = parser::OmpLastprivateClause;
-
CLAUSET_ENUM_CONVERT( //
- convert, parser::OmpLastprivateClause::LastprivateModifier,
+ convert, parser::OmpLastprivateModifier::Value,
Lastprivate::LastprivateModifier,
// clang-format off
MS(Conditional, Conditional)
// clang-format on
);
- auto &t0 = std::get<std::optional<wrapped::LastprivateModifier>>(inp.v.t);
+ auto &mods = semantics::OmpGetModifiers(inp.v);
+ auto *m0 =
+ semantics::OmpGetUniqueModifier<parser::OmpLastprivateModifier>(mods);
auto &t1 = std::get<parser::OmpObjectList>(inp.v.t);
- return Lastprivate{{/*LastprivateModifier=*/maybeApply(convert, t0),
+ return Lastprivate{{/*LastprivateModifier=*/maybeApplyToV(convert, m0),
/*List=*/makeObjects(t1, semaCtx)}};
}
diff --git a/flang/lib/Parser/CMakeLists.txt b/flang/lib/Parser/CMakeLists.txt
index 600a2f67df4431..d364671d7a3229 100644
--- a/flang/lib/Parser/CMakeLists.txt
+++ b/flang/lib/Parser/CMakeLists.txt
@@ -30,6 +30,7 @@ add_flang_library(FortranParser
LINK_COMPONENTS
Support
FrontendOpenACC
+ FrontendOpenMP
DEPENDS
omp_gen
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 1d3dd518601995..920f97f7ca0f21 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -16,6 +16,10 @@
#include "token-parsers.h"
#include "type-parser-implementation.h"
#include "flang/Parser/parse-tree.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
// OpenMP Directives and Clauses
namespace Fortran::parser {
@@ -23,6 +27,47 @@ namespace Fortran::parser {
constexpr auto startOmpLine = skipStuffBeforeStatement >> "!$OMP "_sptok;
constexpr auto endOmpLine = space >> endOfLine;
+/// Parse OpenMP directive name (this includes compound directives).
+struct OmpDirectiveNameParser {
+ using resultType = llvm::omp::Directive;
+ using Token = TokenStringMatch<false, false>;
+
+ std::optional<resultType> Parse(ParseState &state) const {
+ for (const NameWithId &nid : directives()) {
+ if (attempt(Token(nid.first.data())).Parse(state)) {
+ return nid.second;
+ }
+ }
+ return std::nullopt;
+ }
+
+private:
+ using NameWithId = std::pair<std::string, llvm::omp::Directive>;
+
+ llvm::iterator_range<const NameWithId *> directives() const;
+ void initTokens(NameWithId *) const;
+};
+
+llvm::iterator_range<const OmpDirectiveNameParser::NameWithId *>
+OmpDirectiveNameParser::directives() const {
+ static NameWithId table[llvm::omp::Directive_enumSize];
+ [[maybe_unused]] static bool init = (initTokens(table), true);
+ return llvm::make_range(std::cbegin(table), std::cend(table));
+}
+
+void OmpDirectiveNameParser::initTokens(NameWithId *table) const {
+ for (size_t i{0}, e{llvm::omp::Directive_enumSize}; i != e; ++i) {
+ auto id{static_cast<llvm::omp::Directive>(i)};
+ llvm::StringRef name{llvm::omp::getOpenMPDirectiveName(id)};
+ table[i] = std::make_pair(name.str(), id);
+ }
+ // Sort the table with respect to the directive name length in a descending
+ // order. This is to make sure that longer names are tried first, before
+ // any potential prefix (e.g. "target update" before "target").
+ std::sort(table, table + llvm::omp::Directive_enumSize,
+ [](auto &a, auto &b) { return a.first.size() > b.first.size(); });
+}
+
template <typename Clause, typename Separator> struct ModifierList {
constexpr ModifierList(Separator sep) : sep_(sep) {}
constexpr ModifierList(const ModifierList &) = default;
@@ -136,6 +181,9 @@ TYPE_PARSER(construct<OmpIterator>( //
"ITERATOR" >>
parenthesized(nonemptyList(sourced(Parser<OmpIteratorSpecifier>{})))))
+TYPE_PARSER(construct<OmpLastprivateModifier>(
+ "CONDITIONAL" >> pure(OmpLastprivateModifier::Value::Conditional)))
+
// 2.15.3.7 LINEAR (linear-list: linear-step)
// linear-list -> list | modifier(list)
// linear-modifier -> REF | VAL | UVAL
@@ -232,6 +280,11 @@ TYPE_PARSER(sourced(construct<OmpFromClause::Modifier>(
TYPE_PARSER(sourced(
construct<OmpGrainsizeClause::Modifier>(Parser<OmpPrescriptiveness>{})))
+TYPE_PARSER(sourced(construct<OmpIfClause::Modifier>(OmpDirectiveNameParser{})))
+
+TYPE_PARSER(sourced(construct<OmpLastprivateClause::Modifier>(
+ Parser<OmpLastprivateModifier>{})))
+
TYPE_PARSER(sourced(construct<OmpMapClause::Modifier>(
sourced(construct<OmpMapClause::Modifier>(Parser<OmpMapTypeModifier>{}) ||
construct<OmpMapClause::Modifier>(Parser<OmpMapper>{}) ||
@@ -345,22 +398,7 @@ TYPE_PARSER(construct<OmpDeviceTypeClause>(
// 2.12 IF (directive-name-modifier: scalar-logical-expr)
TYPE_PARSER(construct<OmpIfClause>(
- maybe(
- ("PARALLEL" >> pure(OmpIfClause::DirectiveNameModifier::Parallel) ||
- "SIMD" >> pure(OmpIfClause::DirectiveNameModifier::Simd) ||
- "TARGET ENTER DATA" >>
- pure(OmpIfClause::DirectiveNameModifier::TargetEnterData) ||
- "TARGET EXIT DATA" >>
- pure(OmpIfClause::DirectiveNameModifier::TargetExitData) ||
- "TARGET DATA" >>
- pure(OmpIfClause::DirectiveNameModifier::TargetData) ||
- "TARGET UPDATE" >>
- pure(OmpIfClause::DirectiveNameModifier::TargetUpdate) ||
- "TARGET" >> pure(OmpIfClause::DirectiveNameModifier::Target) ||
- "TASK"_id >> pure(OmpIfClause::DirectiveNameModifier::Task) ||
- "TASKLOOP" >> pure(OmpIfClause::DirectiveNameModifier::Taskloop) ||
- "TEAMS" >> pure(OmpIfClause::DirectiveNameModifier::Teams)) /
- ":"),
+ maybe(nonemptyList(Parser<OmpIfClause::Modifier>{}) / ":"),
scalarLogicalExpr))
TYPE_PARSER(construct<OmpReductionClause>(
@@ -460,8 +498,7 @@ TYPE_PARSER(
// OMP 5.0 2.19.4.5 LASTPRIVATE ([lastprivate-modifier :] list)
TYPE_PARSER(construct<OmpLastprivateClause>(
- maybe("CONDITIONAL" >>
- pure(OmpLastprivateClause::LastprivateModifier::Conditional) / ":"),
+ maybe(nonemptyList(Parser<OmpLastprivateClause::Modifier>{}) / ":"),
Parser<OmpObjectList>{}))
// OMP 5.2 11.7.1 BIND ( PARALLEL | TEAMS | THREAD )
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index cd025333a077d3..43c7ef540cb7af 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2074,6 +2074,9 @@ class UnparseVisitor {
},
x.u);
}
+ void Unparse(const OmpDirectiveNameModifier &x) {
+ Word(llvm::omp::getOpenMPDirectiveName(x.v));
+ }
void Unparse(const OmpIteratorSpecifier &x) {
Walk(std::get<TypeDeclarationStmt>(x.t));
Put(" = ");
@@ -2090,9 +2093,8 @@ class UnparseVisitor {
Put(")");
}
void Unparse(const OmpLastprivateClause &x) {
- Walk(
- std::get<std::optional<OmpLastprivateClause::LastprivateModifier>>(x.t),
- ":");
+ using Modifier = OmpLastprivateClause::Modifier;
+ Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
Walk(std::get<OmpObjectList>(x.t));
}
void Unparse(const OmpMapClause &x) {
@@ -2127,7 +2129,8 @@ class UnparseVisitor {
Walk(std::get<OmpObjectList>(x.t));
}
void Unparse(const OmpIfClause &x) {
- Walk(std::get<std::optional<OmpIfClause::DirectiveNameModifier>>(x.t), ":");
+ using Modifier = OmpIfClause::Modifier;
+ Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
Walk(std::get<ScalarLogicalExpr>(x.t));
}
void Unparse(const OmpLinearClause::WithoutModifier &x) {
@@ -2826,8 +2829,7 @@ class UnparseVisitor {
WALK_NESTED_ENUM(OmpDefaultClause, DataSharingAttribute) // OMP default
WALK_NESTED_ENUM(OmpDefaultmapClause, ImplicitBehavior) // OMP defaultmap
WALK_NESTED_ENUM(OmpVariableCategory, Value) // OMP variable-category
- WALK_NESTED_ENUM(
- OmpLastprivateClause, LastprivateModifier) // OMP lastprivate-modifier
+ WALK_NESTED_ENUM(OmpLastprivateModifier, Value) // OMP lastprivate-modifier
WALK_NESTED_ENUM(OmpChunkModifier, Value) // OMP chunk-modifier
WALK_NESTED_ENUM(OmpLinearModifier, Value) // OMP linear-modifier
WALK_NESTED_ENUM(OmpOrderingModifier, Value) // OMP ordering-modifier
@@ -2838,7 +2840,6 @@ class UnparseVisitor {
OmpDeviceTypeClause, DeviceTypeDescription) // OMP device_type
WALK_NESTED_ENUM(OmpReductionModifier, Value) // OMP reduction-modifier
WALK_NESTED_ENUM(OmpExpectation, Value) // OMP motion-expectation
- WALK_NESTED_ENUM(OmpIfClause, DirectiveNameModifier) // OMP directive-modifier
WALK_NESTED_ENUM(OmpCancelType, Type) // OMP cancel-type
WALK_NESTED_ENUM(OmpOrderClause, Ordering) // OMP ordering
WALK_NESTED_ENUM(OmpOrderModifier, Value) // OMP order-modifier
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 9e589067c8868d..a88aba5a54a023 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -3428,36 +3428,81 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Defaultmap &x) {
void OmpStructureChecker::Enter(const parser::OmpClause::If &x) {
CheckAllowedClause(llvm::omp::Clause::OMPC_if);
- using dirNameModifier = parser::OmpIfClause::DirectiveNameModifier;
- // TODO Check that, when multiple 'if' clauses are applied to a combined
- // construct, at most one of them applies to each directive.
- static std::unordered_map<dirNameModifier, OmpDirectiveSet>
- dirNameModifierMap{{dirNameModifier::Parallel, llvm::omp::allParallelSet},
- {dirNameModifier::Simd, llvm::omp::allSimdSet},
- {dirNameModifier::Target, llvm::omp::allTargetSet},
- {dirNameModifier::TargetData,
- {llvm::omp::Directive::OMPD_target_data}},
- {dirNameModifier::TargetEnterData,
- {llvm::omp::Directive::OMPD_target_enter_data}},
- {dirNameModifier::TargetExitData,
- {llvm::omp::Directive::OMPD_target_exit_data}},
- {dirNameModifier::TargetUpdate,
- {llvm::omp::Directive::OMPD_target_update}},
- {dirNameModifier::Task, {llvm::omp::Directive::OMPD_task}},
- {dirNameModifier::Taskloop, llvm::omp::allTaskloopSet},
- {dirNameModifier::Teams, llvm::omp::allTeamsSet}};
- if (const auto &directiveName{
- std::get<std::optional<dirNameModifier>>(x.v.t)}) {
- auto search{dirNameModifierMap.find(*directiveName)};
- if (search == dirNameModifierMap.end() ||
- !search->second.test(GetContext().directive)) {
- context_
- .Say(GetContext().clauseSource,
- "Unmatched directive name modifier %s on the IF clause"_err_en_US,
- parser::ToUpperCaseLetters(
- parser::OmpIfClause::EnumToString(*directiveName)))
- .Attach(
- GetContext().directiveSo...
[truncated]
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, just some nit picks.
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/143/builds/3840 Here is the relevant piece of the build log for the reference
|
The usual changes, added more references to OpenMP specs.