[Mlir-commits] [clang] [flang] [llvm] [mlir] [flang][OpenMP] Add frontend support for ompx_bare clause (PR #111106)
Ivan R. Ivanov
llvmlistbot at llvm.org
Wed Dec 11 04:28:26 PST 2024
https://github.com/ivanradanov updated https://github.com/llvm/llvm-project/pull/111106
>From 85e1b6d318a4f11630588f95f964be645d6ddb9b Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 4 Oct 2024 16:20:36 +0900
Subject: [PATCH 01/15] [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 | 2 +-
10 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index 48c559a78b9bc4..99049cee3ff909 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -382,6 +382,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 e0fe917c50e8f8..c309da99263f13 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.h
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h
@@ -73,6 +73,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 65282d243d87af..e447989446a0e8 100644
--- a/flang/lib/Lower/OpenMP/Clauses.h
+++ b/flang/lib/Lower/OpenMP/Clauses.h
@@ -253,8 +253,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 2ef4d184a6321f..ffe5213961ef03 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1194,6 +1194,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>(
@@ -2858,6 +2859,7 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
!std::holds_alternative<clause::Nowait>(clause.u) &&
!std::holds_alternative<clause::NumTeams>(clause.u) &&
!std::holds_alternative<clause::NumThreads>(clause.u) &&
+ !std::holds_alternative<clause::OmpxBare>(clause.u) &&
!std::holds_alternative<clause::Priority>(clause.u) &&
!std::holds_alternative<clause::Private>(clause.u) &&
!std::holds_alternative<clause::ProcBind>(clause.u) &&
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 86d475c1a15422..bfd6be646a066d 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -597,6 +597,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 bd7fb2361aaeb1..d850d7fed22e54 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -1017,6 +1017,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 077d6602628aa0..4d860c00fa656a 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
@@ -1323,4 +1323,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 85b6a6638036fb..db4ffc36c87846 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -1218,7 +1218,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 e20530be07b2f9..3384f57079f135 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -1715,7 +1715,7 @@ void TargetOp::build(OpBuilder &builder, OperationState &state,
/*in_reduction_syms=*/nullptr, clauses.isDevicePtrVars,
clauses.mapVars, clauses.nowait, clauses.privateVars,
makeArrayAttr(ctx, clauses.privateSyms), clauses.threadLimit,
- /*private_maps=*/nullptr);
+ clauses.bare, /*private_maps=*/nullptr);
}
LogicalResult TargetOp::verify() {
>From 5a64145230891561e67946425b3d32b9d5779c4d Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 4 Oct 2024 16:16:46 +0900
Subject: [PATCH 02/15] 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 4d860c00fa656a..b70ed6fd72d620 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
@@ -1337,11 +1337,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 1ff1fb5335896a60f1e76e66d577ec97dc94d109 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 4 Oct 2024 16:23:05 +0900
Subject: [PATCH 03/15] 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 1bd3bcbd47f0ae6bd7fdc0b9b6f6600418365c39 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 4 Oct 2024 16:24:41 +0900
Subject: [PATCH 04/15] 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 3b785970a53bd4fc8896b7bd341519f77b56e497 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 4 Oct 2024 16:25:52 +0900
Subject: [PATCH 05/15] 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 e447989446a0e8..65282d243d87af 100644
--- a/flang/lib/Lower/OpenMP/Clauses.h
+++ b/flang/lib/Lower/OpenMP/Clauses.h
@@ -253,8 +253,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 af77a4388d652cfbe81e20be77bbe8a69c578fb3 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Mon, 7 Oct 2024 12:49:14 -0500
Subject: [PATCH 06/15] 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, 33 insertions(+)
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 3c9c5a02a338a6..14251f2c8b628a 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2883,6 +2883,7 @@ CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare)
CHECK_SIMPLE_CLAUSE(CancellationConstructType, OMPC_cancellation_construct_type)
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)
@@ -4361,6 +4362,17 @@ void OmpStructureChecker::Enter(const parser::OmpClause::To &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 76261230b9f54aae35ec73a60eee64ceff9a4ae0 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Tue, 8 Oct 2024 09:04:56 +0900
Subject: [PATCH 07/15] 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 | 7 +--
5 files changed, 37 insertions(+), 35 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h
index c309da99263f13..3942c54e6e935d 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 processBind(mlir::omp::BindClauseOps &result) const;
bool
processCollapse(mlir::Location currentLocation, lower::pft::Evaluation &eval,
@@ -73,7 +74,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 ffe5213961ef03..2aa02f764eb8c5 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1183,6 +1183,7 @@ static void genTargetClauses(
llvm::SmallVectorImpl<const semantics::Symbol *> &isDevicePtrSyms,
llvm::SmallVectorImpl<const semantics::Symbol *> &mapSyms) {
ClauseProcessor cp(converter, semaCtx, clauses);
+ cp.processBare(clauseOps);
cp.processDepend(clauseOps);
cp.processDevice(stmtCtx, clauseOps);
cp.processHasDeviceAddr(clauseOps, hasDeviceAddrSyms);
@@ -1194,7 +1195,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 b70ed6fd72d620..98d2e80ed2d81d 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
//===----------------------------------------------------------------------===//
@@ -1323,29 +1349,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 db4ffc36c87846..26ec55905cfe41 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -1215,11 +1215,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 3384f57079f135..894aa5e3da8f19 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -1709,13 +1709,14 @@ 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, /*private_maps=*/nullptr);
+ /*private_maps=*/nullptr);
}
LogicalResult TargetOp::verify() {
>From 06ddd2517c8b383a95f66b5277cabb498dddae5e Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Tue, 8 Oct 2024 09:08:43 +0900
Subject: [PATCH 08/15] 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 49fe509800491a..4da659dfe1d2c5 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -158,6 +158,10 @@ static LogicalResult checkImplementationStatus(Operation &op) {
if (!op.getAllocateVars().empty() || !op.getAllocatorVars().empty())
result = todo("allocate");
};
+ auto checkBare = [&todo](auto op, LogicalResult &result) {
+ if (op.getBare()) {
+ result = todo("ompx_bare");
+ };
auto checkDepend = [&todo](auto op, LogicalResult &result) {
if (!op.getDependVars().empty() || op.getDependKinds())
result = todo("depend");
@@ -283,6 +287,7 @@ static LogicalResult checkImplementationStatus(Operation &op) {
[&](auto op) { checkDepend(op, result); })
.Case([&](omp::TargetOp op) {
checkAllocate(op, result);
+ checkBare(op, result);
checkDevice(op, result);
checkHasDeviceAddr(op, result);
checkIf(op, result);
>From 2604e63a965236a30343c4a568271e0b62c490d2 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Tue, 8 Oct 2024 09:24:27 +0900
Subject: [PATCH 09/15] 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 3f43e2145a7299421132ce746e9419d8cff60d9f Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Tue, 8 Oct 2024 21:13:05 +0900
Subject: [PATCH 10/15] 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 b91928063169ee..a72bbbca3d49fb 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>
@@ -3474,6 +3475,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";
>From 6a0de6a3b5629ab338682417a9ad1758bece6229 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Wed, 9 Oct 2024 22:13:53 +0900
Subject: [PATCH 11/15] Add one more test
---
flang/test/Semantics/OpenMP/ompx-bare.f90 | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/flang/test/Semantics/OpenMP/ompx-bare.f90 b/flang/test/Semantics/OpenMP/ompx-bare.f90
index 99a04321f1c5d9..21a603e9a826bf 100644
--- a/flang/test/Semantics/OpenMP/ompx-bare.f90
+++ b/flang/test/Semantics/OpenMP/ompx-bare.f90
@@ -15,6 +15,15 @@ subroutine test2
end
subroutine test3
+ integer i
+!ERROR: OMPX_BARE clause is only allowed on combined TARGET TEAMS
+ !$omp target teams distribute ompx_bare
+ do i = 0, 10
+ end do
+ !$omp end target teams distribute
+end
+
+subroutine test4
!No errors
!$omp target teams ompx_bare
!$omp end target teams
>From 4fa7584ef809e315527bdc3afef04d09051ec144 Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Fri, 11 Oct 2024 23:25:57 +0900
Subject: [PATCH 12/15] Fix rebase error
---
flang/lib/Semantics/check-omp-structure.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 14251f2c8b628a..b3ef3176bec45e 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2882,8 +2882,6 @@ CHECK_SIMPLE_CLAUSE(Align, OMPC_align)
CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare)
CHECK_SIMPLE_CLAUSE(CancellationConstructType, OMPC_cancellation_construct_type)
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)
>From 372a322dc2e3fdd147c7b7922d0d4f314bd550fe Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Sat, 12 Oct 2024 14:18:33 +0900
Subject: [PATCH 13/15] %openmp_flags is only available when omprt is built
---
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 ca7c8f00beef2d..1445c4fa225d2e 100644
--- a/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90
+++ b/flang/test/Lower/OpenMP/KernelLanguage/bare-clause.f90
@@ -1,4 +1,4 @@
-! RUN: %flang_fc1 -emit-hlfir %openmp_flags -fopenmp-version=51 %s -o - | FileCheck %s
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=51 %s -o - | FileCheck %s
program test
integer :: tmp
>From 136bdeaa8ad6e203cf70c346ff310d1a4877edbc Mon Sep 17 00:00:00 2001
From: "Ivan R. Ivanov" <ivanov.i.aa at m.titech.ac.jp>
Date: Wed, 11 Dec 2024 20:48:31 +0900
Subject: [PATCH 14/15] Update mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
Co-authored-by: Sergio Afonso <safonsof at amd.com>
---
mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
index 894aa5e3da8f19..77454a6f35d063 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -1711,12 +1711,11 @@ void TargetOp::build(OpBuilder &builder, OperationState &state,
TargetOp::build(builder, state, /*allocate_vars=*/{}, /*allocator_vars=*/{},
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,
- /*private_maps=*/nullptr);
+ 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);
}
LogicalResult TargetOp::verify() {
>From 977c8394f5f838ee360485e0e01de94aae66e23d Mon Sep 17 00:00:00 2001
From: Ivan Radanov Ivanov <ivanov.i.aa at m.titech.ac.jp>
Date: Wed, 11 Dec 2024 20:49:14 +0900
Subject: [PATCH 15/15] Address review comments
---
flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 8 ++++----
.../llvm/Frontend/OpenMP/ConstructDecompositionT.h | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index 99049cee3ff909..3c9831120351ee 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -220,6 +220,10 @@ static void convertLoopBounds(lower::AbstractConverter &converter,
// ClauseProcessor unique clauses
//===----------------------------------------------------------------------===//
+bool ClauseProcessor::processBare(mlir::omp::BareClauseOps &result) const {
+ return markClauseOccurrence<omp::clause::OmpxBare>(result.bare);
+}
+
bool ClauseProcessor::processBind(mlir::omp::BindClauseOps &result) const {
if (auto *clause = findUniqueClause<omp::clause::Bind>()) {
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
@@ -382,10 +386,6 @@ 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/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h
index 7c0dbe1aae1221..20fb581ee631a6 100644
--- a/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h
+++ b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h
@@ -236,11 +236,11 @@ 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 *);
+ bool applyClause(const tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy> &clause,
+ const ClauseTy *);
uint32_t version;
llvm::omp::Directive construct;
@@ -1109,7 +1109,7 @@ template <typename C, typename H>
bool ConstructDecompositionT<C, H>::applyClause(
const tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy> &clause,
const ClauseTy *node) {
- return applyToAll(node);
+ return applyToOutermost(node);
}
template <typename C, typename H>
More information about the Mlir-commits
mailing list