mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-24 06:26:07 +00:00
[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.
This commit is contained in:
parent
4a88b9043f
commit
29d4d7f620
@ -3447,7 +3447,8 @@ WRAPPER_CLASS(OmpObjectList, std::list<OmpObject>);
|
||||
// MUTEXINOUTSET | DEPOBJ | // since 5.0
|
||||
// INOUTSET // since 5.2
|
||||
struct OmpTaskDependenceType {
|
||||
ENUM_CLASS(Type, In, Out, Inout, Source, Sink, Depobj)
|
||||
ENUM_CLASS(
|
||||
Type, In, Out, Inout, Inoutset, Mutexinoutset, Source, Sink, Depobj)
|
||||
WRAPPER_CLASS_BOILERPLATE(OmpTaskDependenceType, Type);
|
||||
};
|
||||
|
||||
|
@ -121,8 +121,11 @@ genProcBindKindAttr(fir::FirOpBuilder &firOpBuilder,
|
||||
}
|
||||
|
||||
static mlir::omp::ClauseTaskDependAttr
|
||||
genDependKindAttr(fir::FirOpBuilder &firOpBuilder,
|
||||
genDependKindAttr(lower::AbstractConverter &converter,
|
||||
const omp::clause::Depend::TaskDependenceType kind) {
|
||||
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
|
||||
mlir::Location currentLocation = converter.getCurrentLocation();
|
||||
|
||||
mlir::omp::ClauseTaskDepend pbKind;
|
||||
switch (kind) {
|
||||
case omp::clause::Depend::TaskDependenceType::In:
|
||||
@ -136,6 +139,8 @@ genDependKindAttr(fir::FirOpBuilder &firOpBuilder,
|
||||
break;
|
||||
case omp::clause::Depend::TaskDependenceType::Mutexinoutset:
|
||||
case omp::clause::Depend::TaskDependenceType::Inoutset:
|
||||
TODO(currentLocation, "INOUTSET and MUTEXINOUTSET are not supported yet");
|
||||
break;
|
||||
case omp::clause::Depend::TaskDependenceType::Depobj:
|
||||
case omp::clause::Depend::TaskDependenceType::Sink:
|
||||
case omp::clause::Depend::TaskDependenceType::Source:
|
||||
@ -795,8 +800,6 @@ bool ClauseProcessor::processCopyprivate(
|
||||
}
|
||||
|
||||
bool ClauseProcessor::processDepend(mlir::omp::DependClauseOps &result) const {
|
||||
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
|
||||
|
||||
auto process = [&](const omp::clause::Depend &clause,
|
||||
const parser::CharBlock &) {
|
||||
using Depend = omp::clause::Depend;
|
||||
@ -813,7 +816,7 @@ bool ClauseProcessor::processDepend(mlir::omp::DependClauseOps &result) const {
|
||||
"Support for iterator modifiers is not implemented yet");
|
||||
}
|
||||
mlir::omp::ClauseTaskDependAttr dependTypeOperand =
|
||||
genDependKindAttr(firOpBuilder, kind);
|
||||
genDependKindAttr(converter, kind);
|
||||
result.dependKinds.append(objects.size(), dependTypeOperand);
|
||||
|
||||
for (const omp::Object &object : objects) {
|
||||
|
@ -347,8 +347,10 @@ makeDepType(const parser::OmpTaskDependenceType &inp) {
|
||||
return clause::TaskDependenceType::In;
|
||||
case parser::OmpTaskDependenceType::Type::Inout:
|
||||
return clause::TaskDependenceType::Inout;
|
||||
// Inoutset // missing-in-parser
|
||||
// Mutexinoutset // missing-in-parser
|
||||
case parser::OmpTaskDependenceType::Type::Inoutset:
|
||||
return clause::TaskDependenceType::Inoutset;
|
||||
case parser::OmpTaskDependenceType::Type::Mutexinoutset:
|
||||
return clause::TaskDependenceType::Mutexinoutset;
|
||||
case parser::OmpTaskDependenceType::Type::Out:
|
||||
return clause::TaskDependenceType::Out;
|
||||
case parser::OmpTaskDependenceType::Type::Sink:
|
||||
|
@ -402,7 +402,9 @@ TYPE_PARSER(
|
||||
TYPE_PARSER(construct<OmpTaskDependenceType>(
|
||||
"DEPOBJ" >> pure(OmpTaskDependenceType::Type::Depobj) ||
|
||||
"IN"_id >> pure(OmpTaskDependenceType::Type::In) ||
|
||||
"INOUT" >> pure(OmpTaskDependenceType::Type::Inout) ||
|
||||
"INOUT"_id >> pure(OmpTaskDependenceType::Type::Inout) ||
|
||||
"INOUTSET"_id >> pure(OmpTaskDependenceType::Type::Inoutset) ||
|
||||
"MUTEXINOUTSET" >> pure(OmpTaskDependenceType::Type::Mutexinoutset) ||
|
||||
"OUT" >> pure(OmpTaskDependenceType::Type::Out) ||
|
||||
"SINK" >> pure(OmpTaskDependenceType::Type::Sink) ||
|
||||
"SOURCE" >> pure(OmpTaskDependenceType::Type::Source)))
|
||||
|
@ -1732,6 +1732,45 @@ void OmpStructureChecker::CheckTargetUpdate() {
|
||||
}
|
||||
}
|
||||
|
||||
void OmpStructureChecker::CheckTaskDependenceType(
|
||||
const parser::OmpTaskDependenceType::Type &x) {
|
||||
// Common checks for task-dependence-type (DEPEND and UPDATE clauses).
|
||||
unsigned version{context_.langOptions().OpenMPVersion};
|
||||
unsigned since{0}, deprecatedIn{~0u};
|
||||
|
||||
switch (x) {
|
||||
case parser::OmpTaskDependenceType::Type::In:
|
||||
case parser::OmpTaskDependenceType::Type::Out:
|
||||
case parser::OmpTaskDependenceType::Type::Inout:
|
||||
break;
|
||||
case parser::OmpTaskDependenceType::Type::Source:
|
||||
case parser::OmpTaskDependenceType::Type::Sink:
|
||||
deprecatedIn = 52;
|
||||
break;
|
||||
case parser::OmpTaskDependenceType::Type::Mutexinoutset:
|
||||
case parser::OmpTaskDependenceType::Type::Depobj:
|
||||
since = 50;
|
||||
break;
|
||||
case parser::OmpTaskDependenceType::Type::Inoutset:
|
||||
since = 52;
|
||||
break;
|
||||
}
|
||||
|
||||
if (version >= deprecatedIn) {
|
||||
context_.Say(GetContext().clauseSource,
|
||||
"%s task-dependence-type is deprecated in %s"_warn_en_US,
|
||||
parser::ToUpperCaseLetters(
|
||||
parser::OmpTaskDependenceType::EnumToString(x)),
|
||||
ThisVersion(deprecatedIn));
|
||||
} else if (version < since) {
|
||||
context_.Say(GetContext().clauseSource,
|
||||
"%s task-dependence-type is not supported in %s, %s"_warn_en_US,
|
||||
parser::ToUpperCaseLetters(
|
||||
parser::OmpTaskDependenceType::EnumToString(x)),
|
||||
ThisVersion(version), TryVersion(since));
|
||||
}
|
||||
}
|
||||
|
||||
void OmpStructureChecker::Enter(
|
||||
const parser::OpenMPSimpleStandaloneConstruct &x) {
|
||||
const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t)};
|
||||
@ -3393,20 +3432,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
|
||||
using DepType = parser::OmpTaskDependenceType::Type;
|
||||
DepType depType = x.v.GetDepType();
|
||||
|
||||
if (version >= 52) {
|
||||
switch (depType) {
|
||||
case DepType::Sink:
|
||||
case DepType::Source:
|
||||
context_.Say(GetContext().clauseSource,
|
||||
"The %s task-dependence-type is deprecated in %s"_warn_en_US,
|
||||
parser::ToUpperCaseLetters(
|
||||
parser::OmpTaskDependenceType::EnumToString(depType)),
|
||||
ThisVersion(version));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
CheckTaskDependenceType(depType);
|
||||
|
||||
if (directive == llvm::omp::OMPD_depobj) {
|
||||
// [5.0:255:11], [5.1:288:3]
|
||||
@ -3593,6 +3619,8 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
|
||||
llvm::omp::Directive directive{GetContext().directive};
|
||||
unsigned version{context_.langOptions().OpenMPVersion};
|
||||
|
||||
CheckTaskDependenceType(x.v.v.v);
|
||||
|
||||
// [5.1:288:4-5]
|
||||
// An update clause on a depobj construct must not have source, sink or depobj
|
||||
// as dependence-type.
|
||||
|
@ -202,6 +202,7 @@ private:
|
||||
void CheckSIMDNest(const parser::OpenMPConstruct &x);
|
||||
void CheckTargetNest(const parser::OpenMPConstruct &x);
|
||||
void CheckTargetUpdate();
|
||||
void CheckTaskDependenceType(const parser::OmpTaskDependenceType::Type &x);
|
||||
void CheckCancellationNest(
|
||||
const parser::CharBlock &source, const parser::OmpCancelType::Type &type);
|
||||
std::int64_t GetOrdCollapseLevel(const parser::OpenMPLoopConstruct &x);
|
||||
|
11
flang/test/Lower/OpenMP/Todo/depend-clause-inoutset.f90
Normal file
11
flang/test/Lower/OpenMP/Todo/depend-clause-inoutset.f90
Normal file
@ -0,0 +1,11 @@
|
||||
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
!CHECK: not yet implemented: INOUTSET and MUTEXINOUTSET are not supported yet
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
!$omp task depend(inoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
||||
|
11
flang/test/Lower/OpenMP/Todo/depend-clause-mutexinoutset.f90
Normal file
11
flang/test/Lower/OpenMP/Todo/depend-clause-mutexinoutset.f90
Normal file
@ -0,0 +1,11 @@
|
||||
!RUN: %not_todo_cmd bbc -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s 2>&1 | FileCheck %s
|
||||
|
||||
!CHECK: not yet implemented: INOUTSET and MUTEXINOUTSET are not supported yet
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
!$omp task depend(mutexinoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
||||
|
17
flang/test/Semantics/OpenMP/depend06.f90
Normal file
17
flang/test/Semantics/OpenMP/depend06.f90
Normal file
@ -0,0 +1,17 @@
|
||||
!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=45 -Werror
|
||||
|
||||
subroutine f00(x)
|
||||
integer :: x
|
||||
!WARNING: INOUTSET task-dependence-type is not supported in OpenMP v4.5, try -fopenmp-version=52
|
||||
!$omp task depend(inoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
||||
|
||||
subroutine f01(x)
|
||||
integer :: x
|
||||
!WARNING: MUTEXINOUTSET task-dependence-type is not supported in OpenMP v4.5, try -fopenmp-version=50
|
||||
!$omp task depend(mutexinoutset: x)
|
||||
x = x + 1
|
||||
!$omp end task
|
||||
end
|
@ -2,7 +2,7 @@
|
||||
|
||||
subroutine f00
|
||||
integer :: obj
|
||||
!WARNING: The SOURCE task-dependence-type is deprecated in OpenMP v5.2
|
||||
!WARNING: SOURCE task-dependence-type is deprecated in OpenMP v5.2
|
||||
!ERROR: A DEPEND clause on a DEPOBJ construct must not have SOURCE or SINK as dependence-type
|
||||
!$omp depobj(obj) depend(source)
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user