Skip to content

Commit 29d4d7f

Browse files
authored
[flang][OpenMP] Add frontend support for INOUTSET and MUTEXINOUTSET (#114895)
These are additional modifiers of the "task dependence type" kind, which is already handled by the frontend.
1 parent 4a88b90 commit 29d4d7f

File tree

10 files changed

+99
-23
lines changed

10 files changed

+99
-23
lines changed

flang/include/flang/Parser/parse-tree.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3447,7 +3447,8 @@ WRAPPER_CLASS(OmpObjectList, std::list<OmpObject>);
34473447
// MUTEXINOUTSET | DEPOBJ | // since 5.0
34483448
// INOUTSET // since 5.2
34493449
struct OmpTaskDependenceType {
3450-
ENUM_CLASS(Type, In, Out, Inout, Source, Sink, Depobj)
3450+
ENUM_CLASS(
3451+
Type, In, Out, Inout, Inoutset, Mutexinoutset, Source, Sink, Depobj)
34513452
WRAPPER_CLASS_BOILERPLATE(OmpTaskDependenceType, Type);
34523453
};
34533454

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,11 @@ genProcBindKindAttr(fir::FirOpBuilder &firOpBuilder,
121121
}
122122

123123
static mlir::omp::ClauseTaskDependAttr
124-
genDependKindAttr(fir::FirOpBuilder &firOpBuilder,
124+
genDependKindAttr(lower::AbstractConverter &converter,
125125
const omp::clause::Depend::TaskDependenceType kind) {
126+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
127+
mlir::Location currentLocation = converter.getCurrentLocation();
128+
126129
mlir::omp::ClauseTaskDepend pbKind;
127130
switch (kind) {
128131
case omp::clause::Depend::TaskDependenceType::In:
@@ -136,6 +139,8 @@ genDependKindAttr(fir::FirOpBuilder &firOpBuilder,
136139
break;
137140
case omp::clause::Depend::TaskDependenceType::Mutexinoutset:
138141
case omp::clause::Depend::TaskDependenceType::Inoutset:
142+
TODO(currentLocation, "INOUTSET and MUTEXINOUTSET are not supported yet");
143+
break;
139144
case omp::clause::Depend::TaskDependenceType::Depobj:
140145
case omp::clause::Depend::TaskDependenceType::Sink:
141146
case omp::clause::Depend::TaskDependenceType::Source:
@@ -795,8 +800,6 @@ bool ClauseProcessor::processCopyprivate(
795800
}
796801

797802
bool ClauseProcessor::processDepend(mlir::omp::DependClauseOps &result) const {
798-
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
799-
800803
auto process = [&](const omp::clause::Depend &clause,
801804
const parser::CharBlock &) {
802805
using Depend = omp::clause::Depend;
@@ -813,7 +816,7 @@ bool ClauseProcessor::processDepend(mlir::omp::DependClauseOps &result) const {
813816
"Support for iterator modifiers is not implemented yet");
814817
}
815818
mlir::omp::ClauseTaskDependAttr dependTypeOperand =
816-
genDependKindAttr(firOpBuilder, kind);
819+
genDependKindAttr(converter, kind);
817820
result.dependKinds.append(objects.size(), dependTypeOperand);
818821

819822
for (const omp::Object &object : objects) {

flang/lib/Lower/OpenMP/Clauses.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,10 @@ makeDepType(const parser::OmpTaskDependenceType &inp) {
347347
return clause::TaskDependenceType::In;
348348
case parser::OmpTaskDependenceType::Type::Inout:
349349
return clause::TaskDependenceType::Inout;
350-
// Inoutset // missing-in-parser
351-
// Mutexinoutset // missing-in-parser
350+
case parser::OmpTaskDependenceType::Type::Inoutset:
351+
return clause::TaskDependenceType::Inoutset;
352+
case parser::OmpTaskDependenceType::Type::Mutexinoutset:
353+
return clause::TaskDependenceType::Mutexinoutset;
352354
case parser::OmpTaskDependenceType::Type::Out:
353355
return clause::TaskDependenceType::Out;
354356
case parser::OmpTaskDependenceType::Type::Sink:

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,9 @@ TYPE_PARSER(
402402
TYPE_PARSER(construct<OmpTaskDependenceType>(
403403
"DEPOBJ" >> pure(OmpTaskDependenceType::Type::Depobj) ||
404404
"IN"_id >> pure(OmpTaskDependenceType::Type::In) ||
405-
"INOUT" >> pure(OmpTaskDependenceType::Type::Inout) ||
405+
"INOUT"_id >> pure(OmpTaskDependenceType::Type::Inout) ||
406+
"INOUTSET"_id >> pure(OmpTaskDependenceType::Type::Inoutset) ||
407+
"MUTEXINOUTSET" >> pure(OmpTaskDependenceType::Type::Mutexinoutset) ||
406408
"OUT" >> pure(OmpTaskDependenceType::Type::Out) ||
407409
"SINK" >> pure(OmpTaskDependenceType::Type::Sink) ||
408410
"SOURCE" >> pure(OmpTaskDependenceType::Type::Source)))

flang/lib/Semantics/check-omp-structure.cpp

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,45 @@ void OmpStructureChecker::CheckTargetUpdate() {
17321732
}
17331733
}
17341734

1735+
void OmpStructureChecker::CheckTaskDependenceType(
1736+
const parser::OmpTaskDependenceType::Type &x) {
1737+
// Common checks for task-dependence-type (DEPEND and UPDATE clauses).
1738+
unsigned version{context_.langOptions().OpenMPVersion};
1739+
unsigned since{0}, deprecatedIn{~0u};
1740+
1741+
switch (x) {
1742+
case parser::OmpTaskDependenceType::Type::In:
1743+
case parser::OmpTaskDependenceType::Type::Out:
1744+
case parser::OmpTaskDependenceType::Type::Inout:
1745+
break;
1746+
case parser::OmpTaskDependenceType::Type::Source:
1747+
case parser::OmpTaskDependenceType::Type::Sink:
1748+
deprecatedIn = 52;
1749+
break;
1750+
case parser::OmpTaskDependenceType::Type::Mutexinoutset:
1751+
case parser::OmpTaskDependenceType::Type::Depobj:
1752+
since = 50;
1753+
break;
1754+
case parser::OmpTaskDependenceType::Type::Inoutset:
1755+
since = 52;
1756+
break;
1757+
}
1758+
1759+
if (version >= deprecatedIn) {
1760+
context_.Say(GetContext().clauseSource,
1761+
"%s task-dependence-type is deprecated in %s"_warn_en_US,
1762+
parser::ToUpperCaseLetters(
1763+
parser::OmpTaskDependenceType::EnumToString(x)),
1764+
ThisVersion(deprecatedIn));
1765+
} else if (version < since) {
1766+
context_.Say(GetContext().clauseSource,
1767+
"%s task-dependence-type is not supported in %s, %s"_warn_en_US,
1768+
parser::ToUpperCaseLetters(
1769+
parser::OmpTaskDependenceType::EnumToString(x)),
1770+
ThisVersion(version), TryVersion(since));
1771+
}
1772+
}
1773+
17351774
void OmpStructureChecker::Enter(
17361775
const parser::OpenMPSimpleStandaloneConstruct &x) {
17371776
const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t)};
@@ -3393,20 +3432,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
33933432
using DepType = parser::OmpTaskDependenceType::Type;
33943433
DepType depType = x.v.GetDepType();
33953434

3396-
if (version >= 52) {
3397-
switch (depType) {
3398-
case DepType::Sink:
3399-
case DepType::Source:
3400-
context_.Say(GetContext().clauseSource,
3401-
"The %s task-dependence-type is deprecated in %s"_warn_en_US,
3402-
parser::ToUpperCaseLetters(
3403-
parser::OmpTaskDependenceType::EnumToString(depType)),
3404-
ThisVersion(version));
3405-
break;
3406-
default:
3407-
break;
3408-
}
3409-
}
3435+
CheckTaskDependenceType(depType);
34103436

34113437
if (directive == llvm::omp::OMPD_depobj) {
34123438
// [5.0:255:11], [5.1:288:3]
@@ -3593,6 +3619,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
35933619
llvm::omp::Directive directive{GetContext().directive};
35943620
unsigned version{context_.langOptions().OpenMPVersion};
35953621

3622+
CheckTaskDependenceType(x.v.v.v);
3623+
35963624
// [5.1:288:4-5]
35973625
// An update clause on a depobj construct must not have source, sink or depobj
35983626
// as dependence-type.

flang/lib/Semantics/check-omp-structure.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class OmpStructureChecker
202202
void CheckSIMDNest(const parser::OpenMPConstruct &x);
203203
void CheckTargetNest(const parser::OpenMPConstruct &x);
204204
void CheckTargetUpdate();
205+
void CheckTaskDependenceType(const parser::OmpTaskDependenceType::Type &x);
205206
void CheckCancellationNest(
206207
const parser::CharBlock &source, const parser::OmpCancelType::Type &type);
207208
std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
2+
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
3+
4+
!CHECK: not yet implemented: INOUTSET and MUTEXINOUTSET are not supported yet
5+
subroutine f00(x)
6+
integer :: x
7+
!$omp task depend(inoutset: x)
8+
x = x + 1
9+
!$omp end task
10+
end
11+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
2+
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
3+
4+
!CHECK: not yet implemented: INOUTSET and MUTEXINOUTSET are not supported yet
5+
subroutine f00(x)
6+
integer :: x
7+
!$omp task depend(mutexinoutset: x)
8+
x = x + 1
9+
!$omp end task
10+
end
11+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=45 -Werror
2+
3+
subroutine f00(x)
4+
integer :: x
5+
!WARNING: INOUTSET task-dependence-type is not supported in OpenMP v4.5, try -fopenmp-version=52
6+
!$omp task depend(inoutset: x)
7+
x = x + 1
8+
!$omp end task
9+
end
10+
11+
subroutine f01(x)
12+
integer :: x
13+
!WARNING: MUTEXINOUTSET task-dependence-type is not supported in OpenMP v4.5, try -fopenmp-version=50
14+
!$omp task depend(mutexinoutset: x)
15+
x = x + 1
16+
!$omp end task
17+
end

flang/test/Semantics/OpenMP/depobj-construct-v52.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
subroutine f00
44
integer :: obj
5-
!WARNING: The SOURCE task-dependence-type is deprecated in OpenMP v5.2
5+
!WARNING: SOURCE task-dependence-type is deprecated in OpenMP v5.2
66
!ERROR: A DEPEND clause on a DEPOBJ construct must not have SOURCE or SINK as dependence-type
77
!$omp depobj(obj) depend(source)
88
end

0 commit comments

Comments
 (0)