[flang-commits] [flang] [Flang][OpenMP] Accept the reduction modifier (PR #86492)
Kiran Chandramohan via flang-commits
flang-commits at lists.llvm.org
Sat Apr 6 05:53:03 PDT 2024
https://github.com/kiranchandramohan updated https://github.com/llvm/llvm-project/pull/86492
>From 8df51eccf4b8453d9a59a09c3f7a97561380dfe2 Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Mon, 25 Mar 2024 11:48:24 +0000
Subject: [PATCH] [Flang][OpenMP] Accept the reduction modifier
---
flang/include/flang/Parser/dump-parse-tree.h | 1 +
flang/include/flang/Parser/parse-tree.h | 5 ++++-
flang/lib/Lower/OpenMP/ClauseT.h | 6 +++++-
flang/lib/Lower/OpenMP/Clauses.cpp | 10 +++++++---
flang/lib/Lower/OpenMP/ReductionProcessor.cpp | 6 ++++++
flang/lib/Parser/openmp-parsers.cpp | 5 +++++
flang/lib/Parser/unparse.cpp | 4 ++++
flang/lib/Semantics/check-omp-structure.cpp | 2 +-
.../Lower/OpenMP/Todo/reduction-modifiers.f90 | 13 ++++++++++++
.../test/Parser/OpenMP/reduction-modifier.f90 | 20 +++++++++++++++++++
10 files changed, 66 insertions(+), 6 deletions(-)
create mode 100644 flang/test/Lower/OpenMP/Todo/reduction-modifiers.f90
create mode 100644 flang/test/Parser/OpenMP/reduction-modifier.f90
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index b2c3d92909375c..c08f1be9331d18 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -541,6 +541,7 @@ class ParseTreeDumper {
NODE_ENUM(OmpOrderModifier, Kind)
NODE(parser, OmpProcBindClause)
NODE_ENUM(OmpProcBindClause, Type)
+ NODE_ENUM(OmpReductionClause, ReductionModifier)
NODE(parser, OmpReductionClause)
NODE(parser, OmpInReductionClause)
NODE(parser, OmpReductionCombiner)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index c96abfba491d4b..750f549f58940a 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -3549,7 +3549,10 @@ struct OmpReductionOperator {
// variable-name-list)
struct OmpReductionClause {
TUPLE_CLASS_BOILERPLATE(OmpReductionClause);
- std::tuple<OmpReductionOperator, OmpObjectList> t;
+ ENUM_CLASS(ReductionModifier, Inscan, Task, Default)
+ std::tuple<std::optional<ReductionModifier>, OmpReductionOperator,
+ OmpObjectList>
+ t;
};
// OMP 5.0 2.19.5.6 in_reduction-clause -> IN_REDUCTION (reduction-identifier:
diff --git a/flang/lib/Lower/OpenMP/ClauseT.h b/flang/lib/Lower/OpenMP/ClauseT.h
index 2aae29af29214a..d39bbf9668579c 100644
--- a/flang/lib/Lower/OpenMP/ClauseT.h
+++ b/flang/lib/Lower/OpenMP/ClauseT.h
@@ -596,8 +596,12 @@ struct ProcBindT {
template <typename I, typename E>
struct ReductionT {
+ using ReductionModifier =
+ Fortran::parser::OmpReductionClause::ReductionModifier;
using TupleTrait = std::true_type;
- std::tuple<ReductionOperatorT<I, E>, ObjectListT<I, E>> t;
+ std::tuple<std::optional<ReductionModifier>, ReductionOperatorT<I, E>,
+ ObjectListT<I, E>>
+ t;
};
template <typename I, typename E>
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index 70f232a4858e1b..d6839605fc72f1 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -616,9 +616,13 @@ ProcBind make(const parser::OmpClause::ProcBind &inp,
Reduction make(const parser::OmpClause::Reduction &inp,
semantics::SemanticsContext &semaCtx) {
// inp.v -> parser::OmpReductionClause
- auto &t0 = std::get<parser::OmpReductionOperator>(inp.v.t);
- auto &t1 = std::get<parser::OmpObjectList>(inp.v.t);
- return Reduction{{makeReductionOperator(t0, semaCtx), makeList(t1, semaCtx)}};
+ auto &t0 =
+ std::get<std::optional<parser::OmpReductionClause::ReductionModifier>>(
+ inp.v.t);
+ auto &t1 = std::get<parser::OmpReductionOperator>(inp.v.t);
+ auto &t2 = std::get<parser::OmpObjectList>(inp.v.t);
+ return Reduction{
+ {t0, makeReductionOperator(t1, semaCtx), makeList(t2, semaCtx)}};
}
Safelen make(const parser::OmpClause::Safelen &inp,
diff --git a/flang/lib/Lower/OpenMP/ReductionProcessor.cpp b/flang/lib/Lower/OpenMP/ReductionProcessor.cpp
index 6dc467c4f69bcd..ff74b986b3da0a 100644
--- a/flang/lib/Lower/OpenMP/ReductionProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ReductionProcessor.cpp
@@ -368,6 +368,12 @@ void ReductionProcessor::addReductionDecl(
llvm::SmallVectorImpl<const Fortran::semantics::Symbol *>
*reductionSymbols) {
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
+
+ if (std::get<std::optional<omp::clause::Reduction::ReductionModifier>>(
+ reduction.t)) {
+ TODO(currentLocation, "Reduction modifiers are not supported");
+ }
+
mlir::omp::ReductionDeclareOp decl;
const auto &redOperator{
std::get<omp::clause::ReductionOperator>(reduction.t)};
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index bba1be27158ce7..eae4784169146e 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -136,6 +136,11 @@ TYPE_PARSER(construct<OmpReductionOperator>(Parser<DefinedOperator>{}) ||
construct<OmpReductionOperator>(Parser<ProcedureDesignator>{}))
TYPE_PARSER(construct<OmpReductionClause>(
+ maybe(
+ ("INSCAN" >> pure(OmpReductionClause::ReductionModifier::Inscan) ||
+ "TASK" >> pure(OmpReductionClause::ReductionModifier::Task) ||
+ "DEFAULT" >> pure(OmpReductionClause::ReductionModifier::Default)) /
+ ","),
Parser<OmpReductionOperator>{} / ":", Parser<OmpObjectList>{}))
// OMP 5.0 2.19.5.6 IN_REDUCTION (reduction-identifier: variable-name-list)
diff --git a/flang/lib/Parser/unparse.cpp b/flang/lib/Parser/unparse.cpp
index baba4863f5775f..579930770bbc26 100644
--- a/flang/lib/Parser/unparse.cpp
+++ b/flang/lib/Parser/unparse.cpp
@@ -2086,6 +2086,8 @@ class UnparseVisitor {
Walk(":", x.step);
}
void Unparse(const OmpReductionClause &x) {
+ Walk(std::get<std::optional<OmpReductionClause::ReductionModifier>>(x.t),
+ ",");
Walk(std::get<OmpReductionOperator>(x.t));
Put(":");
Walk(std::get<OmpObjectList>(x.t));
@@ -2723,6 +2725,8 @@ class UnparseVisitor {
WALK_NESTED_ENUM(OmpScheduleClause, ScheduleType) // OMP schedule-type
WALK_NESTED_ENUM(OmpDeviceClause, DeviceModifier) // OMP device modifier
WALK_NESTED_ENUM(OmpDeviceTypeClause, Type) // OMP DEVICE_TYPE
+ WALK_NESTED_ENUM(
+ OmpReductionClause, ReductionModifier) // OMP reduction-modifier
WALK_NESTED_ENUM(OmpIfClause, DirectiveNameModifier) // OMP directive-modifier
WALK_NESTED_ENUM(OmpCancelType, Type) // OMP cancel-type
WALK_NESTED_ENUM(OmpOrderClause, Type) // OMP order-type
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index bf4debee1df34c..e85d8d1f7ab533 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2289,7 +2289,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Reduction &x) {
bool OmpStructureChecker::CheckReductionOperators(
const parser::OmpClause::Reduction &x) {
- const auto &definedOp{std::get<0>(x.v.t)};
+ const auto &definedOp{std::get<parser::OmpReductionOperator>(x.v.t)};
bool ok = false;
common::visit(
common::visitors{
diff --git a/flang/test/Lower/OpenMP/Todo/reduction-modifiers.f90 b/flang/test/Lower/OpenMP/Todo/reduction-modifiers.f90
new file mode 100644
index 00000000000000..5e566466492ceb
--- /dev/null
+++ b/flang/test/Lower/OpenMP/Todo/reduction-modifiers.f90
@@ -0,0 +1,13 @@
+! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
+! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
+
+! CHECK: not yet implemented: Reduction modifiers are not supported
+
+subroutine foo()
+ integer :: i, j
+ j = 0
+ !$omp do reduction (inscan, *: j)
+ do i = 1, 10
+ j = j + 1
+ end do
+end subroutine
diff --git a/flang/test/Parser/OpenMP/reduction-modifier.f90 b/flang/test/Parser/OpenMP/reduction-modifier.f90
new file mode 100644
index 00000000000000..d46aa709595925
--- /dev/null
+++ b/flang/test/Parser/OpenMP/reduction-modifier.f90
@@ -0,0 +1,20 @@
+! RUN: %flang_fc1 -fdebug-unparse-no-sema -fopenmp %s | FileCheck --ignore-case %s
+! RUN: %flang_fc1 -fdebug-dump-parse-tree-no-sema -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s
+
+subroutine foo()
+ integer :: i, j
+ j = 0
+! CHECK: !$OMP DO REDUCTION(TASK,*:j)
+! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
+! PARSE-TREE: | | | OmpBeginLoopDirective
+! PARSE-TREE: | | | | OmpLoopDirective -> llvm::omp::Directive = do
+! PARSE-TREE: | | | | OmpClauseList -> OmpClause -> Reduction -> OmpReductionClause
+! PARSE-TREE: | | | | | ReductionModifier = Task
+! PARSE-TREE: | | | | | OmpReductionOperator -> DefinedOperator -> IntrinsicOperator = Multiply
+! PARSE-TREE: | | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'j
+ !$omp do reduction (task, *: j)
+ do i = 1, 10
+ j = j + 1
+ end do
+ !$omp end do
+end
More information about the flang-commits
mailing list