FLANG
CUFAttr.h
1//===-- Optimizer/Dialect/CUF/Attributes/CUFAttr.h -- CUF attributes ------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
14#define FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
15
16#include "flang/Support/Fortran.h"
17#include "mlir/IR/BuiltinAttributes.h"
18#include "mlir/IR/Operation.h"
19#include <optional>
20
21namespace llvm {
22class StringRef;
23}
24
25namespace mlir {
26class Operation;
27}
28
29#include "flang/Optimizer/Dialect/CUF/Attributes/CUFEnumAttr.h.inc"
30
31#define GET_ATTRDEF_CLASSES
32#include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h.inc"
33
34namespace cuf {
35
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";
43}
45inline void setDeviceCopyOf(mlir::Operation *copy, llvm::StringRef original) {
46 copy->setAttr(getDeviceCopyOfAttrName(),
47 mlir::FlatSymbolRefAttr::get(copy->getContext(), original));
48}
49
50inline std::optional<llvm::StringRef> getDeviceCopyOf(mlir::Operation *op) {
51 if (auto ref =
52 op->getAttrOfType<mlir::FlatSymbolRefAttr>(getDeviceCopyOfAttrName()))
53 return ref.getValue();
54 return std::nullopt;
55}
56
58static constexpr llvm::StringRef getLaunchBoundsAttrName() {
59 return "cuf.launch_bounds";
60}
61
63static constexpr llvm::StringRef getClusterDimsAttrName() {
64 return "cuf.cluster_dims";
65}
66
67inline cuf::DataAttributeAttr
68getDataAttribute(mlir::MLIRContext *mlirContext,
69 std::optional<Fortran::common::CUDADataAttr> cudaAttr) {
70 if (cudaAttr) {
71 cuf::DataAttribute attr;
72 switch (*cudaAttr) {
73 case Fortran::common::CUDADataAttr::Constant:
74 attr = cuf::DataAttribute::Constant;
75 break;
76 case Fortran::common::CUDADataAttr::Device:
77 attr = cuf::DataAttribute::Device;
78 break;
79 case Fortran::common::CUDADataAttr::Managed:
80 attr = cuf::DataAttribute::Managed;
81 break;
82 case Fortran::common::CUDADataAttr::Pinned:
83 attr = cuf::DataAttribute::Pinned;
84 break;
85 case Fortran::common::CUDADataAttr::Shared:
86 attr = cuf::DataAttribute::Shared;
87 break;
88 case Fortran::common::CUDADataAttr::Texture:
89 // Obsolete attribute
90 return {};
91 case Fortran::common::CUDADataAttr::Unified:
92 attr = cuf::DataAttribute::Unified;
93 break;
94 case Fortran::common::CUDADataAttr::UseDevice:
95 attr = cuf::DataAttribute::Device;
96 break;
97 case Fortran::common::CUDADataAttr::Value:
98 return {}; // Extension, not a real CUDA Fortran data attribute
99 }
100 return cuf::DataAttributeAttr::get(mlirContext, attr);
101 }
102 return {};
103}
104
105inline cuf::ProcAttributeAttr
106getProcAttribute(mlir::MLIRContext *mlirContext,
107 std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr) {
108 if (cudaAttr) {
109 cuf::ProcAttribute attr;
110 switch (*cudaAttr) {
111 case Fortran::common::CUDASubprogramAttrs::Host:
112 attr = cuf::ProcAttribute::Host;
113 break;
114 case Fortran::common::CUDASubprogramAttrs::Device:
115 attr = cuf::ProcAttribute::Device;
116 break;
117 case Fortran::common::CUDASubprogramAttrs::HostDevice:
118 attr = cuf::ProcAttribute::HostDevice;
119 break;
120 case Fortran::common::CUDASubprogramAttrs::Global:
121 attr = cuf::ProcAttribute::Global;
122 break;
123 case Fortran::common::CUDASubprogramAttrs::Grid_Global:
124 attr = cuf::ProcAttribute::GridGlobal;
125 break;
126 }
127 return cuf::ProcAttributeAttr::get(mlirContext, attr);
128 }
129 return {};
130}
131
133cuf::DataAttributeAttr getDataAttr(mlir::Operation *op);
134
136bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value);
137
140bool isDeviceDataAttribute(cuf::DataAttribute attr);
141
144bool hasDeviceDataAttr(mlir::Operation *op);
145
150bool isManagedOrUnifiedDataAttribute(cuf::DataAttribute attr);
151
154bool hasManagedOrUnifiedDataAttr(mlir::Operation *op);
155
156} // namespace cuf
157
158#endif // FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
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