[llvm-branch-commits] [flang] [llvm] [flang][OpenMP] Allow UPDATE clause to not have any arguments (PR #137521)
Krzysztof Parzyszek via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Apr 27 08:02:21 PDT 2025
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/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.
>From 637d237b9d904cfea6dc40eefb303f59641f545e Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Sun, 27 Apr 2025 09:51:21 -0500
Subject: [PATCH] [flang][OpenMP] Allow UPDATE clause to not have any arguments
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.
---
flang/include/flang/Parser/parse-tree.h | 5 +++
flang/lib/Lower/OpenMP/Clauses.cpp | 10 +++--
flang/lib/Parser/openmp-parsers.cpp | 50 ++++++++++++---------
flang/lib/Semantics/check-omp-structure.cpp | 16 +++++--
llvm/include/llvm/Frontend/OpenMP/OMP.td | 1 +
5 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index ca8473c6f9674..e39ecc13f4eec 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -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 ->
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index f1330b8d1909f..c258bef2e4427 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -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,
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index e631922a354c4..bfca4e3f1730a 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -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>{})))
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 987066313fee5..c582de6df0319 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -4572,10 +4572,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);
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index cdfd3e3223fa8..f4e400b651c31 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -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";
More information about the llvm-branch-commits
mailing list