[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
This commit is contained in:
Kiran Kumar T P 2020-07-07 14:26:22 +05:30
parent 9db53a1827
commit cd503166fb
5 changed files with 49 additions and 7 deletions

View File

@ -521,6 +521,8 @@ public:
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)

View File

@ -3707,11 +3707,23 @@ struct OpenMPCancelConstruct {
std::tuple<Verbatim, OmpCancelType, std::optional<If>> t;
};
// 2.13.7 flush -> FLUSH [(variable-name-list)]
// 2.17.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.17.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 {

View File

@ -291,9 +291,19 @@ TYPE_PARSER(sourced(construct<OpenMPCancellationPointConstruct>(
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.17.8 Flush construct [OpenMP 5.0]
// 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(

View File

@ -2369,10 +2369,24 @@ public:
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();
}

View File

@ -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