diff options
author | Kiran Kumar T P <kirankumar.tp@amd.com> | 2020-09-08 06:52:07 +0530 |
---|---|---|
committer | Kiran Kumar T P <kirankumar.tp@amd.com> | 2020-09-08 06:52:07 +0530 |
commit | 4536c6acb3809eaadc836f24f091db1b50b82af9 (patch) | |
tree | f15075fbda25d8492b5fdb83d06803707c74d766 /flang/include | |
parent | 35f708a3c9ffceacbeaf8abfb0ba5123e346b30e (diff) | |
download | llvm-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.h | 16 | ||||
-rw-r--r-- | flang/include/flang/Parser/parse-tree.h | 57 |
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; }; |