https://github.com/TIFitis updated https://github.com/llvm/llvm-project/pull/117046
>From 45609cd2e373285cb6fe306d2d318f638f3916b4 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 1/3] [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 >From e091b21f8cd037a8a6f757b952ecd193bf3e0805 Mon Sep 17 00:00:00 2001 From: Akash Banerjee <akash.baner...@amd.com> Date: Wed, 20 Nov 2024 20:55:45 +0000 Subject: [PATCH 2/3] Add emptyline to test. --- flang/test/Lower/OpenMP/declare-mapper.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/test/Lower/OpenMP/declare-mapper.f90 b/flang/test/Lower/OpenMP/declare-mapper.f90 index fd018b4fbb0e0f..eed40d2e4cdce5 100644 --- a/flang/test/Lower/OpenMP/declare-mapper.f90 +++ b/flang/test/Lower/OpenMP/declare-mapper.f90 @@ -28,4 +28,4 @@ subroutine mapper_default !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 +end subroutine >From a9f42ac4dd578b21554549a815fddc75c890fc1b Mon Sep 17 00:00:00 2001 From: Akash Banerjee <akash.baner...@amd.com> Date: Fri, 22 Nov 2024 12:50:32 +0000 Subject: [PATCH 3/3] Addressed reviewer comments. Added assert to check for derived type. --- flang/lib/Lower/OpenMP/OpenMP.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index c33bf0c9ea7a08..9986ceb7384c0e 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -39,7 +39,6 @@ #include "mlir/Transforms/RegionUtils.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Frontend/OpenMP/OMPConstants.h" -#include <string> using namespace Fortran::lower::omp; @@ -2709,13 +2708,16 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, 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(); - } + assert(varType.declTypeSpec->category() == + semantics::DeclTypeSpec::Category::TypeDerived && + "Expected derived type"); + + std::string 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()); @@ -2731,7 +2733,7 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, ClauseProcessor cp(converter, semaCtx, clauses); cp.processMap(converter.getCurrentLocation(), stmtCtx, clauseOps); auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>( - converter.getCurrentLocation(), mapperNameStr.str(), varVal, mlirType, + converter.getCurrentLocation(), mapperNameStr, varVal, mlirType, clauseOps.mapVars); converter.getMLIRSymbolTable()->insert(declMapperOp.getOperation()); firOpBuilder.restoreInsertionPoint(insPt); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits