aboutsummaryrefslogtreecommitdiff
path: root/flang/include
diff options
context:
space:
mode:
authorKiran Kumar T P <kirankumar.tp@amd.com>2020-09-08 06:52:07 +0530
committerKiran Kumar T P <kirankumar.tp@amd.com>2020-09-08 06:52:07 +0530
commit4536c6acb3809eaadc836f24f091db1b50b82af9 (patch)
treef15075fbda25d8492b5fdb83d06803707c74d766 /flang/include
parent35f708a3c9ffceacbeaf8abfb0ba5123e346b30e (diff)
downloadllvm-4536c6acb3809eaadc836f24f091db1b50b82af9.zip
llvm-4536c6acb3809eaadc836f24f091db1b50b82af9.tar.gz
llvm-4536c6acb3809eaadc836f24f091db1b50b82af9.tar.bz2
[flang][OpenMP] Enhance parser support for atomic construct to OpenMP 5.0
Summary: This patch enhances parser support for atomic construct to OpenMP 5.0. 2.17.7 atomic -> ATOMIC [clause [,]] atomic-clause [[,] clause] | ATOMIC [clause] clause -> memory-order-clause | HINT(hint-expression) memory-order-clause -> SEQ_CST | ACQ_REL | RELEASE | ACQUIRE | RELAXED atomic-clause -> READ | WRITE | UPDATE | CAPTURE The patch includes code changes and testcase modifications. Reviewed By: DavidTruby, kiranchandramohan, sameeranjoshi Differential Revision: https://reviews.llvm.org/D82931
Diffstat (limited to 'flang/include')
-rw-r--r--flang/include/flang/Parser/dump-parse-tree.h16
-rw-r--r--flang/include/flang/Parser/parse-tree.h57
2 files changed, 45 insertions, 28 deletions
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 41ff963..921e617 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -445,6 +445,9 @@ public:
NODE(parser, OmpAtomicCapture)
NODE(OmpAtomicCapture, Stmt1)
NODE(OmpAtomicCapture, Stmt2)
+ NODE(parser, OmpAtomicMemoryOrderClause)
+ NODE(parser, OmpAtomicMemoryOrderClauseList)
+ NODE(parser, OmpAtomicMemoryOrderClausePostList)
NODE(parser, OmpAtomicRead)
NODE(parser, OmpAtomicUpdate)
NODE(parser, OmpAtomicWrite)
@@ -464,7 +467,6 @@ public:
#include "llvm/Frontend/OpenMP/OMP.cpp.inc"
NODE(parser, OmpClauseList)
NODE(parser, OmpCriticalDirective)
- NODE(OmpCriticalDirective, Hint)
NODE(parser, OmpDeclareTargetSpecifier)
NODE(parser, OmpDeclareTargetWithClause)
NODE(parser, OmpDeclareTargetWithList)
@@ -487,6 +489,7 @@ public:
NODE(parser, OmpEndCriticalDirective)
NODE(parser, OmpEndLoopDirective)
NODE(parser, OmpEndSectionsDirective)
+ NODE(parser, OmpHintExpr)
NODE(parser, OmpIfClause)
NODE_ENUM(OmpIfClause, DirectiveNameModifier)
NODE(parser, OmpLinearClause)
@@ -499,10 +502,12 @@ public:
NODE(parser, OmpMapType)
NODE(OmpMapType, Always)
NODE_ENUM(OmpMapType, Type)
- NODE(parser, OmpMemoryClause)
- NODE_ENUM(OmpMemoryClause, MemoryOrder)
- NODE(parser, OmpMemoryClauseList)
- NODE(parser, OmpMemoryClausePostList)
+ NODE(parser, OmpMemoryOrderClause)
+ static std::string GetNodeName(const llvm::omp::Clause &x) {
+ return llvm::Twine(
+ "llvm::omp::Clause = ", llvm::omp::getOpenMPClauseName(x))
+ .str();
+ }
NODE(parser, OmpNowait)
NODE(parser, OmpObject)
NODE(parser, OmpObjectList)
@@ -549,7 +554,6 @@ public:
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 166e573b..a9fb92c 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3591,12 +3591,14 @@ struct OpenMPDeclarativeConstruct {
u;
};
+// HINT(hint-expression)
+WRAPPER_CLASS(OmpHintExpr, ConstantExpr);
+
// 2.13.2 CRITICAL [Name] <block> END CRITICAL [Name]
struct OmpCriticalDirective {
TUPLE_CLASS_BOILERPLATE(OmpCriticalDirective);
- WRAPPER_CLASS(Hint, ConstantExpr);
CharBlock source;
- std::tuple<Verbatim, std::optional<Name>, std::optional<Hint>> t;
+ std::tuple<Verbatim, std::optional<Name>, std::optional<OmpHintExpr>> t;
};
struct OmpEndCriticalDirective {
TUPLE_CLASS_BOILERPLATE(OmpEndCriticalDirective);
@@ -3608,44 +3610,56 @@ struct OpenMPCriticalConstruct {
std::tuple<OmpCriticalDirective, Block, OmpEndCriticalDirective> t;
};
-// 2.13.6 atomic -> ATOMIC [seq_cst[,]] atomic-clause [[,]seq_cst] |
-// ATOMIC [seq_cst]
+// 2.17.7 atomic -> ATOMIC [clause[,]] atomic-clause [[,]clause] |
+// ATOMIC [clause]
+// clause -> memory-order-clause | HINT(hint-expression)
+// memory-order-clause -> SEQ_CST | ACQ_REL | RELEASE | ACQUIRE | RELAXED
// atomic-clause -> READ | WRITE | UPDATE | CAPTURE
// END ATOMIC
EMPTY_CLASS(OmpEndAtomic);
-// ATOMIC Memory related clause
-struct OmpMemoryClause {
- ENUM_CLASS(MemoryOrder, SeqCst)
- WRAPPER_CLASS_BOILERPLATE(OmpMemoryClause, MemoryOrder);
+// Memory order clause
+struct OmpMemoryOrderClause {
+ WRAPPER_CLASS_BOILERPLATE(OmpMemoryOrderClause, llvm::omp::Clause);
CharBlock source;
};
-WRAPPER_CLASS(OmpMemoryClauseList, std::list<OmpMemoryClause>);
-WRAPPER_CLASS(OmpMemoryClausePostList, std::list<OmpMemoryClause>);
+// ATOMIC Memory order clause or hint expression
+struct OmpAtomicMemoryOrderClause {
+ UNION_CLASS_BOILERPLATE(OmpAtomicMemoryOrderClause);
+ std::variant<OmpMemoryOrderClause, OmpHintExpr> u;
+};
+
+WRAPPER_CLASS(
+ OmpAtomicMemoryOrderClauseList, std::list<OmpAtomicMemoryOrderClause>);
+WRAPPER_CLASS(
+ OmpAtomicMemoryOrderClausePostList, std::list<OmpAtomicMemoryOrderClause>);
// ATOMIC READ
struct OmpAtomicRead {
TUPLE_CLASS_BOILERPLATE(OmpAtomicRead);
- std::tuple<OmpMemoryClauseList, Verbatim, OmpMemoryClausePostList,
- Statement<AssignmentStmt>, std::optional<OmpEndAtomic>>
+ std::tuple<OmpAtomicMemoryOrderClauseList, Verbatim,
+ OmpAtomicMemoryOrderClausePostList, Statement<AssignmentStmt>,
+ std::optional<OmpEndAtomic>>
t;
};
// ATOMIC WRITE
struct OmpAtomicWrite {
TUPLE_CLASS_BOILERPLATE(OmpAtomicWrite);
- std::tuple<OmpMemoryClauseList, Verbatim, OmpMemoryClausePostList,
- Statement<AssignmentStmt>, std::optional<OmpEndAtomic>>
+ std::tuple<OmpAtomicMemoryOrderClauseList, Verbatim,
+ OmpAtomicMemoryOrderClausePostList, Statement<AssignmentStmt>,
+ std::optional<OmpEndAtomic>>
t;
};
// ATOMIC UPDATE
struct OmpAtomicUpdate {
TUPLE_CLASS_BOILERPLATE(OmpAtomicUpdate);
- std::tuple<OmpMemoryClauseList, Verbatim, OmpMemoryClausePostList,
- Statement<AssignmentStmt>, std::optional<OmpEndAtomic>>
+ std::tuple<OmpAtomicMemoryOrderClauseList, Verbatim,
+ OmpAtomicMemoryOrderClausePostList, Statement<AssignmentStmt>,
+ std::optional<OmpEndAtomic>>
t;
};
@@ -3654,16 +3668,16 @@ struct OmpAtomicCapture {
TUPLE_CLASS_BOILERPLATE(OmpAtomicCapture);
WRAPPER_CLASS(Stmt1, Statement<AssignmentStmt>);
WRAPPER_CLASS(Stmt2, Statement<AssignmentStmt>);
- std::tuple<OmpMemoryClauseList, Verbatim, OmpMemoryClausePostList, Stmt1,
- Stmt2, OmpEndAtomic>
+ std::tuple<OmpAtomicMemoryOrderClauseList, Verbatim,
+ OmpAtomicMemoryOrderClausePostList, Stmt1, Stmt2, OmpEndAtomic>
t;
};
// ATOMIC
struct OmpAtomic {
TUPLE_CLASS_BOILERPLATE(OmpAtomic);
- std::tuple<Verbatim, OmpMemoryClauseList, Statement<AssignmentStmt>,
- std::optional<OmpEndAtomic>>
+ std::tuple<Verbatim, OmpAtomicMemoryOrderClauseList,
+ Statement<AssignmentStmt>, std::optional<OmpEndAtomic>>
t;
};
@@ -3707,8 +3721,7 @@ struct OpenMPCancelConstruct {
// release
// acquire
struct OmpFlushMemoryClause {
- ENUM_CLASS(FlushMemoryOrder, AcqRel, Release, Acquire)
- WRAPPER_CLASS_BOILERPLATE(OmpFlushMemoryClause, FlushMemoryOrder);
+ WRAPPER_CLASS_BOILERPLATE(OmpFlushMemoryClause, llvm::omp::Clause);
CharBlock source;
};