Skip to content

Commit 24be03e

Browse files
authored
[NFC][flang][OpenMP] Unify different versions of createMapInfoOp util (llvm#1993)
2 parents 8733c95 + 180b7f5 commit 24be03e

File tree

7 files changed

+54
-85
lines changed

7 files changed

+54
-85
lines changed

flang/include/flang/Lower/OpenMP/Utils.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,16 +109,6 @@ struct OmpMapParentAndMemberData {
109109
semantics::SemanticsContext &semaCtx);
110110
};
111111

112-
mlir::omp::MapInfoOp
113-
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
114-
mlir::Value baseAddr, mlir::Value varPtrPtr,
115-
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
116-
llvm::ArrayRef<mlir::Value> members,
117-
mlir::ArrayAttr membersIndex, uint64_t mapType,
118-
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
119-
bool partialMap = false,
120-
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr());
121-
122112
void insertChildMapInfoIntoParent(
123113
Fortran::lower::AbstractConverter &converter,
124114
Fortran::semantics::SemanticsContext &semaCtx,

flang/include/flang/Support/OpenMP-utils.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
#ifndef FORTRAN_SUPPORT_OPENMP_UTILS_H_
1010
#define FORTRAN_SUPPORT_OPENMP_UTILS_H_
1111

12+
#include "flang/Optimizer/Dialect/FIROps.h"
13+
#include "flang/Optimizer/Dialect/FIRType.h"
1214
#include "flang/Semantics/symbol.h"
1315

16+
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
1417
#include "mlir/IR/Builders.h"
1518
#include "mlir/IR/Value.h"
1619

@@ -72,6 +75,14 @@ struct EntryBlockArgs {
7275
/// \param [in] region - Empty region in which to create the entry block.
7376
mlir::Block *genEntryBlock(
7477
mlir::OpBuilder &builder, const EntryBlockArgs &args, mlir::Region &region);
78+
79+
mlir::omp::MapInfoOp createMapInfoOp(mlir::OpBuilder &builder,
80+
mlir::Location loc, mlir::Value baseAddr, mlir::Value varPtrPtr,
81+
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
82+
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
83+
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
84+
mlir::Type retTy, bool partialMap = false,
85+
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr());
7586
} // namespace Fortran::common::openmp
7687

7788
#endif // FORTRAN_SUPPORT_OPENMP_UTILS_H_

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212

1313
#include "ClauseProcessor.h"
1414

15+
#include "flang/Lower/ConvertExprToHLFIR.h"
1516
#include "flang/Lower/OpenMP/Clauses.h"
1617
#include "flang/Lower/OpenMP/Utils.h"
17-
#include "flang/Lower/ConvertExprToHLFIR.h"
1818
#include "flang/Lower/PFTBuilder.h"
1919
#include "flang/Parser/tools.h"
2020
#include "flang/Semantics/tools.h"
21+
#include "flang/Support/OpenMP-utils.h"
2122
#include "llvm/Frontend/OpenMP/OMP.h.inc"
2223
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
2324

@@ -1096,7 +1097,7 @@ void ClauseProcessor::processMapObjects(
10961097
auto location = mlir::NameLoc::get(
10971098
mlir::StringAttr::get(firOpBuilder.getContext(), asFortran.str()),
10981099
baseOp.getLoc());
1099-
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
1100+
mlir::omp::MapInfoOp mapOp = Fortran::common::openmp::createMapInfoOp(
11001101
firOpBuilder, location, baseOp,
11011102
/*varPtrPtr=*/mlir::Value{}, asFortran.str(), bounds,
11021103
/*members=*/{}, /*membersIndex=*/mlir::ArrayAttr{},

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1432,7 +1432,7 @@ static void genBodyOfTargetOp(
14321432
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
14331433
}
14341434

1435-
mlir::Value mapOp = createMapInfoOp(
1435+
mlir::Value mapOp = Fortran::common::openmp::createMapInfoOp(
14361436
firOpBuilder, copyVal.getLoc(), copyVal,
14371437
/*varPtrPtr=*/mlir::Value{}, name.str(), bounds,
14381438
/*members=*/llvm::SmallVector<mlir::Value>{},
@@ -2401,7 +2401,7 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
24012401
mlir::NameLoc::get(mlir::StringAttr::get(firOpBuilder.getContext(),
24022402
sym.name().ToString()),
24032403
baseOp.getLoc());
2404-
mlir::Value mapOp = createMapInfoOp(
2404+
mlir::Value mapOp = Fortran::common::openmp::createMapInfoOp(
24052405
firOpBuilder, location, baseOp, /*varPtrPtr=*/mlir::Value{},
24062406
name.str(), bounds, /*members=*/{},
24072407
/*membersIndex=*/mlir::ArrayAttr{},

flang/lib/Lower/OpenMP/Utils.cpp

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <flang/Parser/parse-tree.h>
2828
#include <flang/Parser/tools.h>
2929
#include <flang/Semantics/tools.h>
30+
#include <flang/Support/OpenMP-utils.h>
3031
#include <llvm/Support/CommandLine.h>
3132
#include <mlir/Analysis/TopologicalSortUtils.h>
3233
#include <mlir/Dialect/Arith/IR/Arith.h>
@@ -124,38 +125,6 @@ void gatherFuncAndVarSyms(
124125
symbolAndClause.emplace_back(clause, *object.sym());
125126
}
126127

127-
mlir::omp::MapInfoOp
128-
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
129-
mlir::Value baseAddr, mlir::Value varPtrPtr,
130-
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
131-
llvm::ArrayRef<mlir::Value> members,
132-
mlir::ArrayAttr membersIndex, uint64_t mapType,
133-
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
134-
bool partialMap, mlir::FlatSymbolRefAttr mapperId) {
135-
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
136-
baseAddr = builder.create<fir::BoxAddrOp>(loc, baseAddr);
137-
retTy = baseAddr.getType();
138-
}
139-
140-
mlir::TypeAttr varType = mlir::TypeAttr::get(
141-
llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType());
142-
143-
// For types with unknown extents such as <2x?xi32> we discard the incomplete
144-
// type info and only retain the base type. The correct dimensions are later
145-
// recovered through the bounds info.
146-
if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue()))
147-
if (seqType.hasDynamicExtents())
148-
varType = mlir::TypeAttr::get(seqType.getEleTy());
149-
150-
mlir::omp::MapInfoOp op = builder.create<mlir::omp::MapInfoOp>(
151-
loc, retTy, baseAddr, varType,
152-
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
153-
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
154-
varPtrPtr, members, membersIndex, bounds, mapperId,
155-
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
156-
return op;
157-
}
158-
159128
// This function gathers the individual omp::Object's that make up a
160129
// larger omp::Object symbol.
161130
//
@@ -414,7 +383,7 @@ mlir::Value createParentSymAndGenIntermediateMaps(
414383

415384
// Create a map for the intermediate member and insert it and it's
416385
// indices into the parentMemberIndices list to track it.
417-
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
386+
mlir::omp::MapInfoOp mapOp = Fortran::common::openmp::createMapInfoOp(
418387
firOpBuilder, clauseLocation, curValue,
419388
/*varPtrPtr=*/mlir::Value{}, asFortran,
420389
/*bounds=*/interimBounds,
@@ -574,7 +543,7 @@ void insertChildMapInfoIntoParent(
574543
converter.getCurrentLocation(), asFortran, bounds,
575544
treatIndexAsSection);
576545

577-
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
546+
mlir::omp::MapInfoOp mapOp = Fortran::common::openmp::createMapInfoOp(
578547
firOpBuilder, info.rawInput.getLoc(), info.rawInput,
579548
/*varPtrPtr=*/mlir::Value(), asFortran.str(), bounds, members,
580549
firOpBuilder.create2DI64ArrayAttr(

flang/lib/Optimizer/OpenMP/DoConcurrentConversion.cpp

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "flang/Optimizer/Dialect/Support/FIRContext.h"
1818
#include "flang/Optimizer/HLFIR/HLFIROps.h"
1919
#include "flang/Optimizer/OpenMP/Passes.h"
20+
#include "flang/Support/OpenMP-utils.h"
2021
#include "mlir/Analysis/SliceAnalysis.h"
2122
#include "mlir/Dialect/Func/IR/FuncOps.h"
2223
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
@@ -42,41 +43,6 @@ namespace Fortran {
4243
namespace lower {
4344
namespace omp {
4445
namespace internal {
45-
// TODO The following 2 functions are copied from "flang/Lower/OpenMP/Utils.h".
46-
// This duplication is temporary until we find a solution for a shared location
47-
// for these utils that does not introduce circular CMake deps.
48-
mlir::omp::MapInfoOp createMapInfoOp(
49-
mlir::OpBuilder &builder, mlir::Location loc, mlir::Value baseAddr,
50-
mlir::Value varPtrPtr, std::string name, llvm::ArrayRef<mlir::Value> bounds,
51-
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
52-
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
53-
mlir::Type retTy, bool partialMap = false,
54-
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr()) {
55-
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
56-
baseAddr = builder.create<fir::BoxAddrOp>(loc, baseAddr);
57-
retTy = baseAddr.getType();
58-
}
59-
60-
mlir::TypeAttr varType = mlir::TypeAttr::get(
61-
llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType());
62-
63-
// For types with unknown extents such as <2x?xi32> we discard the incomplete
64-
// type info and only retain the base type. The correct dimensions are later
65-
// recovered through the bounds info.
66-
if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue()))
67-
if (seqType.hasDynamicExtents())
68-
varType = mlir::TypeAttr::get(seqType.getEleTy());
69-
70-
mlir::omp::MapInfoOp op = builder.create<mlir::omp::MapInfoOp>(
71-
loc, retTy, baseAddr, varType,
72-
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
73-
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
74-
varPtrPtr, members, membersIndex, bounds, mapperId,
75-
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
76-
77-
return op;
78-
}
79-
8046
mlir::Value mapTemporaryValue(fir::FirOpBuilder &builder,
8147
mlir::omp::TargetOp targetOp, mlir::Value val,
8248
llvm::StringRef name) {
@@ -87,7 +53,7 @@ mlir::Value mapTemporaryValue(fir::FirOpBuilder &builder,
8753

8854
llvm::SmallVector<mlir::Value> bounds;
8955
builder.setInsertionPoint(targetOp);
90-
mlir::Value mapOp = createMapInfoOp(
56+
mlir::Value mapOp = Fortran::common::openmp::createMapInfoOp(
9157
builder, copyVal.getLoc(), copyVal,
9258
/*varPtrPtr=*/mlir::Value{}, name.str(), bounds,
9359
/*members=*/llvm::SmallVector<mlir::Value>{},
@@ -649,7 +615,7 @@ class DoConcurrentConversion
649615
llvm::SmallVector<mlir::Value> boundsOps;
650616
genBoundsOps(builder, liveIn, rawAddr, boundsOps);
651617

652-
return Fortran::lower::omp::internal::createMapInfoOp(
618+
return Fortran::common::openmp::createMapInfoOp(
653619
builder, liveIn.getLoc(), rawAddr,
654620
/*varPtrPtr=*/{}, name.str(), boundsOps,
655621
/*members=*/{},

flang/lib/Support/OpenMP-utils.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "flang/Support/OpenMP-utils.h"
1010

11+
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
1112
#include "mlir/IR/OpDefinition.h"
1213

1314
namespace Fortran::common::openmp {
@@ -47,4 +48,35 @@ mlir::Block *genEntryBlock(mlir::OpBuilder &builder, const EntryBlockArgs &args,
4748

4849
return builder.createBlock(&region, {}, types, locs);
4950
}
51+
52+
mlir::omp::MapInfoOp createMapInfoOp(mlir::OpBuilder &builder,
53+
mlir::Location loc, mlir::Value baseAddr, mlir::Value varPtrPtr,
54+
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
55+
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
56+
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
57+
mlir::Type retTy, bool partialMap, mlir::FlatSymbolRefAttr mapperId) {
58+
59+
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
60+
baseAddr = builder.create<fir::BoxAddrOp>(loc, baseAddr);
61+
retTy = baseAddr.getType();
62+
}
63+
64+
mlir::TypeAttr varType = mlir::TypeAttr::get(
65+
llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType());
66+
67+
// For types with unknown extents such as <2x?xi32> we discard the incomplete
68+
// type info and only retain the base type. The correct dimensions are later
69+
// recovered through the bounds info.
70+
if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue()))
71+
if (seqType.hasDynamicExtents())
72+
varType = mlir::TypeAttr::get(seqType.getEleTy());
73+
74+
mlir::omp::MapInfoOp op =
75+
builder.create<mlir::omp::MapInfoOp>(loc, retTy, baseAddr, varType,
76+
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
77+
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
78+
varPtrPtr, members, membersIndex, bounds, mapperId,
79+
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
80+
return op;
81+
}
5082
} // namespace Fortran::common::openmp

0 commit comments

Comments
 (0)