13#ifndef MLIR_DIALECT_OPENACC_OPENACC_H_
14#define MLIR_DIALECT_OPENACC_OPENACC_H_
26#include "mlir/Dialect/OpenACC/OpenACCOpsDialect.h.inc"
27#include "mlir/Dialect/OpenACC/OpenACCOpsEnums.h.inc"
28#include "mlir/Dialect/OpenACC/OpenACCOpsInterfaces.h.inc"
29#include "mlir/Dialect/OpenACC/OpenACCTypeInterfaces.h.inc"
36#include "llvm/ADT/SmallVector.h"
39#define GET_TYPEDEF_CLASSES
40#include "mlir/Dialect/OpenACC/OpenACCOpsTypes.h.inc"
42#define GET_ATTRDEF_CLASSES
43#include "mlir/Dialect/OpenACC/OpenACCOpsAttributes.h.inc"
48#include "mlir/Dialect/OpenACC/OpenACCOps.h.inc"
50#define ACC_DATA_ENTRY_OPS \
51 mlir::acc::CopyinOp, mlir::acc::CreateOp, mlir::acc::PresentOp, \
52 mlir::acc::NoCreateOp, mlir::acc::AttachOp, mlir::acc::DevicePtrOp, \
53 mlir::acc::GetDevicePtrOp, mlir::acc::PrivateOp, \
54 mlir::acc::FirstprivateOp, mlir::acc::FirstprivateMapInitialOp, \
55 mlir::acc::UpdateDeviceOp, mlir::acc::UseDeviceOp, \
56 mlir::acc::ReductionOp, mlir::acc::DeclareDeviceResidentOp, \
57 mlir::acc::DeclareLinkOp, mlir::acc::CacheOp
58#define ACC_DATA_ENTRY_AND_INIT_OPS \
59 ACC_DATA_ENTRY_OPS, mlir::acc::ReductionInitOp
60#define ACC_DATA_EXIT_OPS \
61 mlir::acc::CopyoutOp, mlir::acc::DeleteOp, mlir::acc::DetachOp, \
62 mlir::acc::UpdateHostOp
63#define ACC_DATA_CLAUSE_OPS ACC_DATA_ENTRY_OPS, ACC_DATA_EXIT_OPS
64#define ACC_COMPUTE_CONSTRUCT_OPS \
65 mlir::acc::ParallelOp, mlir::acc::KernelsOp, mlir::acc::SerialOp
66#define ACC_COMPUTE_CONSTRUCT_AND_LOOP_OPS \
67 ACC_COMPUTE_CONSTRUCT_OPS, mlir::acc::LoopOp
68#define ACC_DATA_CONSTRUCT_STRUCTURED_OPS \
69 mlir::acc::DataOp, mlir::acc::DeclareOp, mlir::acc::HostDataOp
70#define ACC_DATA_CONSTRUCT_UNSTRUCTURED_OPS \
71 mlir::acc::EnterDataOp, mlir::acc::ExitDataOp, mlir::acc::UpdateOp, \
72 mlir::acc::DeclareEnterOp, mlir::acc::DeclareExitOp
73#define ACC_DATA_CONSTRUCT_OPS \
74 ACC_DATA_CONSTRUCT_STRUCTURED_OPS, ACC_DATA_CONSTRUCT_UNSTRUCTURED_OPS
75#define ACC_COMPUTE_AND_DATA_CONSTRUCT_OPS \
76 ACC_COMPUTE_CONSTRUCT_OPS, ACC_DATA_CONSTRUCT_OPS
77#define ACC_COMPUTE_LOOP_AND_DATA_CONSTRUCT_OPS \
78 ACC_COMPUTE_CONSTRUCT_AND_LOOP_OPS, ACC_DATA_CONSTRUCT_OPS
157std::optional<mlir::acc::DataClause>
185 return mlir::isa<mlir::acc::PointerLikeType>(type);
191 return mlir::isa<mlir::acc::MappableType>(type);
196 return StringLiteral(
"acc.declare");
200 return StringLiteral(
"acc.declare_action");
204 return RoutineInfoAttr::name;
208 return SpecializedRoutineAttr::name;
225 return StringLiteral(
"acc.from_default");
232 return StringLiteral(
"acc.no_device_descriptor");
238 return StringLiteral(
"acc.collapse_count");
245 return StringLiteral(
"acc.unstructured_independent_loop");
249 return VarNameAttr::name;
253 return CombinedConstructsTypeAttr::name;
258 mlir::StringRef
getName() const final {
return "AccRuntimeCounters"; }
264 mlir::StringRef
getName() const final {
return "AccConstructResource"; }
270 mlir::StringRef
getName() const final {
return "AccCurrentDeviceIdResource"; }
274template <
typename ComputeOpT>
277 auto stripIndexCasts = [](
Value val) ->
Value {
278 while (
auto castOp = val.getDefiningOp<arith::IndexCastOp>())
279 val = castOp.getIn();
283 auto numGangs = op.getNumGangsValues();
284 if (numGangs.empty())
286 for (
Value gangSize : numGangs) {
290 Value numWorkers = op.getNumWorkersValue();
293 Value vectorLength = op.getVectorLengthValue();
This class provides a mutable adaptor for a range of operands.
Operation is the basic unit of execution within MLIR.
bool hasDiscardableAttr(StringRef name)
Return true if this operation has a discardable attribute with the provided name.
This base class is used for derived effects that are non-parametric.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
This class provides an abstraction over the different types of ranges over Values.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
static constexpr StringLiteral getNoDeviceDescriptorAttrName()
Name for a unit attribute on a data entry operation stating that nothing in the region reads the desc...
SmallVector< DeviceType, 3 > getDeviceTypesByPrecedence(DeviceType deviceType)
The clauses of a construct can be given once per device type.
bool getSyntheticFlag(mlir::Operation *accDataClauseOp)
Used to find out whether the implementation created the data operation for its own bookkeeping,...
static constexpr StringLiteral getFromDefaultClauseAttrName()
mlir::Value getAccVar(mlir::Operation *accDataClauseOp)
Used to obtain the accVar from a data clause operation.
mlir::Value getVar(mlir::Operation *accDataClauseOp)
Used to obtain the var from a data clause operation.
bool isAccRoutine(mlir::Operation *op)
Used to check whether the current operation is marked with acc routine.
mlir::TypedValue< mlir::acc::PointerLikeType > getAccPtr(mlir::Operation *accDataClauseOp)
Used to obtain the accVar from a data clause operation if it implements PointerLikeType.
static constexpr StringLiteral getSpecializedRoutineAttrName()
std::optional< mlir::acc::DataClause > getDataClause(mlir::Operation *accDataEntryOp)
Used to obtain the dataClause from a data entry operation.
bool isPointerLikeType(mlir::Type type)
Used to check whether the provided type implements the PointerLikeType interface.
mlir::MutableOperandRange getMutableDataOperands(mlir::Operation *accOp)
Used to get a mutable range iterating over the data operands.
mlir::SmallVector< mlir::Value > getBounds(mlir::Operation *accDataClauseOp)
Used to obtain bounds from an acc data clause operation.
bool isDataEntryOp(mlir::Operation *op)
Used to find out whether op is a data entry operation or an acc.map_info.
OpenACCExecMapping
Enumeration used to encode the execution mapping on a loop construct.
bool isSpecializedAccRoutine(mlir::Operation *op)
Used to check whether this is a specialized accelerator version of acc routine function.
static constexpr StringLiteral getUnstructuredIndependentLoopAttrName()
Name for a unit attribute attached to the region an unstructured independent loop was converted to,...
mlir::ValueRange getDataOperands(mlir::Operation *accOp)
Used to get an immutable range iterating over the data operands.
std::optional< llvm::StringRef > getVarName(mlir::Operation *accOp)
Used to obtain the name from an acc operation.
static constexpr StringLiteral getRoutineInfoAttrName()
bool isGangWorkerVectorAllOne(ComputeOpT op)
bool getImplicitFlag(mlir::Operation *accDataEntryOp)
Used to find out whether data operation is implicit.
mlir::SymbolRefAttr getRecipe(mlir::Operation *accOp)
Used to get the recipe attribute from a data clause operation.
mlir::SmallVector< mlir::Value > getAsyncOperands(mlir::Operation *accDataClauseOp)
Used to obtain async operands from an acc data clause operation.
bool isMappableType(mlir::Type type)
Used to check whether the provided type implements the MappableType interface.
static constexpr StringLiteral getCombinedConstructsAttrName()
mlir::Value getVarPtrPtr(mlir::Operation *accDataClauseOp)
Used to obtain the varPtrPtr from a data clause operation.
static constexpr StringLiteral getVarNameAttrName()
mlir::ArrayAttr getAsyncOnly(mlir::Operation *accDataClauseOp)
Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation,...
static constexpr StringLiteral getDeclareAttrName()
Used to obtain the attribute name for declare.
static constexpr StringLiteral getDeclareActionAttrName()
mlir::Type getVarType(mlir::Operation *accDataClauseOp)
Used to obtains the varType from a data clause operation which records the type of variable.
static constexpr StringLiteral getCollapseCountAttrName()
Name for an attribute attached to a loop indicating the number of loops collapsed to create that loop...
mlir::TypedValue< mlir::acc::PointerLikeType > getVarPtr(mlir::Operation *accDataClauseOp)
Used to obtain the var from a data clause operation if it implements PointerLikeType.
mlir::ArrayAttr getAsyncOperandsDeviceType(mlir::Operation *accDataClauseOp)
Returns an array of acc:DeviceTypeAttr attributes attached to an acc data clause operation,...
Include the generated interface declarations.
bool isConstantIntValue(OpFoldResult ofr, int64_t value)
Return true if ofr is constant integer equal to value.
std::conditional_t< std::is_same_v< Ty, mlir::Type >, mlir::Value, detail::TypedValue< Ty > > TypedValue
If Ty is mlir::Type this will select Value instead of having a wrapper around it.
mlir::StringRef getName() const final
Return a string name of the resource.
bool isAddressable() const override
Returns true if this resource is addressable (effects on it can alias pointer-based memory).
bool isAddressable() const override
Returns true if this resource is addressable (effects on it can alias pointer-based memory).
mlir::StringRef getName() const final
Return a string name of the resource.
mlir::StringRef getName() const final
Return a string name of the resource.
bool isAddressable() const override
Returns true if this resource is addressable (effects on it can alias pointer-based memory).