13#ifndef FORTRAN_LOWER_CUDA_H
14#define FORTRAN_LOWER_CUDA_H
16#include "flang/Optimizer/Builder/FIRBuilder.h"
17#include "flang/Optimizer/Builder/MutableBox.h"
18#include "flang/Optimizer/Dialect/CUF/CUFOps.h"
19#include "flang/Runtime/allocator-registry-consts.h"
20#include "flang/Semantics/tools.h"
36static inline unsigned getAllocatorIdx(
const Fortran::semantics::Symbol &sym) {
37 std::optional<Fortran::common::CUDADataAttr> cudaAttr =
38 Fortran::semantics::GetCUDADataAttr(&sym.GetUltimate());
40 if (*cudaAttr == Fortran::common::CUDADataAttr::Pinned)
41 return kPinnedAllocatorPos;
42 if (*cudaAttr == Fortran::common::CUDADataAttr::Device)
43 return kDeviceAllocatorPos;
44 if (*cudaAttr == Fortran::common::CUDADataAttr::Managed)
45 return kManagedAllocatorPos;
46 if (*cudaAttr == Fortran::common::CUDADataAttr::Unified)
47 return kUnifiedAllocatorPos;
49 return kDefaultAllocator;
58getAllocatorIdxForUnified(
const Fortran::semantics::Symbol &sym,
59 bool unifiedEnabled) {
60 unsigned idx = getAllocatorIdx(sym);
61 if (unifiedEnabled && idx == kDefaultAllocator &&
62 (Fortran::semantics::IsAllocatable(sym) ||
63 Fortran::semantics::IsPointer(sym)))
64 return kUnifiedAllocatorPos;
68mlir::Type gatherDeviceComponentCoordinatesAndType(
69 fir::FirOpBuilder &builder, mlir::Location loc,
70 const Fortran::semantics::Symbol &sym, fir::RecordType recTy,
71 llvm::SmallVector<mlir::Value> &coordinates);
77 const Fortran::semantics::Symbol &sym);
81std::pair<hlfir::ElementalOp, hlfir::ElementalOp>
Definition AbstractConverter.h:87
Definition ParserActions.h:24
bool hasDoubleDescriptor(mlir::Value)
Check if the value is an allocatable with double descriptor.
Definition CUDA.cpp:117
std::pair< hlfir::ElementalOp, hlfir::ElementalOp > isTransferWithConversion(mlir::Value rhs)
Definition CUDA.cpp:72
cuf::DataAttributeAttr translateSymbolCUFDataAttribute(mlir::MLIRContext *mlirContext, const Fortran::semantics::Symbol &sym)
Definition CUDA.cpp:64
Definition AbstractConverter.h:32