diff options
| author | skc7 <Krishna.Sankisa@amd.com> | 2026-02-11 18:41:48 +0530 |
|---|---|---|
| committer | skc7 <Krishna.Sankisa@amd.com> | 2026-02-11 18:42:40 +0530 |
| commit | 37ace282ac9d179e2a22333bf9dc607a82d8d868 (patch) | |
| tree | 1844127f6163e60a93149aa4a4e33afd19c1f000 | |
| parent | 93d99e3e5474a8c58b42f9f0e0ed26f10c845f6c (diff) | |
| download | llvm-users/skc7/dyn_group_pvt_mlir_flang_lowering.tar.gz llvm-users/skc7/dyn_group_pvt_mlir_flang_lowering.tar.bz2 llvm-users/skc7/dyn_group_pvt_mlir_flang_lowering.zip | |
[flang][mlir] Add flang to mlir lowering for dyn_groupprivateusers/skc7/dyn_group_pvt_mlir_flang_lowering
| -rw-r--r-- | flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 47 | ||||
| -rw-r--r-- | flang/lib/Lower/OpenMP/ClauseProcessor.h | 4 | ||||
| -rw-r--r-- | flang/lib/Lower/OpenMP/OpenMP.cpp | 6 | ||||
| -rw-r--r-- | flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90 | 10 | ||||
| -rw-r--r-- | flang/test/Lower/OpenMP/dyn-groupprivate-clause.f90 | 54 | ||||
| -rw-r--r-- | llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h | 18 |
6 files changed, 126 insertions, 13 deletions
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp index b1973a3b8bf0..856d8c6a3f8c 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp @@ -689,6 +689,53 @@ bool ClauseProcessor::processThreadLimit( return false; } +bool ClauseProcessor::processDynGroupprivate( + lower::StatementContext &stmtCtx, + mlir::omp::DynGroupprivateClauseOps &result) const { + using DynGroupprivate = omp::clause::DynGroupprivate; + if (auto *clause = findUniqueClause<DynGroupprivate>()) { + fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); + mlir::MLIRContext *context = firOpBuilder.getContext(); + + // Process AccessGroup modifier (cgroup) + if (auto accessGroup = + std::get<std::optional<DynGroupprivate::AccessGroup>>(clause->t)) { + switch (*accessGroup) { + case DynGroupprivate::AccessGroup::Cgroup: + result.accessGroup = mlir::omp::AccessGroupModifierAttr::get( + context, mlir::omp::AccessGroupModifier::cgroup); + break; + } + } + + // Process Fallback modifier (abort, default_mem, null) + if (auto fallback = + std::get<std::optional<DynGroupprivate::Fallback>>(clause->t)) { + switch (*fallback) { + case DynGroupprivate::Fallback::Abort: + result.fallback = mlir::omp::FallbackModifierAttr::get( + context, mlir::omp::FallbackModifier::abort); + break; + case DynGroupprivate::Fallback::Default_Mem: + result.fallback = mlir::omp::FallbackModifierAttr::get( + context, mlir::omp::FallbackModifier::default_mem); + break; + case DynGroupprivate::Fallback::Null: + result.fallback = mlir::omp::FallbackModifierAttr::get( + context, mlir::omp::FallbackModifier::null); + break; + } + } + + // Process size expression + const auto &sizeExpr = std::get<SomeExpr>(clause->t); + result.dynGroupprivateSize = + fir::getBase(converter.genExprValue(sizeExpr, stmtCtx)); + return true; + } + return false; +} + bool ClauseProcessor::processUntied(mlir::omp::UntiedClauseOps &result) const { return markClauseOccurrence<omp::clause::Untied>(result.untied); } diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.h b/flang/lib/Lower/OpenMP/ClauseProcessor.h index ca9b28dfdd06..c2a4f88dab4b 100644 --- a/flang/lib/Lower/OpenMP/ClauseProcessor.h +++ b/flang/lib/Lower/OpenMP/ClauseProcessor.h @@ -116,7 +116,9 @@ public: bool processThreadLimit(lower::StatementContext &stmtCtx, mlir::omp::ThreadLimitClauseOps &result) const; bool processUntied(mlir::omp::UntiedClauseOps &result) const; - + bool + processDynGroupprivate(lower::StatementContext &stmtCtx, + mlir::omp::DynGroupprivateClauseOps &result) const; bool processDetach(mlir::omp::DetachClauseOps &result) const; // 'Repeatable' clauses: They can appear multiple times in the clause list. bool processAffinity(mlir::omp::AffinityClauseOps &result) const; diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 3eeaab48d144..835b6f068631 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1739,7 +1739,7 @@ static void genTargetClauses( &mapSyms); cp.processNowait(clauseOps); cp.processThreadLimit(stmtCtx, clauseOps); - + cp.processDynGroupprivate(stmtCtx, clauseOps); cp.processTODO<clause::Allocate, clause::InReduction, clause::UsesAllocators>( loc, llvm::omp::Directive::OMPD_target); @@ -1878,6 +1878,7 @@ static void genTeamsClauses( } cp.processReduction(loc, clauseOps, reductionSyms); + cp.processDynGroupprivate(stmtCtx, clauseOps); // TODO Support delayed privatization. } @@ -4234,7 +4235,8 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, !std::holds_alternative<clause::Untied>(clause.u) && !std::holds_alternative<clause::TaskReduction>(clause.u) && !std::holds_alternative<clause::Detach>(clause.u) && - !std::holds_alternative<clause::Device>(clause.u)) { + !std::holds_alternative<clause::Device>(clause.u) && + !std::holds_alternative<clause::DynGroupprivate>(clause.u)) { std::string name = parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(clause.id)); if (!semaCtx.langOptions().OpenMPSimd) diff --git a/flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90 b/flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90 deleted file mode 100644 index e06470f772bf..000000000000 --- a/flang/test/Lower/OpenMP/Todo/dyn-groupprivate-clause.f90 +++ /dev/null @@ -1,10 +0,0 @@ -!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 - diff --git a/flang/test/Lower/OpenMP/dyn-groupprivate-clause.f90 b/flang/test/Lower/OpenMP/dyn-groupprivate-clause.f90 new file mode 100644 index 000000000000..93c04374827d --- /dev/null +++ b/flang/test/Lower/OpenMP/dyn-groupprivate-clause.f90 @@ -0,0 +1,54 @@ +! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=61 -o - %s 2>&1 | FileCheck %s + +! Test lowering of dyn_groupprivate clause for target directive + +! CHECK-LABEL: func.func @_QPf00 +! CHECK: omp.target dyn_groupprivate({{.*}}) +subroutine f00(n) + implicit none + integer :: n + !$omp target dyn_groupprivate(n) + !$omp end target +end subroutine + +! CHECK-LABEL: func.func @_QPf01 +! CHECK: omp.target dyn_groupprivate(fallback(abort), {{.*}}) +subroutine f01(n) + implicit none + integer :: n + !$omp target dyn_groupprivate(fallback(abort): n) + !$omp end target +end subroutine + +! CHECK-LABEL: func.func @_QPf02 +! CHECK: omp.target dyn_groupprivate(cgroup, fallback(default_mem), {{.*}}) +subroutine f02(n) + implicit none + integer :: n + !$omp target dyn_groupprivate(cgroup, fallback(default_mem): n) + !$omp end target +end subroutine + +! Test lowering of dyn_groupprivate clause for teams directive + +! CHECK-LABEL: func.func @_QPf03 +! CHECK: omp.teams dyn_groupprivate({{.*}}) +subroutine f03(n) + implicit none + integer :: n + integer :: x + !$omp teams dyn_groupprivate(n) + x = 1 + !$omp end teams +end subroutine + +! CHECK-LABEL: func.func @_QPf04 +! CHECK: omp.teams dyn_groupprivate(cgroup, fallback(null), {{.*}}) +subroutine f04(n) + implicit none + integer :: n + integer :: x + !$omp teams dyn_groupprivate(cgroup, fallback(null): n) + x = 1 + !$omp end teams +end subroutine diff --git a/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h index 3a9690149ddd..54e71e9e7e39 100644 --- a/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h +++ b/llvm/include/llvm/Frontend/OpenMP/ConstructDecompositionT.h @@ -259,6 +259,9 @@ private: bool applyClause(const tomp::clause::ThreadLimitT<TypeTy, IdTy, ExprTy> &clause, const ClauseTy *); + bool applyClause( + const tomp::clause::DynGroupprivateT<TypeTy, IdTy, ExprTy> &clause, + const ClauseTy *); uint32_t version; HelperType &helper; @@ -1149,6 +1152,21 @@ bool ConstructDecompositionT<C, H>::applyClause( return true; } +// DYN_GROUPPRIVATE +// [6.1] dyn_groupprivate clause +// Directives: target, teams +// +// The effect of the dyn_groupprivate clause is as if it is applied to the +// outermost leaf construct that permits it. +template <typename C, typename H> +bool ConstructDecompositionT<C, H>::applyClause( + const tomp::clause::DynGroupprivateT<TypeTy, IdTy, ExprTy> &clause, + const ClauseTy *node) { + if (!applyToOutermost(node)) + return error(node, ErrorCode::NoLeafAllowing); + return true; +} + // --- Splitting ------------------------------------------------------ template <typename C, typename H> bool ConstructDecompositionT<C, H>::split() { |
