aboutsummaryrefslogtreecommitdiff
path: root/flang/lib
diff options
context:
space:
mode:
authorSergio Afonso <safonsof@amd.com>2022-11-10 05:38:31 -0600
committerSergio Afonso <safonsof@amd.com>2022-11-10 05:38:31 -0600
commitd5fb5960d0df23509a501cfa5a133927bb266d4d (patch)
tree94508683a523b0e98ba264818d9f025dccd6ce82 /flang/lib
parent92297bde5ce138299995dd6609e4eb99688e6019 (diff)
downloadllvm-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.cpp4
-rw-r--r--flang/lib/Parser/openmp-parsers.cpp27
-rw-r--r--flang/lib/Parser/unparse.cpp22
-rw-r--r--flang/lib/Semantics/check-omp-structure.cpp9
-rw-r--r--flang/lib/Semantics/check-omp-structure.h2
-rw-r--r--flang/lib/Semantics/resolve-directives.cpp7
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(); }