13#ifndef FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
14#define FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
16#include "flang/Support/Fortran.h"
17#include "mlir/IR/BuiltinAttributes.h"
18#include "mlir/IR/Operation.h"
29#include "flang/Optimizer/Dialect/CUF/Attributes/CUFEnumAttr.h.inc"
31#define GET_ATTRDEF_CLASSES
32#include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h.inc"
37static constexpr llvm::StringRef dataAttrName =
"data_attr";
38static constexpr llvm::StringRef getDataAttrName() {
return "cuf.data_attr"; }
39static constexpr llvm::StringRef getProcAttrName() {
return "cuf.proc_attr"; }
41static constexpr llvm::StringRef getDeviceCopyOfAttrName() {
42 return "cuf.device_copy_of";
46 copy->setAttr(getDeviceCopyOfAttrName(),
47 mlir::FlatSymbolRefAttr::get(copy->getContext(), original));
52 op->getAttrOfType<mlir::FlatSymbolRefAttr>(getDeviceCopyOfAttrName()))
53 return ref.getValue();
58static constexpr llvm::StringRef getLaunchBoundsAttrName() {
59 return "cuf.launch_bounds";
63static constexpr llvm::StringRef getClusterDimsAttrName() {
64 return "cuf.cluster_dims";
67inline cuf::DataAttributeAttr
68getDataAttribute(mlir::MLIRContext *mlirContext,
69 std::optional<Fortran::common::CUDADataAttr> cudaAttr) {
71 cuf::DataAttribute attr;
73 case Fortran::common::CUDADataAttr::Constant:
74 attr = cuf::DataAttribute::Constant;
76 case Fortran::common::CUDADataAttr::Device:
77 attr = cuf::DataAttribute::Device;
79 case Fortran::common::CUDADataAttr::Managed:
80 attr = cuf::DataAttribute::Managed;
82 case Fortran::common::CUDADataAttr::Pinned:
83 attr = cuf::DataAttribute::Pinned;
85 case Fortran::common::CUDADataAttr::Shared:
86 attr = cuf::DataAttribute::Shared;
88 case Fortran::common::CUDADataAttr::Texture:
91 case Fortran::common::CUDADataAttr::Unified:
92 attr = cuf::DataAttribute::Unified;
94 case Fortran::common::CUDADataAttr::UseDevice:
95 attr = cuf::DataAttribute::Device;
97 case Fortran::common::CUDADataAttr::Value:
100 return cuf::DataAttributeAttr::get(mlirContext, attr);
105inline cuf::ProcAttributeAttr
106getProcAttribute(mlir::MLIRContext *mlirContext,
107 std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr) {
109 cuf::ProcAttribute attr;
111 case Fortran::common::CUDASubprogramAttrs::Host:
112 attr = cuf::ProcAttribute::Host;
114 case Fortran::common::CUDASubprogramAttrs::Device:
115 attr = cuf::ProcAttribute::Device;
117 case Fortran::common::CUDASubprogramAttrs::HostDevice:
118 attr = cuf::ProcAttribute::HostDevice;
120 case Fortran::common::CUDASubprogramAttrs::Global:
121 attr = cuf::ProcAttribute::Global;
123 case Fortran::common::CUDASubprogramAttrs::Grid_Global:
124 attr = cuf::ProcAttribute::GridGlobal;
127 return cuf::ProcAttributeAttr::get(mlirContext, attr);
133cuf::DataAttributeAttr
getDataAttr(mlir::Operation *op);
136bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value);
Definition ConvertVariable.h:28
cuf::DataAttributeAttr getDataAttr(mlir::Operation *op)
Returns the data attribute if the operation has one.
Definition CUFAttr.cpp:32
void setDeviceCopyOf(mlir::Operation *copy, llvm::StringRef original)
Mark copy as the device copy of the procedure named original.
Definition CUFAttr.h:45
bool hasDeviceDataAttr(mlir::Operation *op)
Definition CUFAttr.cpp:62
bool isManagedOrUnifiedDataAttribute(cuf::DataAttribute attr)
Definition CUFAttr.cpp:68
std::optional< llvm::StringRef > getDeviceCopyOf(mlir::Operation *op)
The name of the procedure op is the device copy of, if it is one.
Definition CUFAttr.h:50
bool hasManagedOrUnifiedDataAttr(mlir::Operation *op)
Definition CUFAttr.cpp:73
bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value)
Returns true if the operation has a data attribute with the given value.
Definition CUFAttr.cpp:48
bool isDeviceDataAttribute(cuf::DataAttribute attr)
Definition CUFAttr.cpp:54
Definition AbstractConverter.h:32