mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 09:31:59 +08:00
[flang][OpenMP] Allow UPDATE clause to not have any arguments (#137521)
The UPDATE clause can be specified on both ATOMIC and DEPOBJ directives. Currently, the ATOMIC directive has its own handling of it, and the definition of the UPDATE clause only supports its use in the DEPOBJ directive, where it takes a dependence-type as an argument. The UPDATE clause on the ATOMIC directive may not have any arguments. Since the implementation of the ATOMIC construct will be modified to use the standard handling of clauses, the definition of UPDATE should reflect that.
This commit is contained in:
committed by
GitHub
parent
cf9d4048fb
commit
760bba4666
@@ -4501,6 +4501,11 @@ struct OmpToClause {
|
||||
|
||||
// Ref: [5.0:254-255], [5.1:287-288], [5.2:321-322]
|
||||
//
|
||||
// In ATOMIC construct
|
||||
// update-clause ->
|
||||
// UPDATE // Since 4.5
|
||||
//
|
||||
// In DEPOBJ construct
|
||||
// update-clause ->
|
||||
// UPDATE(dependence-type) // since 5.0, until 5.1
|
||||
// update-clause ->
|
||||
|
||||
@@ -1400,9 +1400,13 @@ Uniform make(const parser::OmpClause::Uniform &inp,
|
||||
Update make(const parser::OmpClause::Update &inp,
|
||||
semantics::SemanticsContext &semaCtx) {
|
||||
// inp.v -> parser::OmpUpdateClause
|
||||
auto depType =
|
||||
common::visit([](auto &&s) { return makeDepType(s); }, inp.v.u);
|
||||
return Update{/*DependenceType=*/depType};
|
||||
if (inp.v) {
|
||||
return common::visit(
|
||||
[](auto &&s) { return Update{/*DependenceType=*/makeDepType(s)}; },
|
||||
inp.v->u);
|
||||
} else {
|
||||
return Update{/*DependenceType=*/std::nullopt};
|
||||
}
|
||||
}
|
||||
|
||||
Use make(const parser::OmpClause::Use &inp,
|
||||
|
||||
@@ -836,9 +836,9 @@ TYPE_PARSER(construct<OmpInitClause>(
|
||||
TYPE_PARSER(construct<OmpAlignedClause>(Parser<OmpObjectList>{},
|
||||
maybe(":" >> nonemptyList(Parser<OmpAlignedClause::Modifier>{}))))
|
||||
|
||||
TYPE_PARSER(construct<OmpUpdateClause>(
|
||||
construct<OmpUpdateClause>(Parser<OmpDependenceType>{}) ||
|
||||
construct<OmpUpdateClause>(Parser<OmpTaskDependenceType>{})))
|
||||
TYPE_PARSER( //
|
||||
construct<OmpUpdateClause>(parenthesized(Parser<OmpDependenceType>{})) ||
|
||||
construct<OmpUpdateClause>(parenthesized(Parser<OmpTaskDependenceType>{})))
|
||||
|
||||
TYPE_PARSER(construct<OmpOrderClause>(
|
||||
maybe(nonemptyList(Parser<OmpOrderClause::Modifier>{}) / ":"),
|
||||
@@ -1079,7 +1079,7 @@ TYPE_PARSER( //
|
||||
parenthesized(nonemptyList(name)))) ||
|
||||
"UNTIED" >> construct<OmpClause>(construct<OmpClause::Untied>()) ||
|
||||
"UPDATE" >> construct<OmpClause>(construct<OmpClause::Update>(
|
||||
parenthesized(Parser<OmpUpdateClause>{}))) ||
|
||||
maybe(Parser<OmpUpdateClause>{}))) ||
|
||||
"WHEN" >> construct<OmpClause>(construct<OmpClause::When>(
|
||||
parenthesized(Parser<OmpWhenClause>{}))) ||
|
||||
// Cancellable constructs
|
||||
@@ -1313,24 +1313,30 @@ TYPE_PARSER(
|
||||
endOfLine)
|
||||
|
||||
// Directives enclosing structured-block
|
||||
TYPE_PARSER(construct<OmpBlockDirective>(first(
|
||||
"MASKED" >> pure(llvm::omp::Directive::OMPD_masked),
|
||||
"MASTER" >> pure(llvm::omp::Directive::OMPD_master),
|
||||
"ORDERED" >> pure(llvm::omp::Directive::OMPD_ordered),
|
||||
"PARALLEL MASKED" >> pure(llvm::omp::Directive::OMPD_parallel_masked),
|
||||
"PARALLEL MASTER" >> pure(llvm::omp::Directive::OMPD_parallel_master),
|
||||
"PARALLEL WORKSHARE" >> pure(llvm::omp::Directive::OMPD_parallel_workshare),
|
||||
"PARALLEL" >> pure(llvm::omp::Directive::OMPD_parallel),
|
||||
"SCOPE" >> pure(llvm::omp::Directive::OMPD_scope),
|
||||
"SINGLE" >> pure(llvm::omp::Directive::OMPD_single),
|
||||
"TARGET DATA" >> pure(llvm::omp::Directive::OMPD_target_data),
|
||||
"TARGET PARALLEL" >> pure(llvm::omp::Directive::OMPD_target_parallel),
|
||||
"TARGET TEAMS" >> pure(llvm::omp::Directive::OMPD_target_teams),
|
||||
"TARGET" >> pure(llvm::omp::Directive::OMPD_target),
|
||||
"TASK"_id >> pure(llvm::omp::Directive::OMPD_task),
|
||||
"TASKGROUP" >> pure(llvm::omp::Directive::OMPD_taskgroup),
|
||||
"TEAMS" >> pure(llvm::omp::Directive::OMPD_teams),
|
||||
"WORKSHARE" >> pure(llvm::omp::Directive::OMPD_workshare))))
|
||||
TYPE_PARSER(
|
||||
// In this context "TARGET UPDATE" can be parsed as a TARGET directive
|
||||
// followed by an UPDATE clause. This is the only combination at the
|
||||
// moment, exclude it explicitly.
|
||||
(!"TARGET UPDATE"_sptok) >=
|
||||
construct<OmpBlockDirective>(first(
|
||||
"MASKED" >> pure(llvm::omp::Directive::OMPD_masked),
|
||||
"MASTER" >> pure(llvm::omp::Directive::OMPD_master),
|
||||
"ORDERED" >> pure(llvm::omp::Directive::OMPD_ordered),
|
||||
"PARALLEL MASKED" >> pure(llvm::omp::Directive::OMPD_parallel_masked),
|
||||
"PARALLEL MASTER" >> pure(llvm::omp::Directive::OMPD_parallel_master),
|
||||
"PARALLEL WORKSHARE" >>
|
||||
pure(llvm::omp::Directive::OMPD_parallel_workshare),
|
||||
"PARALLEL" >> pure(llvm::omp::Directive::OMPD_parallel),
|
||||
"SCOPE" >> pure(llvm::omp::Directive::OMPD_scope),
|
||||
"SINGLE" >> pure(llvm::omp::Directive::OMPD_single),
|
||||
"TARGET DATA" >> pure(llvm::omp::Directive::OMPD_target_data),
|
||||
"TARGET PARALLEL" >> pure(llvm::omp::Directive::OMPD_target_parallel),
|
||||
"TARGET TEAMS" >> pure(llvm::omp::Directive::OMPD_target_teams),
|
||||
"TARGET" >> pure(llvm::omp::Directive::OMPD_target),
|
||||
"TASK"_id >> pure(llvm::omp::Directive::OMPD_task),
|
||||
"TASKGROUP" >> pure(llvm::omp::Directive::OMPD_taskgroup),
|
||||
"TEAMS" >> pure(llvm::omp::Directive::OMPD_teams),
|
||||
"WORKSHARE" >> pure(llvm::omp::Directive::OMPD_workshare))))
|
||||
|
||||
TYPE_PARSER(sourced(construct<OmpBeginBlockDirective>(
|
||||
sourced(Parser<OmpBlockDirective>{}), Parser<OmpClauseList>{})))
|
||||
|
||||
@@ -4571,10 +4571,18 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
|
||||
llvm::omp::Directive dir{GetContext().directive};
|
||||
unsigned version{context_.langOptions().OpenMPVersion};
|
||||
|
||||
auto *depType{std::get_if<parser::OmpDependenceType>(&x.v.u)};
|
||||
auto *taskType{std::get_if<parser::OmpTaskDependenceType>(&x.v.u)};
|
||||
assert(((depType == nullptr) != (taskType == nullptr)) &&
|
||||
"Unexpected alternative in update clause");
|
||||
const parser::OmpDependenceType *depType{nullptr};
|
||||
const parser::OmpTaskDependenceType *taskType{nullptr};
|
||||
if (auto &maybeUpdate{x.v}) {
|
||||
depType = std::get_if<parser::OmpDependenceType>(&maybeUpdate->u);
|
||||
taskType = std::get_if<parser::OmpTaskDependenceType>(&maybeUpdate->u);
|
||||
}
|
||||
|
||||
if (!depType && !taskType) {
|
||||
assert(dir == llvm::omp::Directive::OMPD_atomic &&
|
||||
"Unexpected alternative in update clause");
|
||||
return;
|
||||
}
|
||||
|
||||
if (depType) {
|
||||
CheckDependenceType(depType->v);
|
||||
|
||||
@@ -525,6 +525,7 @@ def OMPC_Untied : Clause<"untied"> {
|
||||
def OMPC_Update : Clause<"update"> {
|
||||
let clangClass = "OMPUpdateClause";
|
||||
let flangClass = "OmpUpdateClause";
|
||||
let isValueOptional = true;
|
||||
}
|
||||
def OMPC_Use : Clause<"use"> {
|
||||
let clangClass = "OMPUseClause";
|
||||
|
||||
Reference in New Issue
Block a user