[flang][OpenMP] Enhance parser support for flush construct to OpenMP 5.0
Summary:
This patch enhances parser support for flush construct to OpenMP 5.0 by including memory-order-clause.
2.18.8 flush Construct
!$omp flush [memory-order-clause] [(list)]
where memory-order-clause is
acq_rel
release
acquire
The patch includes code changes and testcase modifications.
Reviewed By: klausler, kiranchandramohan
Differential Revision: https://reviews.llvm.org/D82177
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index ad93fcd..e5f25c2 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -520,6 +520,8 @@
NODE(parser, OpenMPDeclareReductionConstruct)
NODE(parser, OpenMPDeclareSimdConstruct)
NODE(parser, OpenMPDeclareTargetConstruct)
+ NODE(parser, OmpFlushMemoryClause)
+ NODE_ENUM(OmpFlushMemoryClause, FlushMemoryOrder)
NODE(parser, OpenMPFlushConstruct)
NODE(parser, OpenMPLoopConstruct)
NODE(parser, OpenMPSimpleStandaloneConstruct)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 933638d..8481a55 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3718,11 +3718,23 @@
std::tuple<Verbatim, OmpCancelType, std::optional<If>> t;
};
-// 2.13.7 flush -> FLUSH [(variable-name-list)]
+// 2.18.8 Flush Construct [OpenMP 5.0]
+// memory-order-clause -> acq_rel
+// release
+// acquire
+struct OmpFlushMemoryClause {
+ ENUM_CLASS(FlushMemoryOrder, AcqRel, Release, Acquire)
+ WRAPPER_CLASS_BOILERPLATE(OmpFlushMemoryClause, FlushMemoryOrder);
+ CharBlock source;
+};
+
+// 2.18.8 flush -> FLUSH [memory-order-clause] [(variable-name-list)]
struct OpenMPFlushConstruct {
TUPLE_CLASS_BOILERPLATE(OpenMPFlushConstruct);
CharBlock source;
- std::tuple<Verbatim, std::optional<OmpObjectList>> t;
+ std::tuple<Verbatim, std::optional<OmpFlushMemoryClause>,
+ std::optional<OmpObjectList>>
+ t;
};
struct OmpSimpleStandaloneDirective {
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 2d81f5a..9aa81a7 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -298,9 +298,19 @@
TYPE_PARSER(sourced(construct<OpenMPCancelConstruct>(verbatim("CANCEL"_tok),
Parser<OmpCancelType>{}, maybe("IF" >> parenthesized(scalarLogicalExpr)))))
-// 2.13.7 Flush construct
-TYPE_PARSER(sourced(construct<OpenMPFlushConstruct>(
- verbatim("FLUSH"_tok), maybe(parenthesized(Parser<OmpObjectList>{})))))
+// 2.18.8 Flush construct
+// flush -> FLUSH [memory-order-clause] [(variable-name-list)]
+// memory-order-clause -> acq_rel
+// release
+// acquire
+TYPE_PARSER(sourced(construct<OmpFlushMemoryClause>(
+ "ACQ_REL" >> pure(OmpFlushMemoryClause::FlushMemoryOrder::AcqRel) ||
+ "RELEASE" >> pure(OmpFlushMemoryClause::FlushMemoryOrder::Release) ||
+ "ACQUIRE" >> pure(OmpFlushMemoryClause::FlushMemoryOrder::Acquire))))
+
+TYPE_PARSER(sourced(construct<OpenMPFlushConstruct>(verbatim("FLUSH"_tok),
+ maybe(Parser<OmpFlushMemoryClause>{}),
+ maybe(parenthesized(Parser<OmpObjectList>{})))))
// Simple Standalone Directives
TYPE_PARSER(sourced(construct<OmpSimpleStandaloneDirective>(first(
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index c2b5c28..5acac38 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2359,10 +2359,24 @@
Put("\n");
EndOpenMP();
}
+ void Unparse(const OmpFlushMemoryClause &x) {
+ switch (x.v) {
+ case OmpFlushMemoryClause::FlushMemoryOrder::AcqRel:
+ Word("ACQ_REL ");
+ break;
+ case OmpFlushMemoryClause::FlushMemoryOrder::Release:
+ Word("RELEASE ");
+ break;
+ case OmpFlushMemoryClause::FlushMemoryOrder::Acquire:
+ Word("ACQUIRE ");
+ break;
+ }
+ }
void Unparse(const OpenMPFlushConstruct &x) {
BeginOpenMP();
- Word("!$OMP FLUSH");
- Walk("(", std::get<std::optional<OmpObjectList>>(x.t), ")");
+ Word("!$OMP FLUSH ");
+ Walk(std::get<std::optional<OmpFlushMemoryClause>>(x.t));
+ Walk(" (", std::get<std::optional<OmpObjectList>>(x.t), ")");
Put("\n");
EndOpenMP();
}
diff --git a/flang/test/Semantics/omp-clause-validity01.f90 b/flang/test/Semantics/omp-clause-validity01.f90
index 06fd720..e3f43dc 100644
--- a/flang/test/Semantics/omp-clause-validity01.f90
+++ b/flang/test/Semantics/omp-clause-validity01.f90
@@ -403,6 +403,10 @@
!ERROR: Internal: no symbol found for 'i'
!$omp ordered depend(sink:i-1)
!$omp flush (c)
+ !$omp flush acq_rel
+ !$omp flush release
+ !$omp flush acquire
+ !$omp flush release (c)
!$omp cancel DO
!$omp cancellation point parallel