https://github.com/ivanradanov updated https://github.com/llvm/llvm-project/pull/111106
>From e70fc69910083e4e6fb9f4e23f41e4eac6ae6c9b Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Fri, 4 Oct 2024 16:20:36 +0900 Subject: [PATCH 01/10] [flang] Add frontend support for OpenMP extension bare clause --- flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 4 ++++ flang/lib/Lower/OpenMP/ClauseProcessor.h | 1 + flang/lib/Lower/OpenMP/Clauses.h | 2 +- flang/lib/Lower/OpenMP/OpenMP.cpp | 2 ++ flang/lib/Parser/openmp-parsers.cpp | 1 + .../Frontend/OpenMP/ConstructDecompositionT.h | 9 +++++++ llvm/include/llvm/Frontend/OpenMP/OMP.td | 1 + .../mlir/Dialect/OpenMP/OpenMPClauses.td | 24 +++++++++++++++++++ mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td | 3 ++- mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp | 3 ++- 10 files changed, 47 insertions(+), 3 deletions(-) diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index a4d2524bccf5c3..c7f34b3d65f324 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp @@ -354,6 +354,10 @@ bool ClauseProcessor::processNowait(mlir::omp::NowaitClauseOps &result) const { return markClauseOccurrence<omp::clause::Nowait>(result.nowait); } +bool ClauseProcessor::processBare(mlir::omp::BareClauseOps &result) const { + return markClauseOccurrence<omp::clause::OmpxBare>(result.bare); +} + bool ClauseProcessor::processNumTeams( lower::StatementContext &stmtCtx, mlir::omp::NumTeamsClauseOps &result) const { diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h index 0c8e7bd47ab5a6..a04731f94ede37 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.h +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h @@ -74,6 +74,7 @@ class ClauseProcessor { bool processHint(mlir::omp::HintClauseOps &result) const; bool processMergeable(mlir::omp::MergeableClauseOps &result) const; bool processNowait(mlir::omp::NowaitClauseOps &result) const; + bool processBare(mlir::omp::BareClauseOps &result) const; bool processNumTeams(lower::StatementContext &stmtCtx, mlir::omp::NumTeamsClauseOps &result) const; bool processNumThreads(lower::StatementContext &stmtCtx, diff --git a/flang/lib/Lower/OpenMP/Clauses.h b/flang/lib/Lower/OpenMP/Clauses.h index 51bf0eab0f8d07..10bd1439563244 100644 --- a/flang/lib/Lower/OpenMP/Clauses.h +++ b/flang/lib/Lower/OpenMP/Clauses.h @@ -229,8 +229,8 @@ using NumTasks = tomp::clause::NumTasksT<TypeTy, IdTy, ExprTy>; using NumTeams = tomp::clause::NumTeamsT<TypeTy, IdTy, ExprTy>; using NumThreads = tomp::clause::NumThreadsT<TypeTy, IdTy, ExprTy>; using OmpxAttribute = tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy>; -using OmpxBare = tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy>; using OmpxDynCgroupMem = tomp::clause::OmpxDynCgroupMemT<TypeTy, IdTy, ExprTy>; +using OmpxBare = tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy>; using Ordered = tomp::clause::OrderedT<TypeTy, IdTy, ExprTy>; using Order = tomp::clause::OrderT<TypeTy, IdTy, ExprTy>; using Partial = tomp::clause::PartialT<TypeTy, IdTy, ExprTy>; diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 60c83586e468b6..b8b1a0ba2a69b7 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1180,6 +1180,7 @@ static void genTargetClauses( cp.processNowait(clauseOps); cp.processThreadLimit(stmtCtx, clauseOps); + cp.processBare(clauseOps); cp.processTODO<clause::Allocate, clause::Defaultmap, clause::Firstprivate, clause::InReduction, clause::UsesAllocators>( @@ -2764,6 +2765,7 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, !std::holds_alternative<clause::ThreadLimit>(clause.u) && !std::holds_alternative<clause::Threads>(clause.u) && !std::holds_alternative<clause::UseDeviceAddr>(clause.u) && + !std::holds_alternative<clause::OmpxBare>(clause.u) && !std::holds_alternative<clause::UseDevicePtr>(clause.u)) { TODO(clauseLocation, "OpenMP Block construct clause"); } diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp index cc2930cbd7ded5..f18a9929aa75ef 100644 --- a/flang/lib/Parser/openmp-parsers.cpp +++ b/flang/lib/Parser/openmp-parsers.cpp @@ -315,6 +315,7 @@ TYPE_PARSER( parenthesized(scalarIntExpr))) || "NUM_THREADS" >> construct<OmpClause>(construct<OmpClause::NumThreads>( parenthesized(scalarIntExpr))) || + "OMPX_BARE" >> construct<OmpClause>(construct<OmpClause::OmpxBare>()) || "ORDER" >> construct<OmpClause>(construct<OmpClause::Order>( parenthesized(Parser<OmpOrderClause>{}))) || "ORDERED" >> construct<OmpClause>(construct<OmpClause::Ordered>( diff --git a/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h index 4bdfa1cf4c1490..7c0dbe1aae1221 100644 --- a/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h +++ b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h @@ -236,6 +236,8 @@ struct ConstructDecompositionT { const ClauseTy *); bool applyClause(const tomp::clause::NowaitT<TypeTy, IdTy, ExprTy> &clause, const ClauseTy *); + bool applyClause(const tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy> &clause, + const ClauseTy *); bool applyClause(const tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy> &clause, const ClauseTy *); @@ -1103,6 +1105,13 @@ bool ConstructDecompositionT<C, H>::applyClause( return applyToOutermost(node); } +template <typename C, typename H> +bool ConstructDecompositionT<C, H>::applyClause( + const tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy> &clause, + const ClauseTy *node) { + return applyToAll(node); +} + template <typename C, typename H> bool ConstructDecompositionT<C, H>::applyClause( const tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy> &clause, diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td index fcf087d1f9c6e4..ac5cf1babb4176 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMP.td +++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td @@ -980,6 +980,7 @@ def OMP_Target : Directive<"target"> { VersionedClause<OMPC_Device>, VersionedClause<OMPC_If>, VersionedClause<OMPC_NoWait>, + VersionedClause<OMPC_OMPX_Bare>, VersionedClause<OMPC_OMPX_DynCGroupMem>, VersionedClause<OMPC_ThreadLimit, 51>, ]; diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td index 886554f66afffc..7ec8a924b3c3ff 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td @@ -1270,4 +1270,28 @@ class OpenMP_UseDevicePtrClauseSkip< def OpenMP_UseDevicePtrClause : OpenMP_UseDevicePtrClauseSkip<>; +//===----------------------------------------------------------------------===// +// LLVM OpenMP extension `ompx_bare` clause +//===----------------------------------------------------------------------===// + +class OpenMP_BareClauseSkip< + bit traits = false, bit arguments = false, bit assemblyFormat = false, + bit description = false, bit extraClassDeclaration = false + > : OpenMP_Clause<traits, arguments, assemblyFormat, description, + extraClassDeclaration> { + let arguments = (ins + UnitAttr:$bare + ); + + let optAssemblyFormat = [{ + `ompx_bare` + }]; + + let description = [{ + ompx_bare placeholder description + }]; +} + +def OpenMP_BareClause : OpenMP_BareClauseSkip<>; + #endif // OPENMP_CLAUSES diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td index 66f63fc02fe2f3..ee8aeee1278b1c 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td @@ -1108,7 +1108,8 @@ def TargetOp : OpenMP_Op<"target", traits = [ OpenMP_AllocateClause, OpenMP_DependClause, OpenMP_DeviceClause, OpenMP_HasDeviceAddrClause, OpenMP_IfClause, OpenMP_InReductionClause, OpenMP_IsDevicePtrClause, OpenMP_MapClauseSkip<assemblyFormat = true>, - OpenMP_NowaitClause, OpenMP_PrivateClause, OpenMP_ThreadLimitClause + OpenMP_NowaitClause, OpenMP_PrivateClause, OpenMP_ThreadLimitClause, + OpenMP_BareClause, ], singleRegion = true> { let summary = "target construct"; let description = [{ diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp index d516c8d9e0be6c..a7c35a3bf3365b 100644 --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp @@ -1677,7 +1677,8 @@ void TargetOp::build(OpBuilder &builder, OperationState &state, /*in_reduction_vars=*/{}, /*in_reduction_byref=*/nullptr, /*in_reduction_syms=*/nullptr, clauses.isDevicePtrVars, clauses.mapVars, clauses.nowait, clauses.privateVars, - makeArrayAttr(ctx, clauses.privateSyms), clauses.threadLimit); + makeArrayAttr(ctx, clauses.privateSyms), clauses.threadLimit, + clauses.bare); } LogicalResult TargetOp::verify() { >From 3d70515e714f3e09ef8cf4a69bf876d2371f1393 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Fri, 4 Oct 2024 16:16:46 +0900 Subject: [PATCH 02/10] Fix ompx_bare printing --- mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td index 7ec8a924b3c3ff..fe84aa744b9dbb 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td @@ -1284,11 +1284,12 @@ class OpenMP_BareClauseSkip< ); let optAssemblyFormat = [{ - `ompx_bare` + `ompx_bare` $bare }]; let description = [{ - ompx_bare placeholder description + ompx_bare allows `omp target teams` to be executed on a GPU with multi-dim + teams and threads. }]; } >From e6e87a5397d8f8eac6a39647c0f01c5749ec9e70 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Fri, 4 Oct 2024 16:23:05 +0900 Subject: [PATCH 03/10] Add test --- flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 diff --git a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 new file mode 100644 index 00000000000000..4c507257c6aadf --- /dev/null +++ b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 @@ -0,0 +1,10 @@ +! RUN: %flang_fc1 -emit-hlfir %openmp_flags -fopenmp-version=51 %s -o - | FileCheck %s + +program test + integer :: tmp + !$omp target teams ompx_bare num_teams(42) thread_limit(43) + tmp = 1 + !$omp end target teams +end program + +! CHECK: omp.target map_entries({{.*}}) thread_limit({{.*}}) ompx_bare >From 87035e08b75c0ecbf3af4f5c87f848ff59cf3ae4 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Fri, 4 Oct 2024 16:24:41 +0900 Subject: [PATCH 04/10] test --- flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 index 4c507257c6aadf..2a97a14516ec3a 100644 --- a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 +++ b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 @@ -7,4 +7,4 @@ program test !$omp end target teams end program -! CHECK: omp.target map_entries({{.*}}) thread_limit({{.*}}) ompx_bare +! CHECK: omp.target {{.*}} ompx_bare >From 109c1e7708b96e48a762fcbd08a422ec400cefb4 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Fri, 4 Oct 2024 16:25:52 +0900 Subject: [PATCH 05/10] Order --- flang/lib/Lower/OpenMP/Clauses.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/lib/Lower/OpenMP/Clauses.h b/flang/lib/Lower/OpenMP/Clauses.h index 10bd1439563244..51bf0eab0f8d07 100644 --- a/flang/lib/Lower/OpenMP/Clauses.h +++ b/flang/lib/Lower/OpenMP/Clauses.h @@ -229,8 +229,8 @@ using NumTasks = tomp::clause::NumTasksT<TypeTy, IdTy, ExprTy>; using NumTeams = tomp::clause::NumTeamsT<TypeTy, IdTy, ExprTy>; using NumThreads = tomp::clause::NumThreadsT<TypeTy, IdTy, ExprTy>; using OmpxAttribute = tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy>; -using OmpxDynCgroupMem = tomp::clause::OmpxDynCgroupMemT<TypeTy, IdTy, ExprTy>; using OmpxBare = tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy>; +using OmpxDynCgroupMem = tomp::clause::OmpxDynCgroupMemT<TypeTy, IdTy, ExprTy>; using Ordered = tomp::clause::OrderedT<TypeTy, IdTy, ExprTy>; using Order = tomp::clause::OrderT<TypeTy, IdTy, ExprTy>; using Partial = tomp::clause::PartialT<TypeTy, IdTy, ExprTy>; >From aef948e5bcd7b68ad3d293a00490e9c55381eff4 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek <krzysztof.parzys...@amd.com> Date: Mon, 7 Oct 2024 12:49:14 -0500 Subject: [PATCH 06/10] Only accept ompx_bare on a combined "TARGET TEAMS" construct --- flang/lib/Semantics/check-omp-structure.cpp | 12 +++++++++++- flang/test/Semantics/OpenMP/ompx-bare.f90 | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 flang/test/Semantics/OpenMP/ompx-bare.f90 diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 5ef504aa72326e..44b017d82779ca 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -2390,7 +2390,6 @@ CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare) CHECK_SIMPLE_CLAUSE(CancellationConstructType, OMPC_cancellation_construct_type) CHECK_SIMPLE_CLAUSE(Doacross, OMPC_doacross) CHECK_SIMPLE_CLAUSE(OmpxAttribute, OMPC_ompx_attribute) -CHECK_SIMPLE_CLAUSE(OmpxBare, OMPC_ompx_bare) CHECK_SIMPLE_CLAUSE(Enter, OMPC_enter) CHECK_SIMPLE_CLAUSE(Fail, OMPC_fail) CHECK_SIMPLE_CLAUSE(Weak, OMPC_weak) @@ -3357,6 +3356,17 @@ void OmpStructureChecker::Enter(const parser::OmpClause::HasDeviceAddr &x) { } } +void OmpStructureChecker::Enter(const parser::OmpClause::OmpxBare &x) { + // Don't call CheckAllowedClause, because it allows "ompx_bare" on + // a non-combined "target" directive (for reasons of splitting combined + // directives). In source code it's only allowed on "target teams". + if (GetContext().directive != llvm::omp::Directive::OMPD_target_teams) { + context_.Say(GetContext().clauseSource, + "%s clause is only allowed on combined TARGET TEAMS"_err_en_US, + parser::ToUpperCaseLetters(getClauseName(llvm::omp::OMPC_ompx_bare))); + } +} + llvm::StringRef OmpStructureChecker::getClauseName(llvm::omp::Clause clause) { return llvm::omp::getOpenMPClauseName(clause); } diff --git a/flang/test/Semantics/OpenMP/ompx-bare.f90 b/flang/test/Semantics/OpenMP/ompx-bare.f90 new file mode 100644 index 00000000000000..99a04321f1c5d9 --- /dev/null +++ b/flang/test/Semantics/OpenMP/ompx-bare.f90 @@ -0,0 +1,21 @@ +!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=51 + +subroutine test1 +!ERROR: OMPX_BARE clause is only allowed on combined TARGET TEAMS + !$omp target ompx_bare + !$omp end target +end + +subroutine test2 + !$omp target +!ERROR: OMPX_BARE clause is only allowed on combined TARGET TEAMS + !$omp teams ompx_bare + !$omp end teams + !$omp end target +end + +subroutine test3 +!No errors + !$omp target teams ompx_bare + !$omp end target teams +end >From 490831069e6ee92b5e07cf395dea4e5d571a0791 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Tue, 8 Oct 2024 09:04:56 +0900 Subject: [PATCH 07/10] Alphabetical ordering --- flang/lib/Lower/OpenMP/ClauseProcessor.h | 2 +- flang/lib/Lower/OpenMP/OpenMP.cpp | 2 +- .../mlir/Dialect/OpenMP/OpenMPClauses.td | 51 ++++++++++--------- mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td | 10 ++-- mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp | 8 +-- 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h index a04731f94ede37..58cd8fcdec4913 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.h +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h @@ -53,6 +53,7 @@ class ClauseProcessor { : converter(converter), semaCtx(semaCtx), clauses(clauses) {} // 'Unique' clauses: They can appear at most once in the clause list. + bool processBare(mlir::omp::BareClauseOps &result) const; bool processCollapse(mlir::Location currentLocation, lower::pft::Evaluation &eval, mlir::omp::LoopRelatedClauseOps &result, @@ -74,7 +75,6 @@ class ClauseProcessor { bool processHint(mlir::omp::HintClauseOps &result) const; bool processMergeable(mlir::omp::MergeableClauseOps &result) const; bool processNowait(mlir::omp::NowaitClauseOps &result) const; - bool processBare(mlir::omp::BareClauseOps &result) const; bool processNumTeams(lower::StatementContext &stmtCtx, mlir::omp::NumTeamsClauseOps &result) const; bool processNumThreads(lower::StatementContext &stmtCtx, diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index b8b1a0ba2a69b7..a6ec49686a862f 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1167,6 +1167,7 @@ static void genTargetClauses( llvm::SmallVectorImpl<mlir::Location> &devicePtrLocs, llvm::SmallVectorImpl<mlir::Type> &devicePtrTypes) { ClauseProcessor cp(converter, semaCtx, clauses); + cp.processBare(clauseOps); cp.processDepend(clauseOps); cp.processDevice(stmtCtx, clauseOps); cp.processHasDeviceAddr(clauseOps, deviceAddrTypes, deviceAddrLocs, @@ -1180,7 +1181,6 @@ static void genTargetClauses( cp.processNowait(clauseOps); cp.processThreadLimit(stmtCtx, clauseOps); - cp.processBare(clauseOps); cp.processTODO<clause::Allocate, clause::Defaultmap, clause::Firstprivate, clause::InReduction, clause::UsesAllocators>( diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td index fe84aa744b9dbb..60dbe2df603c42 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td @@ -84,6 +84,32 @@ class OpenMP_AllocateClauseSkip< def OpenMP_AllocateClause : OpenMP_AllocateClauseSkip<>; +//===----------------------------------------------------------------------===// +// LLVM OpenMP extension `ompx_bare` clause +//===----------------------------------------------------------------------===// + +class OpenMP_BareClauseSkip< + bit traits = false, bit arguments = false, bit assemblyFormat = false, + bit description = false, bit extraClassDeclaration = false + > : OpenMP_Clause<traits, arguments, assemblyFormat, description, + extraClassDeclaration> { + let arguments = (ins + UnitAttr:$bare + ); + + let optAssemblyFormat = [{ + `ompx_bare` $bare + }]; + + let description = [{ + `ompx_bare` allows `omp target teams` to be executed on a GPU with an + explicit number of teams and threads. This clause also allows the teams and + threads sizes to have up to 3 dimensions. + }]; +} + +def OpenMP_BareClause : OpenMP_BareClauseSkip<>; + //===----------------------------------------------------------------------===// // V5.2: [16.1, 16.2] `cancel-directive-name` clause set //===----------------------------------------------------------------------===// @@ -1270,29 +1296,4 @@ class OpenMP_UseDevicePtrClauseSkip< def OpenMP_UseDevicePtrClause : OpenMP_UseDevicePtrClauseSkip<>; -//===----------------------------------------------------------------------===// -// LLVM OpenMP extension `ompx_bare` clause -//===----------------------------------------------------------------------===// - -class OpenMP_BareClauseSkip< - bit traits = false, bit arguments = false, bit assemblyFormat = false, - bit description = false, bit extraClassDeclaration = false - > : OpenMP_Clause<traits, arguments, assemblyFormat, description, - extraClassDeclaration> { - let arguments = (ins - UnitAttr:$bare - ); - - let optAssemblyFormat = [{ - `ompx_bare` $bare - }]; - - let description = [{ - ompx_bare allows `omp target teams` to be executed on a GPU with multi-dim - teams and threads. - }]; -} - -def OpenMP_BareClause : OpenMP_BareClauseSkip<>; - #endif // OPENMP_CLAUSES diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td index ee8aeee1278b1c..30b0e24a4bd095 100644 --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td @@ -1105,11 +1105,11 @@ def TargetOp : OpenMP_Op<"target", traits = [ OutlineableOpenMPOpInterface ], clauses = [ // TODO: Complete clause list (defaultmap, uses_allocators). - OpenMP_AllocateClause, OpenMP_DependClause, OpenMP_DeviceClause, - OpenMP_HasDeviceAddrClause, OpenMP_IfClause, OpenMP_InReductionClause, - OpenMP_IsDevicePtrClause, OpenMP_MapClauseSkip<assemblyFormat = true>, - OpenMP_NowaitClause, OpenMP_PrivateClause, OpenMP_ThreadLimitClause, - OpenMP_BareClause, + OpenMP_AllocateClause, OpenMP_BareClause, OpenMP_DependClause, + OpenMP_DeviceClause, OpenMP_HasDeviceAddrClause, OpenMP_IfClause, + OpenMP_InReductionClause, OpenMP_IsDevicePtrClause, + OpenMP_MapClauseSkip<assemblyFormat = true>, OpenMP_NowaitClause, + OpenMP_PrivateClause, OpenMP_ThreadLimitClause, ], singleRegion = true> { let summary = "target construct"; let description = [{ diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp index a7c35a3bf3365b..f9ae93f7dba21e 100644 --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp @@ -1672,13 +1672,13 @@ void TargetOp::build(OpBuilder &builder, OperationState &state, // TODO Store clauses in op: allocateVars, allocatorVars, inReductionVars, // inReductionByref, inReductionSyms. TargetOp::build(builder, state, /*allocate_vars=*/{}, /*allocator_vars=*/{}, - makeArrayAttr(ctx, clauses.dependKinds), clauses.dependVars, - clauses.device, clauses.hasDeviceAddrVars, clauses.ifExpr, + clauses.bare, makeArrayAttr(ctx, clauses.dependKinds), + clauses.dependVars, clauses.device, clauses.hasDeviceAddrVars, + clauses.ifExpr, /*in_reduction_vars=*/{}, /*in_reduction_byref=*/nullptr, /*in_reduction_syms=*/nullptr, clauses.isDevicePtrVars, clauses.mapVars, clauses.nowait, clauses.privateVars, - makeArrayAttr(ctx, clauses.privateSyms), clauses.threadLimit, - clauses.bare); + makeArrayAttr(ctx, clauses.privateSyms), clauses.threadLimit); } LogicalResult TargetOp::verify() { >From f7534a7c9d1b2ccbb1a1edeacf49e327ae27f639 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Tue, 8 Oct 2024 09:08:43 +0900 Subject: [PATCH 08/10] Fail in the backend if we find ompx_bare --- .../LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index 19d80fbbd699b0..a99b455b7ab68b 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -3227,6 +3227,11 @@ static bool getTargetEntryUniqueInfo(llvm::TargetRegionEntryInfo &targetInfo, static bool targetOpSupported(Operation &opInst) { auto targetOp = cast<omp::TargetOp>(opInst); + if (targetOp.getBare()) { + opInst.emitError("ompx_bare not yet supported"); + return false; + } + if (targetOp.getIfExpr()) { opInst.emitError("If clause not yet supported"); return false; >From b2ee05fa3974fe50d9b6239abd6d32bce766bddc Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Tue, 8 Oct 2024 09:24:27 +0900 Subject: [PATCH 09/10] Fix test --- flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 index 2a97a14516ec3a..ca7c8f00beef2d 100644 --- a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 +++ b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90 @@ -7,4 +7,4 @@ program test !$omp end target teams end program -! CHECK: omp.target {{.*}} ompx_bare +! CHECK: omp.target ompx_bare >From 3d9064b31344fcc06bec8dec0c32c515568871c4 Mon Sep 17 00:00:00 2001 From: Ivan Radanov Ivanov <ivanov.i...@m.titech.ac.jp> Date: Tue, 8 Oct 2024 21:13:05 +0900 Subject: [PATCH 10/10] Fix `omp target` error in clang --- clang/lib/Parse/ParseOpenMP.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 64dfcd47296998..5a396d6507794a 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -26,6 +26,7 @@ #include "clang/Sema/SemaOpenMP.h" #include "llvm/ADT/SmallBitVector.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/Frontend/OpenMP/OMP.h.inc" #include "llvm/Frontend/OpenMP/OMPAssume.h" #include "llvm/Frontend/OpenMP/OMPContext.h" #include <optional> @@ -3454,6 +3455,16 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, Clause = ParseOpenMPOMPXAttributesClause(WrongDirective); break; case OMPC_ompx_bare: + if (DKind == llvm::omp::Directive::OMPD_target) { + // Flang splits the combined directives which requires OMPD_target to be + // marked as accepting the `ompx_bare` clause in `OMP.td`. Thus, we need + // to explicitly check whether this clause is applied to an `omp target` + // without `teams` and emit an error. + Diag(Tok, diag::err_omp_unexpected_clause) + << getOpenMPClauseName(CKind) << getOpenMPDirectiveName(DKind); + ErrorFound = true; + WrongDirective = true; + } if (WrongDirective) Diag(Tok, diag::note_ompx_bare_clause) << getOpenMPClauseName(CKind) << "target teams"; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits