diff options
author | Sergio Afonso <safonsof@amd.com> | 2022-11-10 05:38:31 -0600 |
---|---|---|
committer | Sergio Afonso <safonsof@amd.com> | 2022-11-10 05:38:31 -0600 |
commit | d5fb5960d0df23509a501cfa5a133927bb266d4d (patch) | |
tree | 94508683a523b0e98ba264818d9f025dccd6ce82 /flang/lib | |
parent | 92297bde5ce138299995dd6609e4eb99688e6019 (diff) | |
download | llvm-d5fb5960d0df23509a501cfa5a133927bb266d4d.zip llvm-d5fb5960d0df23509a501cfa5a133927bb266d4d.tar.gz llvm-d5fb5960d0df23509a501cfa5a133927bb266d4d.tar.bz2 |
[flang][OpenMP] Add parser support for Requires directive
OpenMP 5.0 adds support for the "requires" directive. This patch adds parser support for it in flang.
Differential revision: https://reviews.llvm.org/D136867
Diffstat (limited to 'flang/lib')
-rw-r--r-- | flang/lib/Lower/OpenMP.cpp | 4 | ||||
-rw-r--r-- | flang/lib/Parser/openmp-parsers.cpp | 27 | ||||
-rw-r--r-- | flang/lib/Parser/unparse.cpp | 22 | ||||
-rw-r--r-- | flang/lib/Semantics/check-omp-structure.cpp | 9 | ||||
-rw-r--r-- | flang/lib/Semantics/check-omp-structure.h | 2 | ||||
-rw-r--r-- | flang/lib/Semantics/resolve-directives.cpp | 7 |
6 files changed, 71 insertions, 0 deletions
diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 4d47b95..d487fdf 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -1815,6 +1815,10 @@ void Fortran::lower::genOpenMPDeclarativeConstruct( TODO(converter.getCurrentLocation(), "OpenMPDeclareTargetConstruct"); }, + [&](const Fortran::parser::OpenMPRequiresConstruct + &requiresConstruct) { + TODO(converter.getCurrentLocation(), "OpenMPRequiresConstruct"); + }, [&](const Fortran::parser::OpenMPThreadprivate &threadprivate) { // The directive is lowered when instantiating the variable to // support the case of threadprivate variable declared in module. diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index 9f2e152..0e9f742 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -191,6 +191,9 @@ TYPE_PARSER( parenthesized(Parser<OmpAllocateClause>{}))) || "ALLOCATOR" >> construct<OmpClause>(construct<OmpClause::Allocator>( parenthesized(scalarIntExpr))) || + "ATOMIC_DEFAULT_MEM_ORDER" >> + construct<OmpClause>(construct<OmpClause::AtomicDefaultMemOrder>( + parenthesized(Parser<OmpAtomicDefaultMemOrderClause>{}))) || "COLLAPSE" >> construct<OmpClause>(construct<OmpClause::Collapse>( parenthesized(scalarIntConstantExpr))) || "COPYIN" >> construct<OmpClause>(construct<OmpClause::Copyin>( @@ -208,6 +211,8 @@ TYPE_PARSER( "DIST_SCHEDULE" >> construct<OmpClause>(construct<OmpClause::DistSchedule>( parenthesized("STATIC" >> maybe("," >> scalarIntExpr)))) || + "DYNAMIC_ALLOCATORS" >> + construct<OmpClause>(construct<OmpClause::DynamicAllocators>()) || "FINAL" >> construct<OmpClause>(construct<OmpClause::Final>( parenthesized(scalarLogicalExpr))) || "FIRSTPRIVATE" >> construct<OmpClause>(construct<OmpClause::Firstprivate>( @@ -261,6 +266,8 @@ TYPE_PARSER( parenthesized(Parser<OmpReductionClause>{}))) || "RELAXED" >> construct<OmpClause>(construct<OmpClause::Relaxed>()) || "RELEASE" >> construct<OmpClause>(construct<OmpClause::Release>()) || + "REVERSE_OFFLOAD" >> + construct<OmpClause>(construct<OmpClause::ReverseOffload>()) || "SAFELEN" >> construct<OmpClause>(construct<OmpClause::Safelen>( parenthesized(scalarIntConstantExpr))) || "SCHEDULE" >> construct<OmpClause>(construct<OmpClause::Schedule>( @@ -278,6 +285,10 @@ TYPE_PARSER( parenthesized(Parser<OmpObjectList>{}))) || "USE_DEVICE_PTR" >> construct<OmpClause>(construct<OmpClause::UseDevicePtr>( parenthesized(nonemptyList(name)))) || + "UNIFIED_ADDRESS" >> + construct<OmpClause>(construct<OmpClause::UnifiedAddress>()) || + "UNIFIED_SHARED_MEMORY" >> + construct<OmpClause>(construct<OmpClause::UnifiedSharedMemory>()) || "UNIFORM" >> construct<OmpClause>(construct<OmpClause::Uniform>( parenthesized(nonemptyList(name)))) || "UNTIED" >> construct<OmpClause>(construct<OmpClause::Untied>())) @@ -357,6 +368,16 @@ TYPE_PARSER(sourced(construct<OmpMemoryOrderClause>( "ACQUIRE" >> construct<OmpClause>(construct<OmpClause::Acquire>()) || "RELAXED" >> construct<OmpClause>(construct<OmpClause::Relaxed>()))))) +// 2.4 Requires construct [OpenMP 5.0] +// atomic-default-mem-order-clause -> +// seq_cst +// acq_rel +// relaxed +TYPE_PARSER(construct<OmpAtomicDefaultMemOrderClause>( + "SEQ_CST" >> pure(OmpAtomicDefaultMemOrderClause::Type::SeqCst) || + "ACQ_REL" >> pure(OmpAtomicDefaultMemOrderClause::Type::AcqRel) || + "RELAXED" >> pure(OmpAtomicDefaultMemOrderClause::Type::Relaxed))) + // 2.17.7 Atomic construct // atomic-clause -> memory-order-clause | HINT(hint-expression) TYPE_PARSER(sourced(construct<OmpAtomicClause>( @@ -519,6 +540,10 @@ TYPE_PARSER( sourced(construct<OpenMPDeclareSimdConstruct>(verbatim("DECLARE SIMD"_tok), maybe(parenthesized(name)), Parser<OmpClauseList>{}))) +// 2.4 Requires construct +TYPE_PARSER(sourced(construct<OpenMPRequiresConstruct>( + verbatim("REQUIRES"_tok), some(Parser<OmpClause>{} / maybe(","_tok))))) + // 2.15.2 Threadprivate directive TYPE_PARSER(sourced(construct<OpenMPThreadprivate>( verbatim("THREADPRIVATE"_tok), parenthesized(Parser<OmpObjectList>{})))) @@ -539,6 +564,8 @@ TYPE_PARSER(startOmpLine >> Parser<OpenMPDeclareTargetConstruct>{}) || construct<OpenMPDeclarativeConstruct>( Parser<OpenMPDeclarativeAllocate>{}) || + construct<OpenMPDeclarativeConstruct>( + Parser<OpenMPRequiresConstruct>{}) || construct<OpenMPDeclarativeConstruct>(Parser<OpenMPThreadprivate>{})) / endOmpLine) diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp index 534738d..9c79908 100644 --- a/flang/lib/Parser/unparse.cpp +++ b/flang/lib/Parser/unparse.cpp @@ -2229,6 +2229,21 @@ public: break; } } + + void Unparse(const OmpAtomicDefaultMemOrderClause &x) { + switch (x.v) { + case OmpAtomicDefaultMemOrderClause::Type::SeqCst: + Word("SEQ_CST"); + break; + case OmpAtomicDefaultMemOrderClause::Type::AcqRel: + Word("ACQ_REL"); + break; + case OmpAtomicDefaultMemOrderClause::Type::Relaxed: + Word("RELAXED"); + break; + } + } + void Unparse(const OmpAtomicClauseList &x) { Walk(" ", x.v, " "); } void Unparse(const OmpAtomic &x) { @@ -2393,6 +2408,13 @@ public: Word("DECLARE TARGET "); return true; }, + [&](const OpenMPRequiresConstruct &y) { + Word("REQUIRES "); + Walk(std::get<OmpClauseList>(y.t)); + Put("\n"); + EndOpenMP(); + return false; + }, [&](const OpenMPThreadprivate &) { Word("THREADPRIVATE ("); return true; diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index bb983564..0c11a97 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -1060,6 +1060,15 @@ void OmpStructureChecker::Leave(const parser::OpenMPDeclareSimdConstruct &) { dirContext_.pop_back(); } +void OmpStructureChecker::Enter(const parser::OpenMPRequiresConstruct &x) { + const auto &dir{std::get<parser::Verbatim>(x.t)}; + PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_requires); +} + +void OmpStructureChecker::Leave(const parser::OpenMPRequiresConstruct &) { + dirContext_.pop_back(); +} + void OmpStructureChecker::Enter(const parser::OpenMPDeclarativeAllocate &x) { isPredefinedAllocator = true; const auto &dir{std::get<parser::Verbatim>(x.t)}; diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h index 0ff0b90..2751cdd 100644 --- a/flang/lib/Semantics/check-omp-structure.h +++ b/flang/lib/Semantics/check-omp-structure.h @@ -152,6 +152,8 @@ public: void Leave(const parser::OpenMPDeclareTargetConstruct &); void Enter(const parser::OpenMPExecutableAllocate &); void Leave(const parser::OpenMPExecutableAllocate &); + void Enter(const parser::OpenMPRequiresConstruct &); + void Leave(const parser::OpenMPRequiresConstruct &); void Enter(const parser::OpenMPThreadprivate &); void Leave(const parser::OpenMPThreadprivate &); diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 16eacc5..82623ac 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -323,6 +323,13 @@ public: return true; } void Post(const parser::OpenMPDeclareSimdConstruct &) { PopContext(); } + + bool Pre(const parser::OpenMPRequiresConstruct &x) { + PushContext(x.source, llvm::omp::Directive::OMPD_requires); + return true; + } + void Post(const parser::OpenMPRequiresConstruct &) { PopContext(); } + bool Pre(const parser::OpenMPThreadprivate &); void Post(const parser::OpenMPThreadprivate &) { PopContext(); } |