https://github.com/TIFitis created https://github.com/llvm/llvm-project/pull/117046
This patch adds HLFIR/FIR lowering support for OpenMP Declare Mapper directive. >From 40d104b4ba53176d346f41428329e8d5cc8edede Mon Sep 17 00:00:00 2001 From: Akash Banerjee <akash.baner...@amd.com> Date: Wed, 20 Nov 2024 20:51:02 +0000 Subject: [PATCH] [MLIR][OpenMP] Add Lowering support for OpenMP Declare Mapper directive This patch adds HLFIR/FIR lowering support for OpenMP Declare Mapper directive. --- flang/lib/Lower/OpenMP/OpenMP.cpp | 35 ++++++++++++++++++- .../Optimizer/OpenMP/MapInfoFinalization.cpp | 3 +- .../Lower/OpenMP/Todo/omp-declare-mapper.f90 | 8 ++--- flang/test/Lower/OpenMP/declare-mapper.f90 | 31 ++++++++++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 flang/test/Lower/OpenMP/declare-mapper.f90 diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index a2779213a1a15a..c33bf0c9ea7a08 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -39,6 +39,7 @@ #include "mlir/Transforms/RegionUtils.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Frontend/OpenMP/OMPConstants.h" +#include <string> using namespace Fortran::lower::omp; @@ -2701,7 +2702,39 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval, const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) { - TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct"); + fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); + lower::StatementContext stmtCtx; + const auto &spec = + std::get<parser::OmpDeclareMapperSpecifier>(declareMapperConstruct.t); + const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)}; + const auto &varType{std::get<parser::TypeSpec>(spec.t)}; + const auto &varName{std::get<parser::Name>(spec.t)}; + std::stringstream mapperNameStr; + if (mapperName.has_value()) { + mapperNameStr << mapperName->ToString(); + } else { + mapperNameStr << "default_" + << varType.declTypeSpec->derivedTypeSpec().name().ToString(); + } + + mlir::OpBuilder::InsertPoint insPt = firOpBuilder.saveInsertionPoint(); + firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody()); + auto mlirType = converter.genType(varType.declTypeSpec->derivedTypeSpec()); + auto varVal = firOpBuilder.createTemporaryAlloc( + converter.getCurrentLocation(), mlirType, varName.ToString()); + symTable.addSymbol(*varName.symbol, varVal); + + mlir::omp::DeclareMapperOperands clauseOps; + const auto *clauseList{ + parser::Unwrap<parser::OmpClauseList>(declareMapperConstruct.t)}; + List<Clause> clauses = makeClauses(*clauseList, semaCtx); + ClauseProcessor cp(converter, semaCtx, clauses); + cp.processMap(converter.getCurrentLocation(), stmtCtx, clauseOps); + auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>( + converter.getCurrentLocation(), mapperNameStr.str(), varVal, mlirType, + clauseOps.mapVars); + converter.getMLIRSymbolTable()->insert(declMapperOp.getOperation()); + firOpBuilder.restoreInsertionPoint(insPt); } static void diff --git a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp index 4575c90e34acdd..01ffb40daa4aa2 100644 --- a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp +++ b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp @@ -447,7 +447,8 @@ class MapInfoFinalizationPass for (auto *user : mapOp->getUsers()) { if (llvm::isa<mlir::omp::TargetOp, mlir::omp::TargetDataOp, mlir::omp::TargetUpdateOp, mlir::omp::TargetExitDataOp, - mlir::omp::TargetEnterDataOp>(user)) + mlir::omp::TargetEnterDataOp, mlir::omp::DeclareMapperOp>( + user)) return user; if (auto mapUser = llvm::dyn_cast<mlir::omp::MapInfoOp>(user)) diff --git a/flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90 b/flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90 index 5ae48ff7360482..13a4da5849f8c0 100644 --- a/flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90 +++ b/flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90 @@ -10,7 +10,7 @@ subroutine declare_mapper_1 type my_type integer :: num_vals integer, allocatable :: values(:) - end type + end type type my_type2 type (my_type) :: my_type_var @@ -21,7 +21,7 @@ subroutine declare_mapper_1 type (my_type2) :: t real :: x, y(nvals) !$omp declare mapper (my_type :: var) map (var, var%values (1:var%num_vals)) -!CHECK: not yet implemented: OpenMPDeclareMapperConstruct +!CHECK: not yet implemented: lowering symbol to HLFIR end subroutine declare_mapper_1 @@ -31,7 +31,7 @@ subroutine declare_mapper_2 type my_type integer :: num_vals integer, allocatable :: values(:) - end type + end type type my_type2 type (my_type) :: my_type_var @@ -43,5 +43,5 @@ subroutine declare_mapper_2 real :: x, y(nvals) !$omp declare mapper (my_mapper : my_type2 :: v) map (v%arr, x, y(:)) & !$omp& map (alloc : v%temp) -!CHECK: not yet implemented: OpenMPDeclareMapperConstruct +!CHECK: not yet implemented: lowering symbol to HLFIR end subroutine declare_mapper_2 diff --git a/flang/test/Lower/OpenMP/declare-mapper.f90 b/flang/test/Lower/OpenMP/declare-mapper.f90 new file mode 100644 index 00000000000000..fd018b4fbb0e0f --- /dev/null +++ b/flang/test/Lower/OpenMP/declare-mapper.f90 @@ -0,0 +1,31 @@ +! This test checks lowering of OpenMP declare mapper Directive. + +! RUN: split-file %s %t +! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/declare-mapper-1.f90 -o - | FileCheck %t/declare-mapper-1.f90 +! RUN %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/declare-mapper-2.f90 -o - | FileCheck %t/declare-mapper-2.f90 + +!--- declare-mapper-1.f90 +subroutine mapper + implicit none + type my_type + integer, pointer :: my_buffer + integer :: my_buffer_size + end type + !CHECK: %[[MY_VAR:.*]] = fir.alloca ![[VAR_TYPE:.*]] {bindc_name = "my_var"} + !CHECK: %[[MAP_INFO:.*]] = omp.map.info var_ptr(%[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]>, ![[VAR_TYPE]]) map_clauses(tofrom) capture(ByRef) -> !fir.ref<![[VAR_TYPE]]> {name = "my_var"} + !CHECK: omp.declare_mapper @my_mapper : %[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]> : ![[VAR_TYPE]] map_entries(%[[MAP_INFO]] : !fir.ref<![[VAR_TYPE]]>) + !$omp DECLARE MAPPER(my_mapper : my_type :: my_var) map(tofrom : my_var) +end subroutine + +!--- declare-mapper-2.f90 +subroutine mapper_default + implicit none + type my_type + integer, pointer :: my_buffer + integer :: my_buffer_size + end type + !CHECK: %[[MY_VAR:.*]] = fir.alloca ![[VAR_TYPE:.*]] {bindc_name = "my_var"} + !CHECK: %[[MAP_INFO:.*]] = omp.map.info var_ptr(%[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]>, ![[VAR_TYPE]]) map_clauses(tofrom) capture(ByRef) -> !fir.ref<![[VAR_TYPE]]> {name = "my_var"} + !CHECK: omp.declare_mapper @default_my_type : %[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]> : ![[VAR_TYPE]] map_entries(%[[MAP_INFO]] : !fir.ref<![[VAR_TYPE]]>) + !$omp DECLARE MAPPER(my_type :: my_var) map(tofrom : my_var) +end subroutine \ No newline at end of file _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits