Skip to content

Commit 9fdd1d3

Browse files
authored
[Flang] Add parser support for AUTOMAP modifier (#151511)
Add parser support for the new AUTOMAP modifier for OpenMP Declare Target Enter clause introduced in OpenMP 6.0 section 7.9.7.
1 parent 9e0dc4f commit 9fdd1d3

File tree

14 files changed

+122
-24
lines changed

14 files changed

+122
-24
lines changed

flang/include/flang/Parser/dump-parse-tree.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,13 +581,17 @@ class ParseTreeDumper {
581581
NODE(parser, OmpDependClause)
582582
NODE(OmpDependClause, TaskDep)
583583
NODE(OmpDependClause::TaskDep, Modifier)
584+
NODE(parser, OmpAutomapModifier)
585+
NODE_ENUM(OmpAutomapModifier, Value)
584586
NODE(parser, OmpDetachClause)
585587
NODE(parser, OmpDoacrossClause)
586588
NODE(parser, OmpDestroyClause)
587589
NODE(parser, OmpEndBlockDirective)
588590
NODE(parser, OmpEndCriticalDirective)
589591
NODE(parser, OmpEndLoopDirective)
590592
NODE(parser, OmpEndSectionsDirective)
593+
NODE(parser, OmpEnterClause)
594+
NODE(OmpEnterClause, Modifier)
591595
NODE(parser, OmpFailClause)
592596
NODE(parser, OmpFromClause)
593597
NODE(OmpFromClause, Modifier)

flang/include/flang/Parser/parse-tree.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3776,6 +3776,16 @@ struct OmpAlwaysModifier {
37763776
WRAPPER_CLASS_BOILERPLATE(OmpAlwaysModifier, Value);
37773777
};
37783778

3779+
// Ref: [6.0:289-290]
3780+
//
3781+
// automap-modifier ->
3782+
// automap // since 6.0
3783+
//
3784+
struct OmpAutomapModifier {
3785+
ENUM_CLASS(Value, Automap);
3786+
WRAPPER_CLASS_BOILERPLATE(OmpAutomapModifier, Value);
3787+
};
3788+
37793789
// Ref: [5.2:252-254]
37803790
//
37813791
// chunk-modifier ->
@@ -4360,6 +4370,17 @@ struct OmpDeviceTypeClause {
43604370
WRAPPER_CLASS_BOILERPLATE(OmpDeviceTypeClause, DeviceTypeDescription);
43614371
};
43624372

4373+
// Ref: [5.2:158-159], [6.0:289-290]
4374+
//
4375+
// enter-clause ->
4376+
// ENTER(locator-list) |
4377+
// ENTER(automap-modifier: locator-list) | // since 6.0
4378+
struct OmpEnterClause {
4379+
TUPLE_CLASS_BOILERPLATE(OmpEnterClause);
4380+
MODIFIER_BOILERPLATE(OmpAutomapModifier);
4381+
std::tuple<MODIFIERS(), OmpObjectList> t;
4382+
};
4383+
43634384
// OMP 5.2 15.8.3 extended-atomic, fail-clause ->
43644385
// FAIL(memory-order)
43654386
struct OmpFailClause {

flang/include/flang/Semantics/openmp-modifiers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ DECLARE_DESCRIPTOR(parser::OmpAlignModifier);
7272
DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier);
7373
DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier);
7474
DECLARE_DESCRIPTOR(parser::OmpAlwaysModifier);
75+
DECLARE_DESCRIPTOR(parser::OmpAutomapModifier);
7576
DECLARE_DESCRIPTOR(parser::OmpChunkModifier);
7677
DECLARE_DESCRIPTOR(parser::OmpCloseModifier);
7778
DECLARE_DESCRIPTOR(parser::OmpContextSelector);

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1519,10 +1519,14 @@ bool ClauseProcessor::processTo(
15191519
bool ClauseProcessor::processEnter(
15201520
llvm::SmallVectorImpl<DeclareTargetCapturePair> &result) const {
15211521
return findRepeatableClause<omp::clause::Enter>(
1522-
[&](const omp::clause::Enter &clause, const parser::CharBlock &) {
1522+
[&](const omp::clause::Enter &clause, const parser::CharBlock &source) {
1523+
mlir::Location currentLocation = converter.genLocation(source);
1524+
if (std::get<std::optional<omp::clause::Enter::Modifier>>(clause.t))
1525+
TODO(currentLocation, "Declare target enter AUTOMAP modifier");
15231526
// Case: declare target enter(func, var1, var2)...
1524-
gatherFuncAndVarSyms(
1525-
clause.v, mlir::omp::DeclareTargetCaptureClause::enter, result);
1527+
gatherFuncAndVarSyms(std::get<ObjectList>(clause.t),
1528+
mlir::omp::DeclareTargetCaptureClause::enter,
1529+
result);
15261530
});
15271531
}
15281532

flang/lib/Lower/OpenMP/Clauses.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -772,8 +772,19 @@ Doacross make(const parser::OmpClause::Doacross &inp,
772772

773773
Enter make(const parser::OmpClause::Enter &inp,
774774
semantics::SemanticsContext &semaCtx) {
775-
// inp.v -> parser::OmpObjectList
776-
return Enter{makeObjects(/*List=*/inp.v, semaCtx)};
775+
// inp.v -> parser::OmpEnterClause
776+
CLAUSET_ENUM_CONVERT( //
777+
convert, parser::OmpAutomapModifier::Value, Enter::Modifier,
778+
// clang-format off
779+
MS(Automap, Automap)
780+
// clang-format on
781+
);
782+
auto &mods = semantics::OmpGetModifiers(inp.v);
783+
auto *mod = semantics::OmpGetUniqueModifier<parser::OmpAutomapModifier>(mods);
784+
auto &objList = std::get<parser::OmpObjectList>(inp.v.t);
785+
786+
return Enter{{/*Modifier=*/maybeApplyToV(convert, mod),
787+
/*List=*/makeObjects(objList, semaCtx)}};
777788
}
778789

779790
Exclusive make(const parser::OmpClause::Exclusive &inp,

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,9 @@ TYPE_PARSER(construct<OmpAllocatorSimpleModifier>(scalarIntExpr))
482482
TYPE_PARSER(construct<OmpAlwaysModifier>( //
483483
"ALWAYS" >> pure(OmpAlwaysModifier::Value::Always)))
484484

485+
TYPE_PARSER(construct<OmpAutomapModifier>(
486+
"AUTOMAP" >> pure(OmpAutomapModifier::Value::Automap)))
487+
485488
TYPE_PARSER(construct<OmpChunkModifier>( //
486489
"SIMD" >> pure(OmpChunkModifier::Value::Simd)))
487490

@@ -636,6 +639,9 @@ TYPE_PARSER(sourced(construct<OmpDependClause::TaskDep::Modifier>(sourced(
636639
TYPE_PARSER(
637640
sourced(construct<OmpDeviceClause::Modifier>(Parser<OmpDeviceModifier>{})))
638641

642+
TYPE_PARSER(
643+
sourced(construct<OmpEnterClause::Modifier>(Parser<OmpAutomapModifier>{})))
644+
639645
TYPE_PARSER(sourced(construct<OmpFromClause::Modifier>(
640646
sourced(construct<OmpFromClause::Modifier>(Parser<OmpExpectation>{}) ||
641647
construct<OmpFromClause::Modifier>(Parser<OmpMapper>{}) ||
@@ -771,6 +777,10 @@ TYPE_PARSER(construct<OmpDefaultClause>(
771777
Parser<OmpDefaultClause::DataSharingAttribute>{}) ||
772778
construct<OmpDefaultClause>(indirect(Parser<OmpDirectiveSpecification>{}))))
773779

780+
TYPE_PARSER(construct<OmpEnterClause>(
781+
maybe(nonemptyList(Parser<OmpEnterClause::Modifier>{}) / ":"),
782+
Parser<OmpObjectList>{}))
783+
774784
TYPE_PARSER(construct<OmpFailClause>(
775785
"ACQ_REL" >> pure(common::OmpMemoryOrderType::Acq_Rel) ||
776786
"ACQUIRE" >> pure(common::OmpMemoryOrderType::Acquire) ||
@@ -1059,7 +1069,7 @@ TYPE_PARSER( //
10591069
"DYNAMIC_ALLOCATORS" >>
10601070
construct<OmpClause>(construct<OmpClause::DynamicAllocators>()) ||
10611071
"ENTER" >> construct<OmpClause>(construct<OmpClause::Enter>(
1062-
parenthesized(Parser<OmpObjectList>{}))) ||
1072+
parenthesized(Parser<OmpEnterClause>{}))) ||
10631073
"EXCLUSIVE" >> construct<OmpClause>(construct<OmpClause::Exclusive>(
10641074
parenthesized(Parser<OmpObjectList>{}))) ||
10651075
"FAIL" >> construct<OmpClause>(construct<OmpClause::Fail>(

flang/lib/Parser/unparse.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2250,6 +2250,11 @@ class UnparseVisitor {
22502250
Walk(std::get<OmpObjectList>(x.t));
22512251
Walk(": ", std::get<std::optional<std::list<Modifier>>>(x.t));
22522252
}
2253+
void Unparse(const OmpEnterClause &x) {
2254+
using Modifier = OmpEnterClause::Modifier;
2255+
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
2256+
Walk(std::get<OmpObjectList>(x.t));
2257+
}
22532258
void Unparse(const OmpFromClause &x) {
22542259
using Modifier = OmpFromClause::Modifier;
22552260
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
@@ -2986,6 +2991,7 @@ class UnparseVisitor {
29862991
WALK_NESTED_ENUM(UseStmt, ModuleNature) // R1410
29872992
WALK_NESTED_ENUM(OmpAdjustArgsClause::OmpAdjustOp, Value) // OMP adjustop
29882993
WALK_NESTED_ENUM(OmpAtClause, ActionTime) // OMP at
2994+
WALK_NESTED_ENUM(OmpAutomapModifier, Value) // OMP automap-modifier
29892995
WALK_NESTED_ENUM(OmpBindClause, Binding) // OMP bind
29902996
WALK_NESTED_ENUM(OmpProcBindClause, AffinityPolicy) // OMP proc_bind
29912997
WALK_NESTED_ENUM(OmpDefaultClause, DataSharingAttribute) // OMP default

flang/lib/Semantics/check-omp-structure.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1569,9 +1569,10 @@ void OmpStructureChecker::Leave(const parser::OpenMPDeclareTargetConstruct &x) {
15691569
},
15701570
[&](const parser::OmpClause::Enter &enterClause) {
15711571
enterClauseFound = true;
1572-
CheckSymbolNames(dir.source, enterClause.v);
1573-
CheckVarIsNotPartOfAnotherVar(dir.source, enterClause.v);
1574-
CheckThreadprivateOrDeclareTargetVar(enterClause.v);
1572+
auto &objList{std::get<parser::OmpObjectList>(enterClause.v.t)};
1573+
CheckSymbolNames(dir.source, objList);
1574+
CheckVarIsNotPartOfAnotherVar(dir.source, objList);
1575+
CheckThreadprivateOrDeclareTargetVar(objList);
15751576
},
15761577
[&](const parser::OmpClause::DeviceType &deviceTypeClause) {
15771578
deviceTypeClauseFound = true;
@@ -4029,7 +4030,11 @@ void OmpStructureChecker::Enter(const parser::OmpClause::HasDeviceAddr &x) {
40294030

40304031
void OmpStructureChecker::Enter(const parser::OmpClause::Enter &x) {
40314032
CheckAllowedClause(llvm::omp::Clause::OMPC_enter);
4032-
const parser::OmpObjectList &objList{x.v};
4033+
if (!OmpVerifyModifiers(
4034+
x.v, llvm::omp::OMPC_enter, GetContext().clauseSource, context_)) {
4035+
return;
4036+
}
4037+
const parser::OmpObjectList &objList{std::get<parser::OmpObjectList>(x.v.t)};
40334038
SymbolSourceMap symbols;
40344039
GetSymbolsInObjectList(objList, symbols);
40354040
for (const auto &[symbol, source] : symbols) {
@@ -4489,17 +4494,18 @@ const parser::OmpObjectList *OmpStructureChecker::GetOmpObjectList(
44894494
const parser::OmpClause &clause) {
44904495

44914496
// Clauses with OmpObjectList as its data member
4492-
using MemberObjectListClauses = std::tuple<parser::OmpClause::Copyprivate,
4493-
parser::OmpClause::Copyin, parser::OmpClause::Enter,
4494-
parser::OmpClause::Firstprivate, parser::OmpClause::Link,
4495-
parser::OmpClause::Private, parser::OmpClause::Shared,
4496-
parser::OmpClause::UseDevicePtr, parser::OmpClause::UseDeviceAddr>;
4497+
using MemberObjectListClauses =
4498+
std::tuple<parser::OmpClause::Copyprivate, parser::OmpClause::Copyin,
4499+
parser::OmpClause::Firstprivate, parser::OmpClause::Link,
4500+
parser::OmpClause::Private, parser::OmpClause::Shared,
4501+
parser::OmpClause::UseDevicePtr, parser::OmpClause::UseDeviceAddr>;
44974502

44984503
// Clauses with OmpObjectList in the tuple
4499-
using TupleObjectListClauses = std::tuple<parser::OmpClause::Aligned,
4500-
parser::OmpClause::Allocate, parser::OmpClause::From,
4501-
parser::OmpClause::Lastprivate, parser::OmpClause::Map,
4502-
parser::OmpClause::Reduction, parser::OmpClause::To>;
4504+
using TupleObjectListClauses =
4505+
std::tuple<parser::OmpClause::Aligned, parser::OmpClause::Allocate,
4506+
parser::OmpClause::From, parser::OmpClause::Lastprivate,
4507+
parser::OmpClause::Map, parser::OmpClause::Reduction,
4508+
parser::OmpClause::To, parser::OmpClause::Enter>;
45034509

45044510
// TODO:: Generate the tuples using TableGen.
45054511
// Handle other constructs with OmpObjectList such as OpenMPThreadprivate.

flang/lib/Semantics/openmp-modifiers.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,22 @@ const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlwaysModifier>() {
156156
return desc;
157157
}
158158

159+
template <>
160+
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAutomapModifier>() {
161+
static const OmpModifierDescriptor desc{
162+
/*name=*/"automap-modifier",
163+
/*props=*/
164+
{
165+
{60, {OmpProperty::Unique}},
166+
},
167+
/*clauses=*/
168+
{
169+
{60, {Clause::OMPC_enter}},
170+
},
171+
};
172+
return desc;
173+
}
174+
159175
template <>
160176
const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpChunkModifier>() {
161177
static const OmpModifierDescriptor desc{

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2152,7 +2152,8 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclareTargetConstruct &x) {
21522152
ResolveOmpObjectList(linkClause->v, Symbol::Flag::OmpDeclareTarget);
21532153
} else if (const auto *enterClause{
21542154
std::get_if<parser::OmpClause::Enter>(&clause.u)}) {
2155-
ResolveOmpObjectList(enterClause->v, Symbol::Flag::OmpDeclareTarget);
2155+
ResolveOmpObjectList(std::get<parser::OmpObjectList>(enterClause->v.t),
2156+
Symbol::Flag::OmpDeclareTarget);
21562157
}
21572158
}
21582159
}

0 commit comments

Comments
 (0)