[flang][OpenMP] Parsing support for DYN_GROUPPRIVATE (#153615)
This does not perform semantic checks or lowering.
This commit is contained in:
parent
0fb1057e40
commit
8429f7faaa
@ -219,6 +219,7 @@ using DistSchedule = tomp::clause::DistScheduleT<TypeTy, IdTy, ExprTy>;
|
|||||||
using Doacross = tomp::clause::DoacrossT<TypeTy, IdTy, ExprTy>;
|
using Doacross = tomp::clause::DoacrossT<TypeTy, IdTy, ExprTy>;
|
||||||
using DynamicAllocators =
|
using DynamicAllocators =
|
||||||
tomp::clause::DynamicAllocatorsT<TypeTy, IdTy, ExprTy>;
|
tomp::clause::DynamicAllocatorsT<TypeTy, IdTy, ExprTy>;
|
||||||
|
using DynGroupprivate = tomp::clause::DynGroupprivateT<TypeTy, IdTy, ExprTy>;
|
||||||
using Enter = tomp::clause::EnterT<TypeTy, IdTy, ExprTy>;
|
using Enter = tomp::clause::EnterT<TypeTy, IdTy, ExprTy>;
|
||||||
using Exclusive = tomp::clause::ExclusiveT<TypeTy, IdTy, ExprTy>;
|
using Exclusive = tomp::clause::ExclusiveT<TypeTy, IdTy, ExprTy>;
|
||||||
using Fail = tomp::clause::FailT<TypeTy, IdTy, ExprTy>;
|
using Fail = tomp::clause::FailT<TypeTy, IdTy, ExprTy>;
|
||||||
|
@ -525,6 +525,8 @@ public:
|
|||||||
NODE(parser, OmpAbsentClause)
|
NODE(parser, OmpAbsentClause)
|
||||||
NODE(parser, OmpAffinityClause)
|
NODE(parser, OmpAffinityClause)
|
||||||
NODE(OmpAffinityClause, Modifier)
|
NODE(OmpAffinityClause, Modifier)
|
||||||
|
NODE(parser, OmpAccessGroup)
|
||||||
|
NODE_ENUM(OmpAccessGroup, Value)
|
||||||
NODE(parser, OmpAlignment)
|
NODE(parser, OmpAlignment)
|
||||||
NODE(parser, OmpAlignClause)
|
NODE(parser, OmpAlignClause)
|
||||||
NODE(parser, OmpAlignedClause)
|
NODE(parser, OmpAlignedClause)
|
||||||
@ -569,6 +571,8 @@ public:
|
|||||||
NODE_ENUM(OmpDependenceType, Value)
|
NODE_ENUM(OmpDependenceType, Value)
|
||||||
NODE(parser, OmpTaskDependenceType)
|
NODE(parser, OmpTaskDependenceType)
|
||||||
NODE_ENUM(OmpTaskDependenceType, Value)
|
NODE_ENUM(OmpTaskDependenceType, Value)
|
||||||
|
NODE(parser, OmpDynGroupprivateClause)
|
||||||
|
NODE(OmpDynGroupprivateClause, Modifier)
|
||||||
NODE(parser, OmpIndirectClause)
|
NODE(parser, OmpIndirectClause)
|
||||||
NODE(parser, OmpIterationOffset)
|
NODE(parser, OmpIterationOffset)
|
||||||
NODE(parser, OmpIteration)
|
NODE(parser, OmpIteration)
|
||||||
|
@ -3736,6 +3736,11 @@ inline namespace modifier {
|
|||||||
// ENUM_CLASS(Value, Keyword1, Keyword2);
|
// ENUM_CLASS(Value, Keyword1, Keyword2);
|
||||||
// };
|
// };
|
||||||
|
|
||||||
|
struct OmpAccessGroup {
|
||||||
|
ENUM_CLASS(Value, Cgroup);
|
||||||
|
WRAPPER_CLASS_BOILERPLATE(OmpAccessGroup, Value);
|
||||||
|
};
|
||||||
|
|
||||||
// Ref: [4.5:72-81], [5.0:110-119], [5.1:134-143], [5.2:169-170]
|
// Ref: [4.5:72-81], [5.0:110-119], [5.1:134-143], [5.2:169-170]
|
||||||
//
|
//
|
||||||
// alignment ->
|
// alignment ->
|
||||||
@ -4019,8 +4024,9 @@ struct OmpOrderModifier {
|
|||||||
//
|
//
|
||||||
// prescriptiveness ->
|
// prescriptiveness ->
|
||||||
// STRICT // since 5.1
|
// STRICT // since 5.1
|
||||||
|
// FALLBACK // since 6.1
|
||||||
struct OmpPrescriptiveness {
|
struct OmpPrescriptiveness {
|
||||||
ENUM_CLASS(Value, Strict)
|
ENUM_CLASS(Value, Strict, Fallback)
|
||||||
WRAPPER_CLASS_BOILERPLATE(OmpPrescriptiveness, Value);
|
WRAPPER_CLASS_BOILERPLATE(OmpPrescriptiveness, Value);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -4375,6 +4381,12 @@ struct OmpDeviceTypeClause {
|
|||||||
WRAPPER_CLASS_BOILERPLATE(OmpDeviceTypeClause, DeviceTypeDescription);
|
WRAPPER_CLASS_BOILERPLATE(OmpDeviceTypeClause, DeviceTypeDescription);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct OmpDynGroupprivateClause {
|
||||||
|
TUPLE_CLASS_BOILERPLATE(OmpDynGroupprivateClause);
|
||||||
|
MODIFIER_BOILERPLATE(OmpAccessGroup, OmpPrescriptiveness);
|
||||||
|
std::tuple<MODIFIERS(), ScalarIntExpr> t;
|
||||||
|
};
|
||||||
|
|
||||||
// Ref: [5.2:158-159], [6.0:289-290]
|
// Ref: [5.2:158-159], [6.0:289-290]
|
||||||
//
|
//
|
||||||
// enter-clause ->
|
// enter-clause ->
|
||||||
|
@ -396,6 +396,8 @@ makePrescriptiveness(parser::OmpPrescriptiveness::Value v) {
|
|||||||
switch (v) {
|
switch (v) {
|
||||||
case parser::OmpPrescriptiveness::Value::Strict:
|
case parser::OmpPrescriptiveness::Value::Strict:
|
||||||
return clause::Prescriptiveness::Strict;
|
return clause::Prescriptiveness::Strict;
|
||||||
|
case parser::OmpPrescriptiveness::Value::Fallback:
|
||||||
|
return clause::Prescriptiveness::Fallback;
|
||||||
}
|
}
|
||||||
llvm_unreachable("Unexpected prescriptiveness");
|
llvm_unreachable("Unexpected prescriptiveness");
|
||||||
}
|
}
|
||||||
@ -770,6 +772,27 @@ Doacross make(const parser::OmpClause::Doacross &inp,
|
|||||||
|
|
||||||
// DynamicAllocators: empty
|
// DynamicAllocators: empty
|
||||||
|
|
||||||
|
DynGroupprivate make(const parser::OmpClause::DynGroupprivate &inp,
|
||||||
|
semantics::SemanticsContext &semaCtx) {
|
||||||
|
// imp.v -> OmpDyngroupprivateClause
|
||||||
|
CLAUSET_ENUM_CONVERT( //
|
||||||
|
convert, parser::OmpAccessGroup::Value, DynGroupprivate::AccessGroup,
|
||||||
|
// clang-format off
|
||||||
|
MS(Cgroup, Cgroup)
|
||||||
|
// clang-format on
|
||||||
|
);
|
||||||
|
|
||||||
|
auto &mods = semantics::OmpGetModifiers(inp.v);
|
||||||
|
auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpAccessGroup>(mods);
|
||||||
|
auto *m1 = semantics::OmpGetUniqueModifier<parser::OmpPrescriptiveness>(mods);
|
||||||
|
auto &size = std::get<parser::ScalarIntExpr>(inp.v.t);
|
||||||
|
|
||||||
|
return DynGroupprivate{
|
||||||
|
{/*AccessGroup=*/maybeApplyToV(convert, m0),
|
||||||
|
/*Prescriptiveness=*/maybeApplyToV(makePrescriptiveness, m1),
|
||||||
|
/*Size=*/makeExpr(size, semaCtx)}};
|
||||||
|
}
|
||||||
|
|
||||||
Enter make(const parser::OmpClause::Enter &inp,
|
Enter make(const parser::OmpClause::Enter &inp,
|
||||||
semantics::SemanticsContext &semaCtx) {
|
semantics::SemanticsContext &semaCtx) {
|
||||||
// inp.v -> parser::OmpEnterClause
|
// inp.v -> parser::OmpEnterClause
|
||||||
|
@ -469,6 +469,9 @@ TYPE_PARSER(sourced(construct<OmpContextSelectorSpecification>(
|
|||||||
|
|
||||||
// --- Parsers for clause modifiers -----------------------------------
|
// --- Parsers for clause modifiers -----------------------------------
|
||||||
|
|
||||||
|
TYPE_PARSER(construct<OmpAccessGroup>( //
|
||||||
|
"CGROUP" >> pure(OmpAccessGroup::Value::Cgroup)))
|
||||||
|
|
||||||
TYPE_PARSER(construct<OmpAlignment>(scalarIntExpr))
|
TYPE_PARSER(construct<OmpAlignment>(scalarIntExpr))
|
||||||
|
|
||||||
TYPE_PARSER(construct<OmpAlignModifier>( //
|
TYPE_PARSER(construct<OmpAlignModifier>( //
|
||||||
@ -573,7 +576,8 @@ TYPE_PARSER(construct<OmpOrderingModifier>(
|
|||||||
"SIMD" >> pure(OmpOrderingModifier::Value::Simd)))
|
"SIMD" >> pure(OmpOrderingModifier::Value::Simd)))
|
||||||
|
|
||||||
TYPE_PARSER(construct<OmpPrescriptiveness>(
|
TYPE_PARSER(construct<OmpPrescriptiveness>(
|
||||||
"STRICT" >> pure(OmpPrescriptiveness::Value::Strict)))
|
"STRICT" >> pure(OmpPrescriptiveness::Value::Strict) ||
|
||||||
|
"FALLBACK" >> pure(OmpPrescriptiveness::Value::Fallback)))
|
||||||
|
|
||||||
TYPE_PARSER(construct<OmpPresentModifier>( //
|
TYPE_PARSER(construct<OmpPresentModifier>( //
|
||||||
"PRESENT" >> pure(OmpPresentModifier::Value::Present)))
|
"PRESENT" >> pure(OmpPresentModifier::Value::Present)))
|
||||||
@ -636,6 +640,12 @@ TYPE_PARSER(sourced(construct<OmpDependClause::TaskDep::Modifier>(sourced(
|
|||||||
construct<OmpDependClause::TaskDep::Modifier>(
|
construct<OmpDependClause::TaskDep::Modifier>(
|
||||||
Parser<OmpTaskDependenceType>{})))))
|
Parser<OmpTaskDependenceType>{})))))
|
||||||
|
|
||||||
|
TYPE_PARSER( //
|
||||||
|
sourced(construct<OmpDynGroupprivateClause::Modifier>(
|
||||||
|
Parser<OmpAccessGroup>{})) ||
|
||||||
|
sourced(construct<OmpDynGroupprivateClause::Modifier>(
|
||||||
|
Parser<OmpPrescriptiveness>{})))
|
||||||
|
|
||||||
TYPE_PARSER(
|
TYPE_PARSER(
|
||||||
sourced(construct<OmpDeviceClause::Modifier>(Parser<OmpDeviceModifier>{})))
|
sourced(construct<OmpDeviceClause::Modifier>(Parser<OmpDeviceModifier>{})))
|
||||||
|
|
||||||
@ -777,6 +787,10 @@ TYPE_PARSER(construct<OmpDefaultClause>(
|
|||||||
Parser<OmpDefaultClause::DataSharingAttribute>{}) ||
|
Parser<OmpDefaultClause::DataSharingAttribute>{}) ||
|
||||||
construct<OmpDefaultClause>(indirect(Parser<OmpDirectiveSpecification>{}))))
|
construct<OmpDefaultClause>(indirect(Parser<OmpDirectiveSpecification>{}))))
|
||||||
|
|
||||||
|
TYPE_PARSER(construct<OmpDynGroupprivateClause>(
|
||||||
|
maybe(nonemptyList(Parser<OmpDynGroupprivateClause::Modifier>{}) / ":"),
|
||||||
|
scalarIntExpr))
|
||||||
|
|
||||||
TYPE_PARSER(construct<OmpEnterClause>(
|
TYPE_PARSER(construct<OmpEnterClause>(
|
||||||
maybe(nonemptyList(Parser<OmpEnterClause::Modifier>{}) / ":"),
|
maybe(nonemptyList(Parser<OmpEnterClause::Modifier>{}) / ":"),
|
||||||
Parser<OmpObjectList>{}))
|
Parser<OmpObjectList>{}))
|
||||||
@ -1068,6 +1082,9 @@ TYPE_PARSER( //
|
|||||||
construct<OmpClause>(parenthesized(Parser<OmpDoacrossClause>{})) ||
|
construct<OmpClause>(parenthesized(Parser<OmpDoacrossClause>{})) ||
|
||||||
"DYNAMIC_ALLOCATORS" >>
|
"DYNAMIC_ALLOCATORS" >>
|
||||||
construct<OmpClause>(construct<OmpClause::DynamicAllocators>()) ||
|
construct<OmpClause>(construct<OmpClause::DynamicAllocators>()) ||
|
||||||
|
"DYN_GROUPPRIVATE" >>
|
||||||
|
construct<OmpClause>(construct<OmpClause::DynGroupprivate>(
|
||||||
|
parenthesized(Parser<OmpDynGroupprivateClause>{}))) ||
|
||||||
"ENTER" >> construct<OmpClause>(construct<OmpClause::Enter>(
|
"ENTER" >> construct<OmpClause>(construct<OmpClause::Enter>(
|
||||||
parenthesized(Parser<OmpEnterClause>{}))) ||
|
parenthesized(Parser<OmpEnterClause>{}))) ||
|
||||||
"EXCLUSIVE" >> construct<OmpClause>(construct<OmpClause::Exclusive>(
|
"EXCLUSIVE" >> construct<OmpClause>(construct<OmpClause::Exclusive>(
|
||||||
|
@ -2250,6 +2250,11 @@ public:
|
|||||||
Walk(std::get<OmpObjectList>(x.t));
|
Walk(std::get<OmpObjectList>(x.t));
|
||||||
Walk(": ", std::get<std::optional<std::list<Modifier>>>(x.t));
|
Walk(": ", std::get<std::optional<std::list<Modifier>>>(x.t));
|
||||||
}
|
}
|
||||||
|
void Unparse(const OmpDynGroupprivateClause &x) {
|
||||||
|
using Modifier = OmpDynGroupprivateClause::Modifier;
|
||||||
|
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
|
||||||
|
Walk(std::get<ScalarIntExpr>(x.t));
|
||||||
|
}
|
||||||
void Unparse(const OmpEnterClause &x) {
|
void Unparse(const OmpEnterClause &x) {
|
||||||
using Modifier = OmpEnterClause::Modifier;
|
using Modifier = OmpEnterClause::Modifier;
|
||||||
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
|
Walk(std::get<std::optional<std::list<Modifier>>>(x.t), ": ");
|
||||||
@ -2941,6 +2946,7 @@ public:
|
|||||||
WALK_NESTED_ENUM(OmpTaskDependenceType, Value) // OMP task-dependence-type
|
WALK_NESTED_ENUM(OmpTaskDependenceType, Value) // OMP task-dependence-type
|
||||||
WALK_NESTED_ENUM(OmpScheduleClause, Kind) // OMP schedule-kind
|
WALK_NESTED_ENUM(OmpScheduleClause, Kind) // OMP schedule-kind
|
||||||
WALK_NESTED_ENUM(OmpSeverityClause, Severity) // OMP severity
|
WALK_NESTED_ENUM(OmpSeverityClause, Severity) // OMP severity
|
||||||
|
WALK_NESTED_ENUM(OmpAccessGroup, Value)
|
||||||
WALK_NESTED_ENUM(OmpDeviceModifier, Value) // OMP device modifier
|
WALK_NESTED_ENUM(OmpDeviceModifier, Value) // OMP device modifier
|
||||||
WALK_NESTED_ENUM(
|
WALK_NESTED_ENUM(
|
||||||
OmpDeviceTypeClause, DeviceTypeDescription) // OMP device_type
|
OmpDeviceTypeClause, DeviceTypeDescription) // OMP device_type
|
||||||
|
@ -2581,6 +2581,7 @@ CHECK_SIMPLE_CLAUSE(Default, OMPC_default)
|
|||||||
CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj)
|
CHECK_SIMPLE_CLAUSE(Depobj, OMPC_depobj)
|
||||||
CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type)
|
CHECK_SIMPLE_CLAUSE(DeviceType, OMPC_device_type)
|
||||||
CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule)
|
CHECK_SIMPLE_CLAUSE(DistSchedule, OMPC_dist_schedule)
|
||||||
|
CHECK_SIMPLE_CLAUSE(DynGroupprivate, OMPC_dyn_groupprivate)
|
||||||
CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive)
|
CHECK_SIMPLE_CLAUSE(Exclusive, OMPC_exclusive)
|
||||||
CHECK_SIMPLE_CLAUSE(Final, OMPC_final)
|
CHECK_SIMPLE_CLAUSE(Final, OMPC_final)
|
||||||
CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush)
|
CHECK_SIMPLE_CLAUSE(Flush, OMPC_flush)
|
||||||
|
10
flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90
Normal file
10
flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
!RUN: %not_todo_cmd %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=61 -o - %s 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
!CHECK: not yet implemented: DYN_GROUPPRIVATE clause is not implemented yet
|
||||||
|
subroutine f00(n)
|
||||||
|
implicit none
|
||||||
|
integer :: n
|
||||||
|
!$omp target dyn_groupprivate(n)
|
||||||
|
!$omp end target
|
||||||
|
end
|
||||||
|
|
70
flang/test/Parser/OpenMP/dyn-groupprivate-clause.f90
Normal file
70
flang/test/Parser/OpenMP/dyn-groupprivate-clause.f90
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
!RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=61 %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s
|
||||||
|
!RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=61 %s | FileCheck --check-prefix="PARSE-TREE" %s
|
||||||
|
|
||||||
|
subroutine f00(n)
|
||||||
|
implicit none
|
||||||
|
integer :: n
|
||||||
|
!$omp target dyn_groupprivate(n)
|
||||||
|
!$omp end target
|
||||||
|
end
|
||||||
|
|
||||||
|
!UNPARSE: SUBROUTINE f00 (n)
|
||||||
|
!UNPARSE: IMPLICIT NONE
|
||||||
|
!UNPARSE: INTEGER n
|
||||||
|
!UNPARSE: !$OMP TARGET DYN_GROUPPRIVATE(n)
|
||||||
|
!UNPARSE: !$OMP END TARGET
|
||||||
|
!UNPARSE: END SUBROUTINE
|
||||||
|
|
||||||
|
!PARSE-TREE: OmpBeginDirective
|
||||||
|
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
|
||||||
|
!PARSE-TREE: | OmpClauseList -> OmpClause -> DynGroupprivate -> OmpDynGroupprivateClause
|
||||||
|
!PARSE-TREE: | | Scalar -> Integer -> Expr = 'n'
|
||||||
|
!PARSE-TREE: | | | Designator -> DataRef -> Name = 'n'
|
||||||
|
!PARSE-TREE: | Flags = None
|
||||||
|
|
||||||
|
|
||||||
|
subroutine f01(n)
|
||||||
|
implicit none
|
||||||
|
integer :: n
|
||||||
|
!$omp target dyn_groupprivate(strict: n)
|
||||||
|
!$omp end target
|
||||||
|
end
|
||||||
|
|
||||||
|
!UNPARSE: SUBROUTINE f01 (n)
|
||||||
|
!UNPARSE: IMPLICIT NONE
|
||||||
|
!UNPARSE: INTEGER n
|
||||||
|
!UNPARSE: !$OMP TARGET DYN_GROUPPRIVATE(STRICT: n)
|
||||||
|
!UNPARSE: !$OMP END TARGET
|
||||||
|
!UNPARSE: END SUBROUTINE
|
||||||
|
|
||||||
|
!PARSE-TREE: OmpBeginDirective
|
||||||
|
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
|
||||||
|
!PARSE-TREE: | OmpClauseList -> OmpClause -> DynGroupprivate -> OmpDynGroupprivateClause
|
||||||
|
!PARSE-TREE: | | Modifier -> OmpPrescriptiveness -> Value = Strict
|
||||||
|
!PARSE-TREE: | | Scalar -> Integer -> Expr = 'n'
|
||||||
|
!PARSE-TREE: | | | Designator -> DataRef -> Name = 'n'
|
||||||
|
!PARSE-TREE: | Flags = None
|
||||||
|
|
||||||
|
|
||||||
|
subroutine f02(n)
|
||||||
|
implicit none
|
||||||
|
integer :: n
|
||||||
|
!$omp target dyn_groupprivate(fallback, cgroup: n)
|
||||||
|
!$omp end target
|
||||||
|
end
|
||||||
|
|
||||||
|
!UNPARSE: SUBROUTINE f02 (n)
|
||||||
|
!UNPARSE: IMPLICIT NONE
|
||||||
|
!UNPARSE: INTEGER n
|
||||||
|
!UNPARSE: !$OMP TARGET DYN_GROUPPRIVATE(FALLBACK, CGROUP: n)
|
||||||
|
!UNPARSE: !$OMP END TARGET
|
||||||
|
!UNPARSE: END SUBROUTINE
|
||||||
|
|
||||||
|
!PARSE-TREE: OmpBeginDirective
|
||||||
|
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
|
||||||
|
!PARSE-TREE: | OmpClauseList -> OmpClause -> DynGroupprivate -> OmpDynGroupprivateClause
|
||||||
|
!PARSE-TREE: | | Modifier -> OmpPrescriptiveness -> Value = Fallback
|
||||||
|
!PARSE-TREE: | | Modifier -> OmpAccessGroup -> Value = Cgroup
|
||||||
|
!PARSE-TREE: | | Scalar -> Integer -> Expr = 'n'
|
||||||
|
!PARSE-TREE: | | | Designator -> DataRef -> Name = 'n'
|
||||||
|
!PARSE-TREE: | Flags = None
|
@ -242,7 +242,7 @@ ENUM(MotionExpectation, Present);
|
|||||||
// V5.2: [15.9.1] `task-dependence-type` modifier
|
// V5.2: [15.9.1] `task-dependence-type` modifier
|
||||||
ENUM(DependenceType, Depobj, In, Inout, Inoutset, Mutexinoutset, Out, Sink,
|
ENUM(DependenceType, Depobj, In, Inout, Inoutset, Mutexinoutset, Out, Sink,
|
||||||
Source);
|
Source);
|
||||||
ENUM(Prescriptiveness, Strict);
|
ENUM(Prescriptiveness, Strict, Fallback);
|
||||||
|
|
||||||
template <typename I, typename E> //
|
template <typename I, typename E> //
|
||||||
struct LoopIterationT {
|
struct LoopIterationT {
|
||||||
@ -574,6 +574,15 @@ struct DynamicAllocatorsT {
|
|||||||
using EmptyTrait = std::true_type;
|
using EmptyTrait = std::true_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T, typename I, typename E> //
|
||||||
|
struct DynGroupprivateT {
|
||||||
|
ENUM(AccessGroup, Cgroup);
|
||||||
|
using Prescriptiveness = type::Prescriptiveness;
|
||||||
|
using Size = E;
|
||||||
|
using TupleTrait = std::true_type;
|
||||||
|
std::tuple<OPT(AccessGroup), OPT(Prescriptiveness), Size> t;
|
||||||
|
};
|
||||||
|
|
||||||
// V5.2: [5.8.4] `enter` clause
|
// V5.2: [5.8.4] `enter` clause
|
||||||
template <typename T, typename I, typename E> //
|
template <typename T, typename I, typename E> //
|
||||||
struct EnterT {
|
struct EnterT {
|
||||||
@ -1263,11 +1272,12 @@ template <typename T, typename I, typename E>
|
|||||||
using TupleClausesT =
|
using TupleClausesT =
|
||||||
std::variant<AffinityT<T, I, E>, AlignedT<T, I, E>, AllocateT<T, I, E>,
|
std::variant<AffinityT<T, I, E>, AlignedT<T, I, E>, AllocateT<T, I, E>,
|
||||||
DefaultmapT<T, I, E>, DeviceT<T, I, E>, DistScheduleT<T, I, E>,
|
DefaultmapT<T, I, E>, DeviceT<T, I, E>, DistScheduleT<T, I, E>,
|
||||||
DoacrossT<T, I, E>, FromT<T, I, E>, GrainsizeT<T, I, E>,
|
DoacrossT<T, I, E>, DynGroupprivateT<T, I, E>, FromT<T, I, E>,
|
||||||
IfT<T, I, E>, InitT<T, I, E>, InReductionT<T, I, E>,
|
GrainsizeT<T, I, E>, IfT<T, I, E>, InitT<T, I, E>,
|
||||||
LastprivateT<T, I, E>, LinearT<T, I, E>, MapT<T, I, E>,
|
InReductionT<T, I, E>, LastprivateT<T, I, E>, LinearT<T, I, E>,
|
||||||
NumTasksT<T, I, E>, OrderT<T, I, E>, ReductionT<T, I, E>,
|
MapT<T, I, E>, NumTasksT<T, I, E>, OrderT<T, I, E>,
|
||||||
ScheduleT<T, I, E>, TaskReductionT<T, I, E>, ToT<T, I, E>>;
|
ReductionT<T, I, E>, ScheduleT<T, I, E>,
|
||||||
|
TaskReductionT<T, I, E>, ToT<T, I, E>>;
|
||||||
|
|
||||||
template <typename T, typename I, typename E>
|
template <typename T, typename I, typename E>
|
||||||
using UnionClausesT = std::variant<DependT<T, I, E>>;
|
using UnionClausesT = std::variant<DependT<T, I, E>>;
|
||||||
|
@ -178,6 +178,9 @@ def OMPC_Doacross : Clause<[Spelling<"doacross">]> {
|
|||||||
def OMPC_DynamicAllocators : Clause<[Spelling<"dynamic_allocators">]> {
|
def OMPC_DynamicAllocators : Clause<[Spelling<"dynamic_allocators">]> {
|
||||||
let clangClass = "OMPDynamicAllocatorsClause";
|
let clangClass = "OMPDynamicAllocatorsClause";
|
||||||
}
|
}
|
||||||
|
def OMPC_DynGroupprivate : Clause<[Spelling<"dyn_groupprivate">]> {
|
||||||
|
let flangClass = "OmpDynGroupprivateClause";
|
||||||
|
}
|
||||||
def OMPC_Enter : Clause<[Spelling<"enter">]> {
|
def OMPC_Enter : Clause<[Spelling<"enter">]> {
|
||||||
let flangClass = "OmpEnterClause";
|
let flangClass = "OmpEnterClause";
|
||||||
}
|
}
|
||||||
@ -1104,6 +1107,7 @@ def OMP_Target : Directive<[Spelling<"target">]> {
|
|||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_If>,
|
VersionedClause<OMPC_If>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_OMPX_Bare>,
|
VersionedClause<OMPC_OMPX_Bare>,
|
||||||
@ -1254,6 +1258,7 @@ def OMP_Teams : Directive<[Spelling<"teams">]> {
|
|||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_If, 52>,
|
VersionedClause<OMPC_If, 52>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
@ -1522,6 +1527,7 @@ def OMP_target_loop : Directive<[Spelling<"target loop">]> {
|
|||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
VersionedClause<OMPC_Bind, 50>,
|
VersionedClause<OMPC_Bind, 50>,
|
||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_Order>,
|
VersionedClause<OMPC_Order>,
|
||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -1983,6 +1989,7 @@ def OMP_TargetParallel : Directive<[Spelling<"target parallel">]> {
|
|||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
VersionedClause<OMPC_ProcBind>,
|
VersionedClause<OMPC_ProcBind>,
|
||||||
@ -2012,6 +2019,7 @@ def OMP_TargetParallelDo : Directive<[Spelling<"target parallel do">]> {
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
@ -2054,6 +2062,9 @@ def OMP_TargetParallelDoSimd
|
|||||||
VersionedClause<OMPC_SimdLen>,
|
VersionedClause<OMPC_SimdLen>,
|
||||||
VersionedClause<OMPC_UsesAllocators>,
|
VersionedClause<OMPC_UsesAllocators>,
|
||||||
];
|
];
|
||||||
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
|
];
|
||||||
let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do, OMP_Simd];
|
let leafConstructs = [OMP_Target, OMP_Parallel, OMP_Do, OMP_Simd];
|
||||||
let category = CA_Executable;
|
let category = CA_Executable;
|
||||||
let languages = [L_Fortran];
|
let languages = [L_Fortran];
|
||||||
@ -2086,6 +2097,7 @@ def OMP_TargetParallelFor : Directive<[Spelling<"target parallel for">]> {
|
|||||||
VersionedClause<OMPC_UsesAllocators, 50>,
|
VersionedClause<OMPC_UsesAllocators, 50>,
|
||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
VersionedClause<OMPC_ThreadLimit, 51>,
|
VersionedClause<OMPC_ThreadLimit, 51>,
|
||||||
];
|
];
|
||||||
@ -2126,6 +2138,7 @@ def OMP_TargetParallelForSimd
|
|||||||
VersionedClause<OMPC_UsesAllocators, 50>,
|
VersionedClause<OMPC_UsesAllocators, 50>,
|
||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
VersionedClause<OMPC_ThreadLimit, 51>,
|
VersionedClause<OMPC_ThreadLimit, 51>,
|
||||||
];
|
];
|
||||||
@ -2155,6 +2168,7 @@ def OMP_target_parallel_loop : Directive<[Spelling<"target parallel loop">]> {
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -2189,6 +2203,7 @@ def OMP_TargetSimd : Directive<[Spelling<"target simd">]> {
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
@ -2220,6 +2235,7 @@ def OMP_TargetTeams : Directive<[Spelling<"target teams">]> {
|
|||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -2252,6 +2268,7 @@ def OMP_TargetTeamsDistribute
|
|||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -2284,6 +2301,7 @@ def OMP_TargetTeamsDistributeParallelDo
|
|||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
@ -2322,6 +2340,7 @@ def OMP_TargetTeamsDistributeParallelDoSimd
|
|||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
@ -2367,6 +2386,7 @@ def OMP_TargetTeamsDistributeParallelFor
|
|||||||
VersionedClause<OMPC_UsesAllocators, 50>,
|
VersionedClause<OMPC_UsesAllocators, 50>,
|
||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
];
|
];
|
||||||
let leafConstructs =
|
let leafConstructs =
|
||||||
@ -2409,6 +2429,7 @@ def OMP_TargetTeamsDistributeParallelForSimd
|
|||||||
VersionedClause<OMPC_UsesAllocators, 50>,
|
VersionedClause<OMPC_UsesAllocators, 50>,
|
||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
];
|
];
|
||||||
let leafConstructs =
|
let leafConstructs =
|
||||||
@ -2441,6 +2462,7 @@ def OMP_TargetTeamsDistributeSimd
|
|||||||
VersionedClause<OMPC_DefaultMap>,
|
VersionedClause<OMPC_DefaultMap>,
|
||||||
VersionedClause<OMPC_Device>,
|
VersionedClause<OMPC_Device>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -2474,6 +2496,7 @@ def OMP_target_teams_loop : Directive<[Spelling<"target teams loop">]> {
|
|||||||
VersionedClause<OMPC_Bind, 50>,
|
VersionedClause<OMPC_Bind, 50>,
|
||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NoWait>,
|
VersionedClause<OMPC_NoWait>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
VersionedClause<OMPC_OMPX_DynCGroupMem>,
|
||||||
@ -2532,6 +2555,7 @@ def OMP_TeamsDistribute : Directive<[Spelling<"teams distribute">]> {
|
|||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
];
|
];
|
||||||
let allowedOnceClauses = [
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_If>,
|
VersionedClause<OMPC_If>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
];
|
];
|
||||||
@ -2555,6 +2579,7 @@ def OMP_TeamsDistributeParallelDo
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
@ -2584,6 +2609,7 @@ def OMP_TeamsDistributeParallelDoSimd
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_NumThreads>,
|
VersionedClause<OMPC_NumThreads>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
@ -2620,6 +2646,9 @@ def OMP_TeamsDistributeParallelFor
|
|||||||
VersionedClause<OMPC_Shared>,
|
VersionedClause<OMPC_Shared>,
|
||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
];
|
];
|
||||||
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
|
];
|
||||||
let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
|
let leafConstructs = [OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For];
|
||||||
let category = CA_Executable;
|
let category = CA_Executable;
|
||||||
let languages = [L_C];
|
let languages = [L_C];
|
||||||
@ -2650,6 +2679,9 @@ def OMP_TeamsDistributeParallelForSimd
|
|||||||
VersionedClause<OMPC_SimdLen>,
|
VersionedClause<OMPC_SimdLen>,
|
||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
];
|
];
|
||||||
|
let allowedOnceClauses = [
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
|
];
|
||||||
let leafConstructs =
|
let leafConstructs =
|
||||||
[OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
|
[OMP_Teams, OMP_Distribute, OMP_Parallel, OMP_For, OMP_Simd];
|
||||||
let category = CA_Executable;
|
let category = CA_Executable;
|
||||||
@ -2673,6 +2705,7 @@ def OMP_TeamsDistributeSimd : Directive<[Spelling<"teams distribute simd">]> {
|
|||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
VersionedClause<OMPC_DistSchedule>,
|
VersionedClause<OMPC_DistSchedule>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_Order, 50>,
|
VersionedClause<OMPC_Order, 50>,
|
||||||
VersionedClause<OMPC_SafeLen>,
|
VersionedClause<OMPC_SafeLen>,
|
||||||
@ -2696,6 +2729,7 @@ def OMP_teams_loop : Directive<[Spelling<"teams loop">]> {
|
|||||||
VersionedClause<OMPC_Bind, 50>,
|
VersionedClause<OMPC_Bind, 50>,
|
||||||
VersionedClause<OMPC_Collapse>,
|
VersionedClause<OMPC_Collapse>,
|
||||||
VersionedClause<OMPC_Default>,
|
VersionedClause<OMPC_Default>,
|
||||||
|
VersionedClause<OMPC_DynGroupprivate, 61>,
|
||||||
VersionedClause<OMPC_NumTeams>,
|
VersionedClause<OMPC_NumTeams>,
|
||||||
VersionedClause<OMPC_Order>,
|
VersionedClause<OMPC_Order>,
|
||||||
VersionedClause<OMPC_ThreadLimit>,
|
VersionedClause<OMPC_ThreadLimit>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user