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
19namespace llvm {
20class StringRef;
21}
22
23namespace mlir {
24class Operation;
25}
26
27#include "flang/Optimizer/Dialect/CUF/Attributes/CUFEnumAttr.h.inc"
28
29#define GET_ATTRDEF_CLASSES
30#include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h.inc"
31
32namespace cuf {
33
35static constexpr llvm::StringRef dataAttrName = "data_attr";
36static constexpr llvm::StringRef getDataAttrName() { return "cuf.data_attr"; }
37static constexpr llvm::StringRef getProcAttrName() { return "cuf.proc_attr"; }
38
40static constexpr llvm::StringRef getLaunchBoundsAttrName() {
41 return "cuf.launch_bounds";
42}
43
45static constexpr llvm::StringRef getClusterDimsAttrName() {
46 return "cuf.cluster_dims";
47}
48
49inline cuf::DataAttributeAttr
50getDataAttribute(mlir::MLIRContext *mlirContext,
51 std::optional<Fortran::common::CUDADataAttr> cudaAttr) {
52 if (cudaAttr) {
53 cuf::DataAttribute attr;
54 switch (*cudaAttr) {
55 case Fortran::common::CUDADataAttr::Constant:
56 attr = cuf::DataAttribute::Constant;
57 break;
58 case Fortran::common::CUDADataAttr::Device:
59 attr = cuf::DataAttribute::Device;
60 break;
61 case Fortran::common::CUDADataAttr::Managed:
62 attr = cuf::DataAttribute::Managed;
63 break;
64 case Fortran::common::CUDADataAttr::Pinned:
65 attr = cuf::DataAttribute::Pinned;
66 break;
67 case Fortran::common::CUDADataAttr::Shared:
68 attr = cuf::DataAttribute::Shared;
69 break;
70 case Fortran::common::CUDADataAttr::Texture:
71 // Obsolete attribute
72 return {};
73 case Fortran::common::CUDADataAttr::Unified:
74 attr = cuf::DataAttribute::Unified;
75 break;
76 }
77 return cuf::DataAttributeAttr::get(mlirContext, attr);
78 }
79 return {};
80}
81
82inline cuf::ProcAttributeAttr
83getProcAttribute(mlir::MLIRContext *mlirContext,
84 std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr) {
85 if (cudaAttr) {
86 cuf::ProcAttribute attr;
87 switch (*cudaAttr) {
88 case Fortran::common::CUDASubprogramAttrs::Host:
89 attr = cuf::ProcAttribute::Host;
90 break;
91 case Fortran::common::CUDASubprogramAttrs::Device:
92 attr = cuf::ProcAttribute::Device;
93 break;
94 case Fortran::common::CUDASubprogramAttrs::HostDevice:
95 attr = cuf::ProcAttribute::HostDevice;
96 break;
97 case Fortran::common::CUDASubprogramAttrs::Global:
98 attr = cuf::ProcAttribute::Global;
99 break;
100 case Fortran::common::CUDASubprogramAttrs::Grid_Global:
101 attr = cuf::ProcAttribute::GridGlobal;
102 break;
103 }
104 return cuf::ProcAttributeAttr::get(mlirContext, attr);
105 }
106 return {};
107}
108
110cuf::DataAttributeAttr getDataAttr(mlir::Operation *op);
111
113bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value);
114
115} // namespace cuf
116
117#endif // FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H
Definition ConvertVariable.h:26
cuf::DataAttributeAttr getDataAttr(mlir::Operation *op)
Returns the data attribute if the operation has one.
Definition CUFAttr.cpp:33
bool hasDataAttr(mlir::Operation *op, cuf::DataAttribute value)
Returns true if the operation has a data attribute with the given value.
Definition CUFAttr.cpp:49
Definition AbstractConverter.h:29