22#include "mlir/Dialect/Bufferization/IR/BufferizationOpsDialect.cpp.inc"
29struct BufferizationInlinerInterface :
public DialectInlinerInterface {
30 using DialectInlinerInterface::DialectInlinerInterface;
33 bool isLegalToInline(Operation *, Region *,
bool, IRMapping &)
const final {
38template <
typename Tensor>
39struct BuiltinTensorExternalModel
40 : TensorLikeType::ExternalModel<BuiltinTensorExternalModel<Tensor>,
42 mlir::LogicalResult verifyCompatibleBufferType(
43 mlir::Type tensor, BufferLikeType bufferType,
44 llvm::function_ref<mlir::InFlightDiagnostic()>
emitError)
const {
45 auto tensorType = cast<ShapedType>(tensor);
46 auto memrefType = cast<ShapedType>(bufferType);
48 if (tensorType.getShape() != memrefType.getShape())
49 return emitError() <<
"shapes do not match";
51 if (tensorType.getElementType() != memrefType.getElementType())
52 return emitError() <<
"element types do not match";
54 return mlir::success();
58template <
typename MemRef>
59struct BuiltinMemRefExternalModel
60 : BufferLikeType::ExternalModel<BuiltinMemRefExternalModel<MemRef>,
68void mlir::bufferization::BufferizationDialect::initialize() {
71#include "mlir/Dialect/Bufferization/IR/BufferizationOps.cpp.inc"
73 addInterfaces<BufferizationInlinerInterface>();
80 RankedTensorType::attachInterface<
81 BuiltinTensorExternalModel<RankedTensorType>>(*
getContext());
82 UnrankedTensorType::attachInterface<
83 BuiltinTensorExternalModel<UnrankedTensorType>>(*
getContext());
84 MemRefType::attachInterface<BuiltinMemRefExternalModel<MemRefType>>(
86 UnrankedMemRefType::attachInterface<
87 BuiltinMemRefExternalModel<UnrankedMemRefType>>(*
getContext());
90LogicalResult BufferizationDialect::verifyRegionArgAttribute(
91 Operation *op,
unsigned ,
unsigned argIndex,
93 if (attr.
getName() == kWritableAttrName) {
94 if (!llvm::isa<BoolAttr>(attr.
getValue())) {
95 return op->
emitError() <<
"'" << kWritableAttrName
96 <<
"' is expected to be a boolean attribute";
98 if (!isa<FunctionOpInterface>(op))
99 return op->
emitError() <<
"expected '" << kWritableAttrName
100 <<
"' to be used on function-like operations";
101 if (cast<FunctionOpInterface>(op).isExternal())
102 return op->
emitError() <<
"'" << kWritableAttrName
103 <<
"' is invalid on external functions";
106 if (attr.
getName() == kBufferAccessAttrName) {
107 if (!llvm::isa<StringAttr>(attr.
getValue())) {
108 return op->
emitError() <<
"'" << kBufferAccessAttrName
109 <<
"' is expected to be a string attribute";
111 StringRef str = llvm::cast<StringAttr>(attr.
getValue()).getValue();
112 if (str !=
"none" && str !=
"read" && str !=
"write" && str !=
"read-write")
114 <<
"invalid value for '" << kBufferAccessAttrName <<
"'";
115 if (!isa<FunctionOpInterface>(op))
116 return op->
emitError() <<
"expected '" << kBufferAccessAttrName
117 <<
"' to be used on function-like operations";
120 if (attr.
getName() == kBufferLayoutAttrName) {
121 if (!llvm::isa<MemRefLayoutAttrInterface>(attr.
getValue())) {
122 return op->
emitError() <<
"'" << kBufferLayoutAttrName
123 <<
"' is expected to be a memref layout attribute";
125 if (!isa<FunctionOpInterface>(op))
126 return op->
emitError() <<
"expected '" << kBufferLayoutAttrName
127 <<
"' to be used on function-like operations";
130 return op->
emitError() <<
"attribute '" << kBufferLayoutAttrName
131 <<
"' not supported as a region arg attribute by the "
132 "bufferization dialect";
136BufferizationDialect::verifyOperationAttribute(
Operation *op,
138 using bufferization::BufferizableOpInterface;
140 if (attr.
getName() == kManualDeallocation) {
144 << kManualDeallocation
145 <<
"' can be used only on ops that have an allocation and/or free "
151 <<
"attribute '" << attr.
getName()
152 <<
"' not supported as an op attribute by the bufferization dialect";
static bool isLegalToInline(InlinerInterface &interface, Region *src, Region *insertRegion, bool shouldCloneInlinedRegion, IRMapping &valueMapping)
Utility to check that all of the operations within 'src' can be inlined.
NamedAttribute represents a combination of a name and an Attribute value.
StringAttr getName() const
Return the name of the attribute.
Attribute getValue() const
Return the value of the attribute.
Operation is the basic unit of execution within MLIR.
InFlightDiagnostic emitError(const Twine &message={})
Emit an error about fatal conditions with this operation, reporting up to any diagnostic handlers tha...
InFlightDiagnostic emitOpError(const Twine &message={})
Emit an error with the op name prefixed, like "'dim' op " which is convenient for verifiers.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
bool hasEffect(Operation *op)
Returns "true" if op has an effect of type EffectTy.