FLANG
FIROpenACCTypeInterfaces.h
1//===- FIROpenACCTypeInterfaces.h -------------------------------*- C++ -*-===//
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// This file contains external dialect interfaces for FIR.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef FLANG_OPTIMIZER_OPENACC_FIROPENACCTYPEINTERFACES_H_
14#define FLANG_OPTIMIZER_OPENACC_FIROPENACCTYPEINTERFACES_H_
15
16#include "flang/Optimizer/Dialect/FIRType.h"
17#include "mlir/Dialect/OpenACC/OpenACC.h"
18
19namespace fir::acc {
20
21template <typename T>
23 : public mlir::acc::PointerLikeType::ExternalModel<
24 OpenACCPointerLikeModel<T>, T> {
25 mlir::Type getElementType(mlir::Type pointer) const {
26 return mlir::cast<T>(pointer).getElementType();
27 }
28 mlir::acc::VariableTypeCategory
29 getPointeeTypeCategory(mlir::Type pointer,
30 mlir::TypedValue<mlir::acc::PointerLikeType> varPtr,
31 mlir::Type varType) const;
32
33 mlir::Value genAllocate(mlir::Type pointer, mlir::OpBuilder &builder,
34 mlir::Location loc, llvm::StringRef varName,
35 mlir::Type varType, mlir::Value originalVar,
36 bool &needsFree) const;
37
38 bool genFree(mlir::Type pointer, mlir::OpBuilder &builder, mlir::Location loc,
39 mlir::TypedValue<mlir::acc::PointerLikeType> varToFree,
40 mlir::Value allocRes, mlir::Type varType) const;
41
42 bool genCopy(mlir::Type pointer, mlir::OpBuilder &builder, mlir::Location loc,
43 mlir::TypedValue<mlir::acc::PointerLikeType> destination,
44 mlir::TypedValue<mlir::acc::PointerLikeType> source,
45 mlir::Type varType) const;
46
47 mlir::Value genLoad(mlir::Type pointer, mlir::OpBuilder &builder,
48 mlir::Location loc,
49 mlir::TypedValue<mlir::acc::PointerLikeType> srcPtr,
50 mlir::Type valueType) const;
51
52 bool genStore(mlir::Type pointer, mlir::OpBuilder &builder,
53 mlir::Location loc, mlir::Value valueToStore,
54 mlir::TypedValue<mlir::acc::PointerLikeType> destPtr) const;
55
56 mlir::Value genCast(mlir::Type pointer, mlir::OpBuilder &builder,
57 mlir::Location loc, mlir::Value value,
58 mlir::Type resultType) const;
59
60 bool isDeviceData(mlir::Type pointer, mlir::Value var) const;
61};
62
63template <typename T>
65 : public mlir::acc::MappableType::ExternalModel<OpenACCMappableModel<T>,
66 T> {
67 mlir::TypedValue<mlir::acc::PointerLikeType> getVarPtr(::mlir::Type type,
68 mlir::Value var) const;
69
70 std::optional<llvm::TypeSize>
71 getSizeInBytes(mlir::Type type, mlir::Value var, mlir::ValueRange accBounds,
72 const mlir::DataLayout &dataLayout) const;
73
74 std::optional<int64_t>
75 getOffsetInBytes(mlir::Type type, mlir::Value var, mlir::ValueRange accBounds,
76 const mlir::DataLayout &dataLayout) const;
77
78 bool hasUnknownDimensions(mlir::Type type) const;
79
81 generateAccBounds(mlir::Type type, mlir::Value var,
82 mlir::OpBuilder &builder) const;
83
84 mlir::acc::VariableTypeCategory getTypeCategory(mlir::Type type,
85 mlir::Value var) const;
86
87 mlir::acc::VariableInfoAttr
88 genPrivateVariableInfo(mlir::Type type,
89 mlir::TypedValue<mlir::acc::MappableType> var) const;
90
91 mlir::Value generatePrivateInit(mlir::Type type, mlir::OpBuilder &builder,
92 mlir::Location loc,
93 mlir::TypedValue<mlir::acc::MappableType> var,
94 llvm::StringRef varName,
95 mlir::ValueRange extents, mlir::Value initVal,
96 mlir::acc::VariableInfoAttr varInfo,
97 bool &needsDestroy) const;
98
99 bool generatePrivateDestroy(mlir::Type type, mlir::OpBuilder &builder,
100 mlir::Location loc, mlir::Value privatized,
101 mlir::ValueRange bounds,
102 mlir::acc::VariableInfoAttr varInfo) const;
103
104 bool generateCopy(mlir::Type type, mlir::OpBuilder &mlirBuilder,
105 mlir::Location loc,
106 mlir::TypedValue<mlir::acc::MappableType> source,
107 mlir::TypedValue<mlir::acc::MappableType> dest,
108 mlir::ValueRange bounds,
109 mlir::acc::VariableInfoAttr varInfo) const;
110
111 bool generateCombiner(mlir::Type type, mlir::OpBuilder &mlirBuilder,
112 mlir::Location loc,
113 mlir::TypedValue<mlir::acc::MappableType> dest,
114 mlir::TypedValue<mlir::acc::MappableType> source,
115 mlir::ValueRange bounds,
116 mlir::acc::ReductionOperator op,
117 mlir::Attribute fastmathFlags) const;
118
119 bool isDeviceData(mlir::Type type, mlir::Value var) const;
120};
121
123 : public mlir::acc::ReducibleType::ExternalModel<
124 OpenACCReducibleLogicalModel, fir::LogicalType> {
125 std::optional<mlir::arith::AtomicRMWKind>
126 getAtomicRMWKind(mlir::Type type, mlir::acc::ReductionOperator redOp) const;
127};
128
129} // namespace fir::acc
130
131#endif // FLANG_OPTIMIZER_OPENACC_FIROPENACCTYPEINTERFACES_H_
Definition OpenACC.h:20
Definition FIROpenACCTypeInterfaces.h:66
Definition FIROpenACCTypeInterfaces.h:24
Definition FIROpenACCTypeInterfaces.h:124