Skip to content

Commit 40d104b

Browse files
committed
[MLIR][OpenMP] Add Lowering support for OpenMP Declare Mapper directive
This patch adds HLFIR/FIR lowering support for OpenMP Declare Mapper directive.
1 parent afcc130 commit 40d104b

File tree

4 files changed

+71
-6
lines changed

4 files changed

+71
-6
lines changed

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "mlir/Transforms/RegionUtils.h"
4040
#include "llvm/ADT/STLExtras.h"
4141
#include "llvm/Frontend/OpenMP/OMPConstants.h"
42+
#include <string>
4243

4344
using namespace Fortran::lower::omp;
4445

@@ -2701,7 +2702,39 @@ static void
27012702
genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
27022703
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
27032704
const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) {
2704-
TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct");
2705+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
2706+
lower::StatementContext stmtCtx;
2707+
const auto &spec =
2708+
std::get<parser::OmpDeclareMapperSpecifier>(declareMapperConstruct.t);
2709+
const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)};
2710+
const auto &varType{std::get<parser::TypeSpec>(spec.t)};
2711+
const auto &varName{std::get<parser::Name>(spec.t)};
2712+
std::stringstream mapperNameStr;
2713+
if (mapperName.has_value()) {
2714+
mapperNameStr << mapperName->ToString();
2715+
} else {
2716+
mapperNameStr << "default_"
2717+
<< varType.declTypeSpec->derivedTypeSpec().name().ToString();
2718+
}
2719+
2720+
mlir::OpBuilder::InsertPoint insPt = firOpBuilder.saveInsertionPoint();
2721+
firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody());
2722+
auto mlirType = converter.genType(varType.declTypeSpec->derivedTypeSpec());
2723+
auto varVal = firOpBuilder.createTemporaryAlloc(
2724+
converter.getCurrentLocation(), mlirType, varName.ToString());
2725+
symTable.addSymbol(*varName.symbol, varVal);
2726+
2727+
mlir::omp::DeclareMapperOperands clauseOps;
2728+
const auto *clauseList{
2729+
parser::Unwrap<parser::OmpClauseList>(declareMapperConstruct.t)};
2730+
List<Clause> clauses = makeClauses(*clauseList, semaCtx);
2731+
ClauseProcessor cp(converter, semaCtx, clauses);
2732+
cp.processMap(converter.getCurrentLocation(), stmtCtx, clauseOps);
2733+
auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>(
2734+
converter.getCurrentLocation(), mapperNameStr.str(), varVal, mlirType,
2735+
clauseOps.mapVars);
2736+
converter.getMLIRSymbolTable()->insert(declMapperOp.getOperation());
2737+
firOpBuilder.restoreInsertionPoint(insPt);
27052738
}
27062739

27072740
static void

flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,8 @@ class MapInfoFinalizationPass
447447
for (auto *user : mapOp->getUsers()) {
448448
if (llvm::isa<mlir::omp::TargetOp, mlir::omp::TargetDataOp,
449449
mlir::omp::TargetUpdateOp, mlir::omp::TargetExitDataOp,
450-
mlir::omp::TargetEnterDataOp>(user))
450+
mlir::omp::TargetEnterDataOp, mlir::omp::DeclareMapperOp>(
451+
user))
451452
return user;
452453

453454
if (auto mapUser = llvm::dyn_cast<mlir::omp::MapInfoOp>(user))

flang/test/Lower/OpenMP/Todo/omp-declare-mapper.f90

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ subroutine declare_mapper_1
1010
type my_type
1111
integer :: num_vals
1212
integer, allocatable :: values(:)
13-
end type
13+
end type
1414

1515
type my_type2
1616
type (my_type) :: my_type_var
@@ -21,7 +21,7 @@ subroutine declare_mapper_1
2121
type (my_type2) :: t
2222
real :: x, y(nvals)
2323
!$omp declare mapper (my_type :: var) map (var, var%values (1:var%num_vals))
24-
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct
24+
!CHECK: not yet implemented: lowering symbol to HLFIR
2525
end subroutine declare_mapper_1
2626

2727

@@ -31,7 +31,7 @@ subroutine declare_mapper_2
3131
type my_type
3232
integer :: num_vals
3333
integer, allocatable :: values(:)
34-
end type
34+
end type
3535

3636
type my_type2
3737
type (my_type) :: my_type_var
@@ -43,5 +43,5 @@ subroutine declare_mapper_2
4343
real :: x, y(nvals)
4444
!$omp declare mapper (my_mapper : my_type2 :: v) map (v%arr, x, y(:)) &
4545
!$omp& map (alloc : v%temp)
46-
!CHECK: not yet implemented: OpenMPDeclareMapperConstruct
46+
!CHECK: not yet implemented: lowering symbol to HLFIR
4747
end subroutine declare_mapper_2
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
! This test checks lowering of OpenMP declare mapper Directive.
2+
3+
! RUN: split-file %s %t
4+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/declare-mapper-1.f90 -o - | FileCheck %t/declare-mapper-1.f90
5+
! RUN %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/declare-mapper-2.f90 -o - | FileCheck %t/declare-mapper-2.f90
6+
7+
!--- declare-mapper-1.f90
8+
subroutine mapper
9+
implicit none
10+
type my_type
11+
integer, pointer :: my_buffer
12+
integer :: my_buffer_size
13+
end type
14+
!CHECK: %[[MY_VAR:.*]] = fir.alloca ![[VAR_TYPE:.*]] {bindc_name = "my_var"}
15+
!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"}
16+
!CHECK: omp.declare_mapper @my_mapper : %[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]> : ![[VAR_TYPE]] map_entries(%[[MAP_INFO]] : !fir.ref<![[VAR_TYPE]]>)
17+
!$omp DECLARE MAPPER(my_mapper : my_type :: my_var) map(tofrom : my_var)
18+
end subroutine
19+
20+
!--- declare-mapper-2.f90
21+
subroutine mapper_default
22+
implicit none
23+
type my_type
24+
integer, pointer :: my_buffer
25+
integer :: my_buffer_size
26+
end type
27+
!CHECK: %[[MY_VAR:.*]] = fir.alloca ![[VAR_TYPE:.*]] {bindc_name = "my_var"}
28+
!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"}
29+
!CHECK: omp.declare_mapper @default_my_type : %[[MY_VAR]] : !fir.ref<![[VAR_TYPE]]> : ![[VAR_TYPE]] map_entries(%[[MAP_INFO]] : !fir.ref<![[VAR_TYPE]]>)
30+
!$omp DECLARE MAPPER(my_type :: my_var) map(tofrom : my_var)
31+
end subroutine

0 commit comments

Comments
 (0)