Skip to content

Commit de2ec5d

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 bc702ec commit de2ec5d

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
@@ -40,6 +40,7 @@
4040
#include "mlir/Transforms/RegionUtils.h"
4141
#include "llvm/ADT/STLExtras.h"
4242
#include "llvm/Frontend/OpenMP/OMPConstants.h"
43+
#include <string>
4344

4445
using namespace Fortran::lower::omp;
4546
using namespace Fortran::common::openmp;
@@ -3119,7 +3120,39 @@ static void
31193120
genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
31203121
semantics::SemanticsContext &semaCtx, lower::pft::Evaluation &eval,
31213122
const parser::OpenMPDeclareMapperConstruct &declareMapperConstruct) {
3122-
TODO(converter.getCurrentLocation(), "OpenMPDeclareMapperConstruct");
3123+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
3124+
lower::StatementContext stmtCtx;
3125+
const auto &spec =
3126+
std::get<parser::OmpDeclareMapperSpecifier>(declareMapperConstruct.t);
3127+
const auto &mapperName{std::get<std::optional<parser::Name>>(spec.t)};
3128+
const auto &varType{std::get<parser::TypeSpec>(spec.t)};
3129+
const auto &varName{std::get<parser::Name>(spec.t)};
3130+
std::stringstream mapperNameStr;
3131+
if (mapperName.has_value()) {
3132+
mapperNameStr << mapperName->ToString();
3133+
} else {
3134+
mapperNameStr << "default_"
3135+
<< varType.declTypeSpec->derivedTypeSpec().name().ToString();
3136+
}
3137+
3138+
mlir::OpBuilder::InsertPoint insPt = firOpBuilder.saveInsertionPoint();
3139+
firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody());
3140+
auto mlirType = converter.genType(varType.declTypeSpec->derivedTypeSpec());
3141+
auto varVal = firOpBuilder.createTemporaryAlloc(
3142+
converter.getCurrentLocation(), mlirType, varName.ToString());
3143+
symTable.addSymbol(*varName.symbol, varVal);
3144+
3145+
mlir::omp::DeclareMapperOperands clauseOps;
3146+
const auto *clauseList{
3147+
parser::Unwrap<parser::OmpClauseList>(declareMapperConstruct.t)};
3148+
List<Clause> clauses = makeClauses(*clauseList, semaCtx);
3149+
ClauseProcessor cp(converter, semaCtx, clauses);
3150+
cp.processMap(converter.getCurrentLocation(), stmtCtx, clauseOps);
3151+
auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>(
3152+
converter.getCurrentLocation(), mapperNameStr.str(), varVal, mlirType,
3153+
clauseOps.mapVars);
3154+
converter.getMLIRSymbolTable()->insert(declMapperOp.getOperation());
3155+
firOpBuilder.restoreInsertionPoint(insPt);
31233156
}
31243157

31253158
static void

flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,8 @@ class MapInfoFinalizationPass
464464
for (auto *user : mapOp->getUsers()) {
465465
if (llvm::isa<mlir::omp::TargetOp, mlir::omp::TargetDataOp,
466466
mlir::omp::TargetUpdateOp, mlir::omp::TargetExitDataOp,
467-
mlir::omp::TargetEnterDataOp>(user))
467+
mlir::omp::TargetEnterDataOp, mlir::omp::DeclareMapperOp>(
468+
user))
468469
return user;
469470

470471
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)