xref: /llvm-project/flang/include/flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h (revision 45daa4fdc68f5faa5bd5c33da052d2415cd88540)
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/Common/Fortran.h"
17 #include "mlir/IR/BuiltinAttributes.h"
18 
19 namespace llvm {
20 class StringRef;
21 }
22 
23 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFEnumAttr.h.inc"
24 
25 #define GET_ATTRDEF_CLASSES
26 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h.inc"
27 
28 namespace cuf {
29 
30 /// Attribute to mark Fortran entities with the CUDA attribute.
getDataAttrName()31 static constexpr llvm::StringRef getDataAttrName() { return "cuf.data_attr"; }
getProcAttrName()32 static constexpr llvm::StringRef getProcAttrName() { return "cuf.proc_attr"; }
33 
34 /// Attribute to carry CUDA launch_bounds values.
getLaunchBoundsAttrName()35 static constexpr llvm::StringRef getLaunchBoundsAttrName() {
36   return "cuf.launch_bounds";
37 }
38 
39 /// Attribute to carry CUDA cluster_dims values.
getClusterDimsAttrName()40 static constexpr llvm::StringRef getClusterDimsAttrName() {
41   return "cuf.cluster_dims";
42 }
43 
44 inline cuf::DataAttributeAttr
getDataAttribute(mlir::MLIRContext * mlirContext,std::optional<Fortran::common::CUDADataAttr> cudaAttr)45 getDataAttribute(mlir::MLIRContext *mlirContext,
46                  std::optional<Fortran::common::CUDADataAttr> cudaAttr) {
47   if (cudaAttr) {
48     cuf::DataAttribute attr;
49     switch (*cudaAttr) {
50     case Fortran::common::CUDADataAttr::Constant:
51       attr = cuf::DataAttribute::Constant;
52       break;
53     case Fortran::common::CUDADataAttr::Device:
54       attr = cuf::DataAttribute::Device;
55       break;
56     case Fortran::common::CUDADataAttr::Managed:
57       attr = cuf::DataAttribute::Managed;
58       break;
59     case Fortran::common::CUDADataAttr::Pinned:
60       attr = cuf::DataAttribute::Pinned;
61       break;
62     case Fortran::common::CUDADataAttr::Shared:
63       attr = cuf::DataAttribute::Shared;
64       break;
65     case Fortran::common::CUDADataAttr::Texture:
66       // Obsolete attribute
67       return {};
68     case Fortran::common::CUDADataAttr::Unified:
69       attr = cuf::DataAttribute::Unified;
70       break;
71     }
72     return cuf::DataAttributeAttr::get(mlirContext, attr);
73   }
74   return {};
75 }
76 
77 inline cuf::ProcAttributeAttr
getProcAttribute(mlir::MLIRContext * mlirContext,std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr)78 getProcAttribute(mlir::MLIRContext *mlirContext,
79                  std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr) {
80   if (cudaAttr) {
81     cuf::ProcAttribute attr;
82     switch (*cudaAttr) {
83     case Fortran::common::CUDASubprogramAttrs::Host:
84       attr = cuf::ProcAttribute::Host;
85       break;
86     case Fortran::common::CUDASubprogramAttrs::Device:
87       attr = cuf::ProcAttribute::Device;
88       break;
89     case Fortran::common::CUDASubprogramAttrs::HostDevice:
90       attr = cuf::ProcAttribute::HostDevice;
91       break;
92     case Fortran::common::CUDASubprogramAttrs::Global:
93       attr = cuf::ProcAttribute::Global;
94       break;
95     case Fortran::common::CUDASubprogramAttrs::Grid_Global:
96       attr = cuf::ProcAttribute::GridGlobal;
97       break;
98     }
99     return cuf::ProcAttributeAttr::get(mlirContext, attr);
100   }
101   return {};
102 }
103 
104 } // namespace cuf
105 
106 #endif // FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
107