[NFC][flang][OpenMP] Create FortranUtils lib and move createMapInfoOp to it (#154483)
This commit is contained in:
parent
82917c8c99
commit
86e4c175e3
33
flang/include/flang/Utils/OpenMP.h
Normal file
33
flang/include/flang/Utils/OpenMP.h
Normal file
@ -0,0 +1,33 @@
|
||||
//===-- include/flang/Utils/OpenMP.h ----------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef FORTRAN_UTILS_OPENMP_H_
|
||||
#define FORTRAN_UTILS_OPENMP_H_
|
||||
|
||||
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
|
||||
|
||||
namespace Fortran::utils::openmp {
|
||||
// TODO We can probably move the stuff inside `Support/OpenMP-utils.h/.cpp` here
|
||||
// as well.
|
||||
|
||||
/// Create an `omp.map.info` op. Parameters other than the ones documented below
|
||||
/// correspond to operation arguments in the OpenMPOps.td file, see op docs for
|
||||
/// more details.
|
||||
///
|
||||
/// \param [in] builder - MLIR operation builder.
|
||||
/// \param [in] loc - Source location of the created op.
|
||||
mlir::omp::MapInfoOp createMapInfoOp(mlir::OpBuilder &builder,
|
||||
mlir::Location loc, mlir::Value baseAddr, mlir::Value varPtrPtr,
|
||||
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
|
||||
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
|
||||
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
|
||||
mlir::Type retTy, bool partialMap = false,
|
||||
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr());
|
||||
} // namespace Fortran::utils::openmp
|
||||
|
||||
#endif // FORTRAN_UTILS_OPENMP_H_
|
||||
@ -6,6 +6,7 @@ add_subdirectory(Semantics)
|
||||
add_subdirectory(Support)
|
||||
add_subdirectory(Frontend)
|
||||
add_subdirectory(FrontendTool)
|
||||
add_subdirectory(Utils)
|
||||
|
||||
add_subdirectory(Optimizer)
|
||||
|
||||
|
||||
@ -60,6 +60,7 @@ add_flang_library(FortranLower
|
||||
FortranParser
|
||||
FortranEvaluate
|
||||
FortranSemantics
|
||||
FortranUtils
|
||||
|
||||
LINK_COMPONENTS
|
||||
Support
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
#include "flang/Lower/Support/ReductionProcessor.h"
|
||||
#include "flang/Parser/tools.h"
|
||||
#include "flang/Semantics/tools.h"
|
||||
#include "flang/Utils/OpenMP.h"
|
||||
#include "llvm/Frontend/OpenMP/OMP.h.inc"
|
||||
#include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
|
||||
|
||||
@ -1281,7 +1282,7 @@ void ClauseProcessor::processMapObjects(
|
||||
auto location = mlir::NameLoc::get(
|
||||
mlir::StringAttr::get(firOpBuilder.getContext(), asFortran.str()),
|
||||
baseOp.getLoc());
|
||||
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
|
||||
mlir::omp::MapInfoOp mapOp = utils::openmp::createMapInfoOp(
|
||||
firOpBuilder, location, baseOp,
|
||||
/*varPtrPtr=*/mlir::Value{}, asFortran.str(), bounds,
|
||||
/*members=*/{}, /*membersIndex=*/mlir::ArrayAttr{},
|
||||
|
||||
@ -38,6 +38,7 @@
|
||||
#include "flang/Semantics/tools.h"
|
||||
#include "flang/Support/Flags.h"
|
||||
#include "flang/Support/OpenMP-utils.h"
|
||||
#include "flang/Utils/OpenMP.h"
|
||||
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
|
||||
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
|
||||
#include "mlir/Support/StateStack.h"
|
||||
@ -47,6 +48,7 @@
|
||||
|
||||
using namespace Fortran::lower::omp;
|
||||
using namespace Fortran::common::openmp;
|
||||
using namespace Fortran::utils::openmp;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Code generation helper functions
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
#include <flang/Parser/parse-tree.h>
|
||||
#include <flang/Parser/tools.h>
|
||||
#include <flang/Semantics/tools.h>
|
||||
#include <flang/Utils/OpenMP.h>
|
||||
#include <llvm/Support/CommandLine.h>
|
||||
|
||||
#include <iterator>
|
||||
@ -108,38 +109,6 @@ void gatherFuncAndVarSyms(
|
||||
symbolAndClause.emplace_back(clause, *object.sym(), automap);
|
||||
}
|
||||
|
||||
mlir::omp::MapInfoOp
|
||||
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value baseAddr, mlir::Value varPtrPtr,
|
||||
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
|
||||
llvm::ArrayRef<mlir::Value> members,
|
||||
mlir::ArrayAttr membersIndex, uint64_t mapType,
|
||||
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
|
||||
bool partialMap, mlir::FlatSymbolRefAttr mapperId) {
|
||||
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
|
||||
baseAddr = fir::BoxAddrOp::create(builder, loc, baseAddr);
|
||||
retTy = baseAddr.getType();
|
||||
}
|
||||
|
||||
mlir::TypeAttr varType = mlir::TypeAttr::get(
|
||||
llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType());
|
||||
|
||||
// For types with unknown extents such as <2x?xi32> we discard the incomplete
|
||||
// type info and only retain the base type. The correct dimensions are later
|
||||
// recovered through the bounds info.
|
||||
if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue()))
|
||||
if (seqType.hasDynamicExtents())
|
||||
varType = mlir::TypeAttr::get(seqType.getEleTy());
|
||||
|
||||
mlir::omp::MapInfoOp op = mlir::omp::MapInfoOp::create(
|
||||
builder, loc, retTy, baseAddr, varType,
|
||||
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
|
||||
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
|
||||
varPtrPtr, members, membersIndex, bounds, mapperId,
|
||||
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
|
||||
return op;
|
||||
}
|
||||
|
||||
// This function gathers the individual omp::Object's that make up a
|
||||
// larger omp::Object symbol.
|
||||
//
|
||||
@ -403,7 +372,7 @@ mlir::Value createParentSymAndGenIntermediateMaps(
|
||||
|
||||
// Create a map for the intermediate member and insert it and it's
|
||||
// indices into the parentMemberIndices list to track it.
|
||||
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
|
||||
mlir::omp::MapInfoOp mapOp = utils::openmp::createMapInfoOp(
|
||||
firOpBuilder, clauseLocation, curValue,
|
||||
/*varPtrPtr=*/mlir::Value{}, asFortran,
|
||||
/*bounds=*/interimBounds,
|
||||
@ -563,7 +532,7 @@ void insertChildMapInfoIntoParent(
|
||||
converter.getCurrentLocation(), asFortran, bounds,
|
||||
treatIndexAsSection);
|
||||
|
||||
mlir::omp::MapInfoOp mapOp = createMapInfoOp(
|
||||
mlir::omp::MapInfoOp mapOp = utils::openmp::createMapInfoOp(
|
||||
firOpBuilder, info.rawInput.getLoc(), info.rawInput,
|
||||
/*varPtrPtr=*/mlir::Value(), asFortran.str(), bounds, members,
|
||||
firOpBuilder.create2DI64ArrayAttr(
|
||||
|
||||
@ -114,16 +114,6 @@ struct OmpMapParentAndMemberData {
|
||||
semantics::SemanticsContext &semaCtx);
|
||||
};
|
||||
|
||||
mlir::omp::MapInfoOp
|
||||
createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc,
|
||||
mlir::Value baseAddr, mlir::Value varPtrPtr,
|
||||
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
|
||||
llvm::ArrayRef<mlir::Value> members,
|
||||
mlir::ArrayAttr membersIndex, uint64_t mapType,
|
||||
mlir::omp::VariableCaptureKind mapCaptureType, mlir::Type retTy,
|
||||
bool partialMap = false,
|
||||
mlir::FlatSymbolRefAttr mapperId = mlir::FlatSymbolRefAttr());
|
||||
|
||||
void insertChildMapInfoIntoParent(
|
||||
Fortran::lower::AbstractConverter &converter,
|
||||
Fortran::semantics::SemanticsContext &semaCtx,
|
||||
|
||||
@ -53,6 +53,7 @@ class MapsForPrivatizedSymbolsPass
|
||||
: public flangomp::impl::MapsForPrivatizedSymbolsPassBase<
|
||||
MapsForPrivatizedSymbolsPass> {
|
||||
|
||||
// TODO Use `createMapInfoOp` from `flang/Utils/OpenMP.h`.
|
||||
omp::MapInfoOp createMapInfo(Location loc, Value var,
|
||||
fir::FirOpBuilder &builder) {
|
||||
// Check if a value of type `type` can be passed to the kernel by value.
|
||||
|
||||
20
flang/lib/Utils/CMakeLists.txt
Normal file
20
flang/lib/Utils/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
||||
#===-- lib/Utils/CMakeLists.txt --------------------------------------------===#
|
||||
#
|
||||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
#
|
||||
#===------------------------------------------------------------------------===#
|
||||
|
||||
add_flang_library(FortranUtils
|
||||
OpenMP.cpp
|
||||
|
||||
DEPENDS
|
||||
FIRDialect
|
||||
|
||||
LINK_LIBS
|
||||
FIRDialect
|
||||
|
||||
MLIR_LIBS
|
||||
MLIROpenMPDialect
|
||||
)
|
||||
47
flang/lib/Utils/OpenMP.cpp
Normal file
47
flang/lib/Utils/OpenMP.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
//===-- lib/Utisl/OpenMP.cpp ------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "flang/Utils/OpenMP.h"
|
||||
|
||||
#include "flang/Optimizer/Dialect/FIROps.h"
|
||||
#include "flang/Optimizer/Dialect/FIRType.h"
|
||||
|
||||
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
|
||||
|
||||
namespace Fortran::utils::openmp {
|
||||
mlir::omp::MapInfoOp createMapInfoOp(mlir::OpBuilder &builder,
|
||||
mlir::Location loc, mlir::Value baseAddr, mlir::Value varPtrPtr,
|
||||
llvm::StringRef name, llvm::ArrayRef<mlir::Value> bounds,
|
||||
llvm::ArrayRef<mlir::Value> members, mlir::ArrayAttr membersIndex,
|
||||
uint64_t mapType, mlir::omp::VariableCaptureKind mapCaptureType,
|
||||
mlir::Type retTy, bool partialMap, mlir::FlatSymbolRefAttr mapperId) {
|
||||
|
||||
if (auto boxTy = llvm::dyn_cast<fir::BaseBoxType>(baseAddr.getType())) {
|
||||
baseAddr = fir::BoxAddrOp::create(builder, loc, baseAddr);
|
||||
retTy = baseAddr.getType();
|
||||
}
|
||||
|
||||
mlir::TypeAttr varType = mlir::TypeAttr::get(
|
||||
llvm::cast<mlir::omp::PointerLikeType>(retTy).getElementType());
|
||||
|
||||
// For types with unknown extents such as <2x?xi32> we discard the incomplete
|
||||
// type info and only retain the base type. The correct dimensions are later
|
||||
// recovered through the bounds info.
|
||||
if (auto seqType = llvm::dyn_cast<fir::SequenceType>(varType.getValue()))
|
||||
if (seqType.hasDynamicExtents())
|
||||
varType = mlir::TypeAttr::get(seqType.getEleTy());
|
||||
|
||||
mlir::omp::MapInfoOp op =
|
||||
mlir::omp::MapInfoOp::create(builder, loc, retTy, baseAddr, varType,
|
||||
builder.getIntegerAttr(builder.getIntegerType(64, false), mapType),
|
||||
builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType),
|
||||
varPtrPtr, members, membersIndex, bounds, mapperId,
|
||||
builder.getStringAttr(name), builder.getBoolAttr(partialMap));
|
||||
return op;
|
||||
}
|
||||
} // namespace Fortran::utils::openmp
|
||||
Loading…
x
Reference in New Issue
Block a user