diff --git a/flang/include/flang/Optimizer/OpenMP/Utils.h b/flang/include/flang/Optimizer/OpenMP/Utils.h index 636c768b016b7..235e667130659 100644 --- a/flang/include/flang/Optimizer/OpenMP/Utils.h +++ b/flang/include/flang/Optimizer/OpenMP/Utils.h @@ -13,6 +13,17 @@ #ifndef FORTRAN_OPTIMIZER_OPENMP_UTILS_H #define FORTRAN_OPTIMIZER_OPENMP_UTILS_H +#include "flang/Optimizer/Builder/BoxValue.h" +#include "flang/Optimizer/Builder/DirectivesCommon.h" +#include "flang/Optimizer/Builder/FIRBuilder.h" +#include "flang/Optimizer/Builder/HLFIRTools.h" +#include "flang/Optimizer/Dialect/FIRType.h" + +#include "mlir/Dialect/OpenMP/OpenMPDialect.h" +#include "mlir/IR/Value.h" + +#include "llvm/ADT/SmallVector.h" + namespace flangomp { enum class DoConcurrentMappingKind { @@ -21,6 +32,35 @@ enum class DoConcurrentMappingKind { DCMK_Device ///< Lower to run in parallel on the GPU. }; +/// Return true if the variable has a dynamic size and therefore requires +/// bounds operations to describe its extents. +inline bool needsBoundsOps(mlir::Value var) { + assert(mlir::isa(var.getType()) && + "needsBoundsOps can deal only with pointer types"); + mlir::Type t = fir::unwrapRefType(var.getType()); + if (mlir::Type inner = fir::dyn_cast_ptrOrBoxEleTy(t)) + return fir::hasDynamicSize(inner); + return fir::hasDynamicSize(t); +} + +/// Generate MapBoundsOp operations for the variable and append them to +/// `boundsOps`. +inline llvm::SmallVector genBoundsOps(fir::FirOpBuilder &builder, + mlir::Value var, + bool isAssumedSize = false, + bool isOptional = false) { + mlir::Location loc = var.getLoc(); + fir::factory::AddrAndBoundsInfo info = + fir::factory::getDataOperandBaseAddr(builder, var, isOptional, loc); + fir::ExtendedValue exv = + hlfir::translateToExtendedValue(loc, builder, hlfir::Entity{info.addr}, + /*contiguousHint=*/true) + .first; + return fir::factory::genImplicitBoundsOps( + builder, info, exv, isAssumedSize, loc); +} + } // namespace flangomp #endif // FORTRAN_OPTIMIZER_OPENMP_UTILS_H diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index def6cfff88231..add9326f665c2 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -30,6 +30,7 @@ #include "flang/Optimizer/Builder/Todo.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/HLFIR/HLFIROps.h" +#include "flang/Optimizer/OpenMP/Utils.h" #include "flang/Parser/characters.h" #include "flang/Parser/openmp-utils.h" #include "flang/Parser/parse-tree.h" @@ -2495,12 +2496,10 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable, Fortran::lower::getDataOperandBaseAddr( converter, firOpBuilder, sym.GetUltimate(), converter.getCurrentLocation()); - llvm::SmallVector bounds = - fir::factory::genImplicitBoundsOps( - firOpBuilder, info, dataExv, - semantics::IsAssumedSizeArray(sym.GetUltimate()), - converter.getCurrentLocation()); + llvm::SmallVector bounds = flangomp::genBoundsOps( + firOpBuilder, info.rawInput, + semantics::IsAssumedSizeArray(sym.GetUltimate()), + semantics::IsOptional(sym.GetUltimate())); mlir::Value baseOp = info.rawInput; mlir::Type eleType = baseOp.getType(); if (auto refType = mlir::dyn_cast(baseOp.getType())) diff --git a/flang/lib/Optimizer/Builder/CMakeLists.txt b/flang/lib/Optimizer/Builder/CMakeLists.txt index 404afd185fd31..3a42c32a12f3c 100644 --- a/flang/lib/Optimizer/Builder/CMakeLists.txt +++ b/flang/lib/Optimizer/Builder/CMakeLists.txt @@ -2,7 +2,6 @@ get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) get_property(extension_libs GLOBAL PROPERTY MLIR_EXTENSION_LIBS) add_flang_library(FIRBuilder - BoxValue.cpp Character.cpp Complex.cpp CUFCommon.cpp diff --git a/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp b/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp index 8b9991301aae8..d4be315c167be 100644 --- a/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp +++ b/flang/lib/Optimizer/OpenMP/AutomapToTargetData.cpp @@ -13,6 +13,7 @@ #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/Dialect/Support/KindMapping.h" #include "flang/Optimizer/HLFIR/HLFIROps.h" +#include "flang/Optimizer/OpenMP/Utils.h" #include "mlir/Dialect/OpenMP/OpenMPDialect.h" #include "mlir/Dialect/OpenMP/OpenMPInterfaces.h" @@ -33,36 +34,6 @@ namespace { class AutomapToTargetDataPass : public flangomp::impl::AutomapToTargetDataPassBase< AutomapToTargetDataPass> { - - // Returns true if the variable has a dynamic size and therefore requires - // bounds operations to describe its extents. - inline bool needsBoundsOps(mlir::Value var) { - assert(mlir::isa(var.getType()) && - "only pointer like types expected"); - mlir::Type t = fir::unwrapRefType(var.getType()); - if (mlir::Type inner = fir::dyn_cast_ptrOrBoxEleTy(t)) - return fir::hasDynamicSize(inner); - return fir::hasDynamicSize(t); - } - - // Generate MapBoundsOp operations for the variable if required. - inline void genBoundsOps(fir::FirOpBuilder &builder, mlir::Value var, - llvm::SmallVectorImpl &boundsOps) { - mlir::Location loc = var.getLoc(); - fir::factory::AddrAndBoundsInfo info = - fir::factory::getDataOperandBaseAddr(builder, var, - /*isOptional=*/false, loc); - fir::ExtendedValue exv = - hlfir::translateToExtendedValue(loc, builder, hlfir::Entity{info.addr}, - /*contiguousHint=*/true) - .first; - llvm::SmallVector tmp = - fir::factory::genImplicitBoundsOps( - builder, info, exv, /*dataExvIsAssumedSize=*/false, loc); - llvm::append_range(boundsOps, tmp); - } - void findRelatedAllocmemFreemem(fir::AddrOfOp addressOfOp, llvm::DenseSet &allocmems, llvm::DenseSet &freemems) { @@ -112,8 +83,8 @@ class AutomapToTargetDataPass auto addMapInfo = [&](auto globalOp, auto memOp) { builder.setInsertionPointAfter(memOp); SmallVector bounds; - if (needsBoundsOps(memOp.getMemref())) - genBoundsOps(builder, memOp.getMemref(), bounds); + if (flangomp::needsBoundsOps(memOp.getMemref())) + bounds = flangomp::genBoundsOps(builder, memOp.getMemref()); omp::TargetEnterExitUpdateDataOperands clauses; mlir::omp::MapInfoOp mapInfo = mlir::omp::MapInfoOp::create( diff --git a/flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp b/flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp index 30328573b74fc..5c1a3d232a8c9 100644 --- a/flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp +++ b/flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp @@ -29,6 +29,7 @@ #include "flang/Optimizer/Dialect/Support/KindMapping.h" #include "flang/Optimizer/HLFIR/HLFIROps.h" #include "flang/Optimizer/OpenMP/Passes.h" +#include "flang/Optimizer/OpenMP/Utils.h" #include "mlir/Dialect/Func/IR/FuncOps.h" #include "mlir/Dialect/OpenMP/OpenMPDialect.h" @@ -106,8 +107,8 @@ class MapsForPrivatizedSymbolsPass // Figure out the bounds because knowing the bounds will help the subsequent // MapInfoFinalizationPass map the underlying data of the descriptor. llvm::SmallVector boundsOps; - if (needsBoundsOps(varPtr)) - genBoundsOps(builder, varPtr, boundsOps); + if (flangomp::needsBoundsOps(varPtr)) + boundsOps = flangomp::genBoundsOps(builder, varPtr); mlir::omp::VariableCaptureKind captureKind = mlir::omp::VariableCaptureKind::ByRef; @@ -194,38 +195,5 @@ class MapsForPrivatizedSymbolsPass } } } - // As the name suggests, this function examines var to determine if - // it has dynamic size. If true, this pass'll have to extract these - // bounds from descriptor of var and add the bounds to the resultant - // MapInfoOp. - bool needsBoundsOps(mlir::Value var) { - assert(mlir::isa(var.getType()) && - "needsBoundsOps can deal only with pointer types"); - mlir::Type t = fir::unwrapRefType(var.getType()); - // t could be a box, so look inside the box - auto innerType = fir::dyn_cast_ptrOrBoxEleTy(t); - if (innerType) - return fir::hasDynamicSize(innerType); - return fir::hasDynamicSize(t); - } - - void genBoundsOps(fir::FirOpBuilder &builder, mlir::Value var, - llvm::SmallVector &boundsOps) { - mlir::Location loc = var.getLoc(); - fir::factory::AddrAndBoundsInfo info = - fir::factory::getDataOperandBaseAddr(builder, var, - /*isOptional=*/false, loc); - fir::ExtendedValue extendedValue = - hlfir::translateToExtendedValue(loc, builder, hlfir::Entity{info.addr}, - /*continguousHint=*/true) - .first; - llvm::SmallVector boundsOpsVec = - fir::factory::genImplicitBoundsOps( - builder, info, extendedValue, - /*dataExvIsAssumedSize=*/false, loc); - for (auto bounds : boundsOpsVec) - boundsOps.push_back(bounds); - } }; } // namespace diff --git a/flang/lib/Optimizer/Builder/BoxValue.cpp b/flang/lib/Optimizer/Support/BoxValue.cpp similarity index 99% rename from flang/lib/Optimizer/Builder/BoxValue.cpp rename to flang/lib/Optimizer/Support/BoxValue.cpp index a90ce5570de7d..2d814e6627599 100644 --- a/flang/lib/Optimizer/Builder/BoxValue.cpp +++ b/flang/lib/Optimizer/Support/BoxValue.cpp @@ -11,7 +11,6 @@ //===----------------------------------------------------------------------===// #include "flang/Optimizer/Builder/BoxValue.h" -#include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Builder/Todo.h" #include "mlir/IR/BuiltinTypes.h" #include "llvm/Support/Debug.h" diff --git a/flang/lib/Optimizer/Support/CMakeLists.txt b/flang/lib/Optimizer/Support/CMakeLists.txt index 38038e1e9821d..825cf35173cc2 100644 --- a/flang/lib/Optimizer/Support/CMakeLists.txt +++ b/flang/lib/Optimizer/Support/CMakeLists.txt @@ -1,4 +1,5 @@ add_flang_library(FIRSupport + BoxValue.cpp DataLayout.cpp InitFIR.cpp InternalNames.cpp