MLIR
21.0.0git
|
Namespaces | |
deallocation_impl | |
detail | |
func_ext | |
Classes | |
struct | ValueComparator |
Compare two SSA values in a deterministic manner. More... | |
class | Ownership |
This class is used to track the ownership of values. More... | |
struct | DeallocationOptions |
Options for BufferDeallocationOpInterface-based buffer deallocation. More... | |
class | DeallocationState |
This class collects all the state that we need to perform the buffer deallocation pass with associated helper functions such that we have easy access to it in the BufferDeallocationOpInterface implementations and the BufferDeallocation pass. More... | |
struct | AliasingOpOperand |
A maybe aliasing OpOperand. More... | |
struct | AliasingValue |
A maybe aliasing Value. More... | |
class | AliasList |
class | OpFilter |
struct | BufferizationOptions |
Options for BufferizableOpInterface-based bufferization. More... | |
struct | TraversalConfig |
Traversal parameters for findValueInReverseUseDefChain . More... | |
class | AnalysisState |
AnalysisState provides a variety of helper functions for dealing with tensor values. More... | |
class | BufferizationState |
BufferizationState provides information about the state of the IR during the bufferization process. More... | |
struct | DstBufferizableOpInterfaceExternalModel |
Bufferizable ops that implement the DestinationStyleOpInterface can use this external model base class. More... | |
struct | OpWithUnstructuredControlFlowBufferizableOpInterfaceExternalModel |
A template that provides a default implementation of getAliasingOpOperands for ops that support unstructured control flow within their regions. More... | |
struct | BranchOpBufferizableOpInterfaceExternalModel |
A template that provides a default implementation of getAliasingValues for ops that implement the BranchOpInterface . More... | |
struct | BufferDeallocationPipelineOptions |
Options for the buffer deallocation pipeline. More... | |
struct | BufferizationStatistics |
Bufferization statistics for debugging. More... | |
class | BufferPlacementAllocs |
A simple analysis that detects allocation operations. More... | |
class | BufferPlacementTransformationBase |
The base class for all BufferPlacement transformations. More... | |
struct | OneShotBufferizationOptions |
Options for analysis-enabled bufferization. More... | |
class | OneShotAnalysisState |
State for analysis-enabled bufferization. More... | |
struct | BufferResultsToOutParamsOpts |
Typedefs | |
using | AliasingOpOperandList = AliasList< AliasingOpOperand > |
A list of possible aliasing OpOperands. More... | |
using | AliasingValueList = AliasList< AliasingValue > |
A list of possible aliasing Values. More... | |
using | RegisterDependenciesFn = std::function< void(ValueRange, ValueRange)> |
using | DeallocHelperMap = llvm::DenseMap< Operation *, func::FuncOp > |
Maps from symbol table to its corresponding dealloc helper function. More... | |
using | ControlBuildSubsetExtractionFn = std::function< Value(RewriterBase &, SubsetInsertionOpInterface, tensor::EmptyOp emptyTensorOp, Operation *user)> |
A function type that defines a callback to control the construction of the subset extraction of the SubsetInsertionOpInterface . More... | |
Enumerations | |
enum class | BufferRelation { Unknown , Equivalent } |
Specifies a fine-grain relationship between buffers to enable more analysis. More... | |
Functions | |
FailureOr< Value > | allocateTensorForShapedValue (OpBuilder &b, Location loc, Value shapedValue, const BufferizationOptions &options, const BufferizationState &state, bool copy=true) |
Create an AllocTensorOp for the given shaped value (memref or tensor). More... | |
FailureOr< Value > | getBuffer (RewriterBase &rewriter, Value value, const BufferizationOptions &options, const BufferizationState &state) |
Lookup the buffer for the given value. More... | |
FailureOr< BufferLikeType > | getBufferType (Value value, const BufferizationOptions &options, const BufferizationState &state) |
Return the buffer type for a given Value (tensor) after bufferization without bufferizing any IR. More... | |
FailureOr< BufferLikeType > | getBufferType (Value value, const BufferizationOptions &options, const BufferizationState &state, SmallVector< Value > &invocationStack) |
Return the buffer type for a given Value (tensor) after bufferization without bufferizing any IR. More... | |
bool | hasTensorSemantics (Operation *op) |
Return "true" if the given op has tensor semantics and should be bufferized. More... | |
void | replaceOpWithBufferizedValues (RewriterBase &rewriter, Operation *op, ValueRange values) |
Replace an op with replacement values. More... | |
template<typename OpTy , typename... Args> | |
OpTy | replaceOpWithNewBufferizedOp (RewriterBase &rewriter, Operation *op, Args &&...args) |
Replace an op with a new op. More... | |
BaseMemRefType | getMemRefType (TensorType tensorType, const BufferizationOptions &options, MemRefLayoutAttrInterface layout={}, Attribute memorySpace=nullptr) |
Return a MemRefType to which the TensorType can be bufferized. More... | |
BaseMemRefType | getMemRefTypeWithFullyDynamicLayout (TensorType tensorType, Attribute memorySpace=nullptr) |
Return a MemRef type with fully dynamic layout. More... | |
BaseMemRefType | getMemRefTypeWithStaticIdentityLayout (TensorType tensorType, Attribute memorySpace=nullptr) |
Return a MemRef type with a static identity layout (i.e., no layout map). More... | |
Operation * | getOwnerOfValue (Value value) |
Return the owner of the given value. More... | |
Region * | getNextEnclosingRepetitiveRegion (Region *region, const BufferizationOptions &options) |
Assuming that the given region is repetitive, find the next enclosing repetitive region. More... | |
Region * | getParallelRegion (Region *region, const BufferizationOptions &options) |
If region is a parallel region, return region . More... | |
void | populateDynamicDimSizes (OpBuilder &b, Location loc, Value shapedValue, SmallVector< Value > &dynamicDims) |
Populate dynamicDims with tensor::DimOp / memref::DimOp results for all dynamic dimensions of the given shaped value. More... | |
FailureOr< Value > | castOrReallocMemRefValue (OpBuilder &b, Value value, MemRefType type, const BufferizationOptions &options) |
Try to cast the given ranked MemRef-typed value to the given ranked MemRef type. More... | |
LogicalResult | foldToBufferToTensorPair (RewriterBase &rewriter, ToBufferOp toBuffer, const BufferizationOptions &options) |
Try to fold to_buffer(to_tensor(x)). More... | |
void | populateDeallocOpCanonicalizationPatterns (RewritePatternSet &patterns, MLIRContext *context) |
Add the canonicalization patterns for bufferization.dealloc to the given pattern set to make them available to other passes (such as BufferDeallocationSimplification). More... | |
void | buildBufferDeallocationPipeline (OpPassManager &pm, const BufferDeallocationPipelineOptions &options) |
Adds the buffer deallocation pipeline to the OpPassManager . More... | |
void | registerBufferizationPipelines () |
Registers all pipelines for the bufferization dialect. More... | |
void | registerTransformDialectExtension (DialectRegistry ®istry) |
LogicalResult | bufferizeOp (Operation *op, const BufferizationOptions &options, BufferizationState &bufferizationState, BufferizationStatistics *statistics=nullptr) |
Bufferize op and its nested ops that implement BufferizableOpInterface . More... | |
LogicalResult | bufferizeBlockSignature (Block *block, RewriterBase &rewriter, const BufferizationOptions &options, BufferizationState &state) |
Bufferize the signature of block and its callers (i.e., ops that have the given block as a successor). More... | |
template<typename DominatorT > | |
Block * | findCommonDominator (Value value, const BufferViewFlowAnalysis::ValueSetT &values, const DominatorT &doms) |
Finds a common dominator for the given value while taking the positions of the values in the value set into account. More... | |
FailureOr< memref::GlobalOp > | getGlobalFor (arith::ConstantOp constantOp, SymbolTableCollection &symbolTables, uint64_t alignment, Attribute memorySpace={}) |
void | removeSymbol (Operation *op, BufferizationState &state) |
void | insertSymbol (Operation *op, BufferizationState &state) |
SmallVector< func::ReturnOp > | getReturnOps (func::FuncOp funcOp) |
Helper function that returns all func.return ops in the given function. More... | |
LogicalResult | analyzeOp (Operation *op, OneShotAnalysisState &state, BufferizationStatistics *statistics=nullptr) |
Analyze op and its nested ops. More... | |
LogicalResult | runOneShotBufferize (Operation *op, const OneShotBufferizationOptions &options, BufferizationState &state, BufferizationStatistics *statistics=nullptr) |
Run One-Shot Bufferize on the given op: Analysis + Bufferization. More... | |
llvm::LogicalResult | analyzeModuleOp (ModuleOp moduleOp, OneShotAnalysisState &state, BufferizationStatistics *statistics=nullptr) |
Analyze moduleOp and its nested ops. More... | |
llvm::LogicalResult | bufferizeModuleOp (ModuleOp moduleOp, const OneShotBufferizationOptions &options, BufferizationState &state, BufferizationStatistics *statistics=nullptr) |
Bufferize op and its nested ops that implement BufferizableOpInterface . More... | |
void | removeBufferizationAttributesInModule (ModuleOp moduleOp) |
Remove bufferization attributes on every FuncOp arguments in the ModuleOp. More... | |
llvm::LogicalResult | runOneShotModuleBufferize (ModuleOp moduleOp, const bufferization::OneShotBufferizationOptions &options, BufferizationState &state, BufferizationStatistics *statistics=nullptr) |
Run One-Shot Module Bufferization on the given module. More... | |
void | populateBufferizationDeallocLoweringPattern (RewritePatternSet &patterns, const DeallocHelperMap &deallocHelperFuncMap) |
Adds the conversion pattern of the bufferization.dealloc operation to the given pattern set for use in other transformation passes. More... | |
func::FuncOp | buildDeallocationLibraryFunction (OpBuilder &builder, Location loc, SymbolTable &symbolTable) |
Construct the library function needed for the fully generic bufferization.dealloc lowering implemented in the LowerDeallocations pass. More... | |
LogicalResult | deallocateBuffersOwnershipBased (FunctionOpInterface op, DeallocationOptions options, SymbolTableCollection &symbolTables) |
Run the ownership-based buffer deallocation. More... | |
LogicalResult | promoteBufferResultsToOutParams (ModuleOp module, const BufferResultsToOutParamsOpts &options) |
Replace buffers that are returned from a function with an out parameter. More... | |
LogicalResult | dropEquivalentBufferResults (ModuleOp module) |
Drop all memref function results that are equivalent to a function argument. More... | |
std::unique_ptr< Pass > | createPromoteBuffersToStackPass (std::function< bool(Value)> isSmallAlloc) |
Creates a pass that promotes heap-based allocations to stack-based ones. More... | |
LogicalResult | eliminateEmptyTensors (RewriterBase &rewriter, Operation *op) |
Try to eliminate "tensor.empty" ops inside op . More... | |
Value | buildSubsetExtraction (RewriterBase &rewriter, SubsetInsertionOpInterface op, tensor::EmptyOp emptyTensorOp, Operation *user) |
This method builds and returns a subset extraction value for the destination tensor that the given op inserts into. More... | |
LogicalResult | eliminateEmptyTensors (RewriterBase &rewriter, Operation *op, OneShotAnalysisState &state, ControlBuildSubsetExtractionFn subsetsExtractionFn=buildSubsetExtraction) |
Try to eliminate "tensor.empty" ops inside op . More... | |
void | hoistBuffersFromLoops (Operation *op) |
Within the given operation, hoist buffers from loops where possible. More... | |
LogicalResult | insertTensorCopies (Operation *op, const OneShotBufferizationOptions &options, const BufferizationState &bufferizationState, BufferizationStatistics *statistics=nullptr) |
Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops. More... | |
LogicalResult | insertTensorCopies (Operation *op, const AnalysisState &analysisState, const BufferizationState &bufferizationState) |
Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops. More... | |
void | populateEmptyTensorToAllocTensorPattern (RewritePatternSet &patterns) |
Populate patterns to lower tensor.empty ops to bufferization.alloc_tensor ops. More... | |
using mlir::bufferization::AliasingOpOperandList = typedef AliasList<AliasingOpOperand> |
A list of possible aliasing OpOperands.
This list models the runtime aliasing relationship for a Value.
Definition at line 95 of file BufferizableOpInterface.h.
using mlir::bufferization::AliasingValueList = typedef AliasList<AliasingValue> |
A list of possible aliasing Values.
This list models the runtime aliasing relationship for an OpOperand.
Definition at line 99 of file BufferizableOpInterface.h.
using mlir::bufferization::ControlBuildSubsetExtractionFn = typedef std::function<Value(RewriterBase &, SubsetInsertionOpInterface, tensor::EmptyOp emptyTensorOp, Operation *user)> |
A function type that defines a callback to control the construction of the subset extraction of the SubsetInsertionOpInterface
.
The subset extraction value can be used as a replacement for the emptyTensorOp
value which is being consumed by user
, failing of building such a value should be indicated with an empty value. This function should guarantee the legality of the replacement, i.e. the replacement should dominate the user of the emptyTensorOp
being eliminated.
Definition at line 47 of file Transforms.h.
using mlir::bufferization::DeallocHelperMap = typedef llvm::DenseMap<Operation *, func::FuncOp> |
using mlir::bufferization::RegisterDependenciesFn = typedef std::function<void(ValueRange, ValueRange)> |
Definition at line 20 of file BufferViewFlowOpInterface.h.
|
strong |
Specifies a fine-grain relationship between buffers to enable more analysis.
Enumerator | |
---|---|
Unknown | |
Equivalent |
Definition at line 34 of file BufferizableOpInterface.h.
FailureOr< Value > mlir::bufferization::allocateTensorForShapedValue | ( | OpBuilder & | b, |
Location | loc, | ||
Value | shapedValue, | ||
const BufferizationOptions & | options, | ||
const BufferizationState & | state, | ||
bool | copy = true |
||
) |
Create an AllocTensorOp for the given shaped value (memref or tensor).
Create an AllocTensorOp for the given shaped value.
If copy
is set, the shaped value is copied. Otherwise, a tensor with undefined contents is allocated.
Definition at line 166 of file BufferizableOpInterface.cpp.
LogicalResult mlir::bufferization::analyzeModuleOp | ( | ModuleOp | moduleOp, |
OneShotAnalysisState & | state, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Analyze moduleOp
and its nested ops.
Bufferization decisions are stored in state
.
Definition at line 450 of file OneShotModuleBufferize.cpp.
Referenced by insertTensorCopies().
LogicalResult mlir::bufferization::analyzeOp | ( | Operation * | op, |
OneShotAnalysisState & | state, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Analyze op
and its nested ops.
Bufferization decisions are stored in state
.
Definition at line 1327 of file OneShotAnalysis.cpp.
Referenced by insertTensorCopies().
LogicalResult mlir::bufferization::bufferizeBlockSignature | ( | Block * | block, |
RewriterBase & | rewriter, | ||
const BufferizationOptions & | options, | ||
BufferizationState & | state | ||
) |
Bufferize the signature of block
and its callers (i.e., ops that have the given block as a successor).
All block argument types are changed to memref types. All corresponding operands of all callers are wrapped in bufferization.to_buffer ops. All uses of bufferized tensor block arguments are wrapped in bufferization.to_tensor ops.
It is expected that all callers implement the BranchOpInterface
. Otherwise, this function will fail. The BranchOpInterface
is used to query the range of operands that are forwarded to this block.
It is expected that the parent op of this block implements the BufferizableOpInterface
. The buffer types of tensor block arguments are computed with BufferizableOpIntercace::getBufferType
.
Definition at line 398 of file Bufferize.cpp.
LogicalResult mlir::bufferization::bufferizeModuleOp | ( | ModuleOp | moduleOp, |
const OneShotBufferizationOptions & | options, | ||
BufferizationState & | state, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Bufferize op
and its nested ops that implement BufferizableOpInterface
.
Note: This function does not run One-Shot Analysis. No buffer copies are inserted except two cases:
options.copyBeforeWrite
is set, in which case buffers are copied before every write.options.copyBeforeWrite
is not set and options.noAnalysisFuncFilter
is not empty. The FuncOps it contains were not analyzed. Buffer copies will be inserted only to these FuncOps. Definition at line 522 of file OneShotModuleBufferize.cpp.
Referenced by mlir::sparse_tensor::SparsificationAndBufferizationPass::runDenseBufferization().
LogicalResult mlir::bufferization::bufferizeOp | ( | Operation * | op, |
const BufferizationOptions & | options, | ||
BufferizationState & | bufferizationState, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Bufferize op
and its nested ops that implement BufferizableOpInterface
.
Note: This function does not resolve read-after-write conflicts. Use this function only if it is guaranteed that the input IR can bufferize without additional buffer copies or set "options.copyBeforeWrite = true". The general bufferization entry point is runOneShotBufferize
.
Check the result of bufferization. Return an error if an op was not bufferized, unless partial bufferization is allowed.
Definition at line 278 of file Bufferize.cpp.
References mlir::Operation::getContext(), hasTensorSemantics(), insertTensorCopies(), options, mlir::PostOrder, and mlir::Operation::walk().
void mlir::bufferization::buildBufferDeallocationPipeline | ( | OpPassManager & | pm, |
const BufferDeallocationPipelineOptions & | options | ||
) |
Adds the buffer deallocation pipeline to the OpPassManager
.
This is the standard pipeline for deallocating the MemRefs introduced by the One-Shot bufferization pass.
Definition at line 21 of file BufferizationPipelines.cpp.
References mlir::OpPassManager::addPass(), mlir::createCanonicalizerPass(), mlir::createCSEPass(), and options.
Referenced by registerBufferizationPipelines().
func::FuncOp mlir::bufferization::buildDeallocationLibraryFunction | ( | OpBuilder & | builder, |
Location | loc, | ||
SymbolTable & | symbolTable | ||
) |
Construct the library function needed for the fully generic bufferization.dealloc
lowering implemented in the LowerDeallocations pass.
The function can then be called at bufferization dealloc sites to determine aliasing and ownership.
The generated function takes two memrefs of indices and three memrefs of booleans as arguments:
This helper function is supposed to be called once for each bufferization.dealloc
operation to determine the deallocation need and new ownership indicator for the retained values, but does not perform the deallocation itself.
Generated code:
Definition at line 427 of file LowerDeallocations.cpp.
References mlir::OpBuilder::clearInsertionPoint(), mlir::OpBuilder::create(), mlir::get(), mlir::Builder::getBoolAttr(), mlir::Builder::getFunctionType(), mlir::Builder::getI1Type(), mlir::Builder::getIndexAttr(), mlir::Builder::getIndexType(), mlir::SymbolTable::insert(), mlir::SymbolTable::Private, and mlir::OpBuilder::setInsertionPointToStart().
Value mlir::bufferization::buildSubsetExtraction | ( | RewriterBase & | rewriter, |
SubsetInsertionOpInterface | op, | ||
tensor::EmptyOp | emptyTensorOp, | ||
Operation * | user | ||
) |
This method builds and returns a subset extraction value for the destination tensor that the given op
inserts into.
It returns a value which should replace the emptyTensorOp
use that is being consumed by user
. If no such a value found it will return an empty Value.
Definition at line 96 of file EmptyTensorElimination.cpp.
References findValidInsertionPoint(), and mlir::OpBuilder::setInsertionPoint().
FailureOr< Value > mlir::bufferization::castOrReallocMemRefValue | ( | OpBuilder & | b, |
Value | value, | ||
MemRefType | type, | ||
const BufferizationOptions & | options | ||
) |
Try to cast the given ranked MemRef-typed value to the given ranked MemRef type.
Insert a reallocation + copy if it cannot be statically guaranteed that a direct cast would be valid.
E.g., when casting from a ranked MemRef type with dynamic layout to a ranked MemRef type with static layout, it is not statically known whether the cast will succeed or not. Such memref.cast
ops may fail at runtime. This function never generates such casts and conservatively inserts a copy.
This function returns failure()
in case of unsupported casts. E.g., casts with differing element types or memory spaces.
Definition at line 26 of file BufferizationOps.cpp.
References copy(), mlir::OpBuilder::create(), mlir::Value::getLoc(), mlir::Value::getType(), and options.
Referenced by foldToBufferToTensorPair().
std::unique_ptr< Pass > mlir::bufferization::createPromoteBuffersToStackPass | ( | std::function< bool(Value)> | isSmallAlloc | ) |
Creates a pass that promotes heap-based allocations to stack-based ones.
Only buffers smaller with isSmallAlloc(alloc) == true
are promoted.
Definition at line 478 of file BufferOptimizations.cpp.
LogicalResult mlir::bufferization::deallocateBuffersOwnershipBased | ( | FunctionOpInterface | op, |
DeallocationOptions | options, | ||
SymbolTableCollection & | symbolTables | ||
) |
Run the ownership-based buffer deallocation.
Definition at line 1053 of file OwnershipBasedBufferDeallocation.cpp.
References options.
LogicalResult mlir::bufferization::dropEquivalentBufferResults | ( | ModuleOp | module | ) |
Drop all memref function results that are equivalent to a function argument.
Definition at line 71 of file DropEquivalentBufferResults.cpp.
References mlir::OpBuilder::create(), mlir::detail::enumerate(), getAssumedUniqueReturnOp(), getCalledFunction(), mlir::Value::getDefiningOp(), mlir::Value::getType(), mlir::RewriterBase::replaceOp(), and mlir::OpBuilder::setInsertionPoint().
LogicalResult mlir::bufferization::eliminateEmptyTensors | ( | RewriterBase & | rewriter, |
Operation * | op | ||
) |
Try to eliminate "tensor.empty" ops inside op
.
This transformation looks for subset ops that insert a tensor that originates from a "tensor.empty" (as per the reverse use-def chain). Such "tensor.empty" ops are replaced with the destination subset.
E.g.: %0 = tensor.empty() : tensor<10xf32> %1 = linalg.fill ... outs(%0 : tensor<10xf32>) %2 = tensor.insert_slice %0 into t ...
In the above example, the subset op is "tensor.insert_slice". When tracing back the reverse use-def chain of a the source, we end up at a "tensor.empty" op.
Definition at line 203 of file EmptyTensorElimination.cpp.
References options.
LogicalResult mlir::bufferization::eliminateEmptyTensors | ( | RewriterBase & | rewriter, |
Operation * | op, | ||
OneShotAnalysisState & | state, | ||
ControlBuildSubsetExtractionFn | subsetsExtractionFn = buildSubsetExtraction |
||
) |
Try to eliminate "tensor.empty" ops inside op
.
This function overload accepts an existing OneShotAnalysisState
, which contains in-place bufferization decisions. This overload is useful if an existing analysis should be reused for empty tensor elimination.
Definition at line 118 of file EmptyTensorElimination.cpp.
Block* mlir::bufferization::findCommonDominator | ( | Value | value, |
const BufferViewFlowAnalysis::ValueSetT & | values, | ||
const DominatorT & | doms | ||
) |
Finds a common dominator for the given value while taking the positions of the values in the value set into account.
It supports dominator and post-dominator analyses via template arguments. If no common dominator can be found, this function will return "nullptr".
Definition at line 82 of file BufferUtils.h.
References mlir::Value::getParentBlock(), and mlir::Operation::getUsers().
LogicalResult mlir::bufferization::foldToBufferToTensorPair | ( | RewriterBase & | rewriter, |
ToBufferOp | toBuffer, | ||
const BufferizationOptions & | options | ||
) |
Try to fold to_buffer(to_tensor(x)).
If x's type and the result type of the to_buffer op are different, a memref.cast is needed.
Definition at line 86 of file BufferizationOps.cpp.
References castOrReallocMemRefValue(), options, mlir::RewriterBase::replaceOp(), and mlir::RewriterBase::replaceOpWithNewOp().
FailureOr< Value > mlir::bufferization::getBuffer | ( | RewriterBase & | rewriter, |
Value | value, | ||
const BufferizationOptions & | options, | ||
const BufferizationState & | state | ||
) |
Lookup the buffer for the given value.
If the value was not bufferized yet, wrap it in a ToBufferOp. Otherwise, it is the result of a ToTensorOp, from which the memref operand is returned.
Definition at line 673 of file BufferizableOpInterface.cpp.
FailureOr< BufferLikeType > mlir::bufferization::getBufferType | ( | Value | value, |
const BufferizationOptions & | options, | ||
const BufferizationState & | state | ||
) |
Return the buffer type for a given Value (tensor) after bufferization without bufferizing any IR.
Return the buffer type for a given Value (tensor) after bufferization.
Note: It should be sufficient to call getBuffer()->getType()
in most cases. However, when a buffer type should be predicted without modifying any IR, this function can be used.
This function is a wrapper around BufferizableOpInterface::getBufferType.
Definition at line 699 of file BufferizableOpInterface.cpp.
Referenced by mlir::bufferization::detail::defaultGetBufferType().
FailureOr< BufferLikeType > mlir::bufferization::getBufferType | ( | Value | value, |
const BufferizationOptions & | options, | ||
const BufferizationState & | state, | ||
SmallVector< Value > & | invocationStack | ||
) |
Return the buffer type for a given Value (tensor) after bufferization without bufferizing any IR.
Return the buffer type for a given Value (tensor) after bufferization.
This function (and not the other overload without invocationStack
) can be used from getBufferType
implementations of the BufferizableOpInterface
.
Note: It should be sufficient to call getBuffer()->getType()
in most cases. However, when a buffer type should be predicted without modifying any IR, this function can be used.
This function is a wrapper around BufferizableOpInterface::getBufferType
.
Definition at line 707 of file BufferizableOpInterface.cpp.
FailureOr< memref::GlobalOp > mlir::bufferization::getGlobalFor | ( | arith::ConstantOp | constantOp, |
SymbolTableCollection & | symbolTables, | ||
uint64_t | alignment, | ||
Attribute | memorySpace = {} |
||
) |
Definition at line 106 of file BufferUtils.cpp.
References mlir::OpBuilder::create(), mlir::get(), mlir::Builder::getI64Type(), getMemRefTypeWithStaticIdentityLayout(), mlir::Region::getOps(), mlir::Operation::getRegion(), mlir::Builder::getStringAttr(), mlir::SymbolTableCollection::getSymbolTable(), mlir::SymbolTable::insert(), and mlir::MemRefType::Builder::setMemorySpace().
BaseMemRefType mlir::bufferization::getMemRefType | ( | TensorType | tensorType, |
const BufferizationOptions & | options, | ||
MemRefLayoutAttrInterface | layout = {} , |
||
Attribute | memorySpace = nullptr |
||
) |
Return a MemRefType to which the TensorType can be bufferized.
If possible, op bufferization implementations should not use this function and instead infer precise memref types for tensor results by themselves.
Unless a layout map was specified, options.unknownTypeConverterFn
determines what kind of layout map will be used. For best composability (without copies), the fully dynamic layout map is used by default.
Note: Canonicalization patterns could clean up layout maps and infer more precise layout maps after bufferization. However, many possible canonicalizations are currently not implemented.
Definition at line 797 of file BufferizableOpInterface.cpp.
References mlir::get(), and options.
Referenced by mlir::bufferization::detail::defaultGetBufferType().
BaseMemRefType mlir::bufferization::getMemRefTypeWithFullyDynamicLayout | ( | TensorType | tensorType, |
Attribute | memorySpace = nullptr |
||
) |
Return a MemRef type with fully dynamic layout.
If the given tensor type is unranked, return an unranked MemRef type.
Definition at line 821 of file BufferizableOpInterface.cpp.
References mlir::get(), and mlir::Type::getContext().
Referenced by createMemcpy(), mlir::sparse_tensor::LoopEmitter::initializeLoopEmit(), and mlir::bufferization::BufferizationOptions::setFunctionBoundaryTypeConversion().
BaseMemRefType mlir::bufferization::getMemRefTypeWithStaticIdentityLayout | ( | TensorType | tensorType, |
Attribute | memorySpace = nullptr |
||
) |
Return a MemRef type with a static identity layout (i.e., no layout map).
If the given tensor type is unranked, return an unranked MemRef type.
Definition at line 845 of file BufferizableOpInterface.cpp.
References mlir::get().
Referenced by mlir::getBufferizationOptionsForSparsification(), getGlobalFor(), and mlir::bufferization::BufferizationOptions::setFunctionBoundaryTypeConversion().
Region * mlir::bufferization::getNextEnclosingRepetitiveRegion | ( | Region * | region, |
const BufferizationOptions & | options | ||
) |
Assuming that the given region is repetitive, find the next enclosing repetitive region.
Definition at line 132 of file BufferizableOpInterface.cpp.
References mlir::Region::getParentRegion(), isRepetitiveRegion(), and options.
Return the owner of the given value.
In case of a BlockArgument that is the owner of the block. In case of an OpResult that is the defining op.
Definition at line 157 of file BufferizableOpInterface.cpp.
References mlir::Operation::getParentOp().
Referenced by mlir::bufferization::detail::defaultGetBufferType(), mlir::bufferization::BufferizationOptions::dynCastBufferizableOp(), mlir::bufferization::AnalysisState::getAliasingOpOperands(), and mlir::bufferization::OneShotAnalysisState::isWritable().
Region * mlir::bufferization::getParallelRegion | ( | Region * | region, |
const BufferizationOptions & | options | ||
) |
If region
is a parallel region, return region
.
Otherwise, find the first enclosing parallel region of region
. If there is no such region, return "nullptr".
Note: Whether a region is parallel or sequential is queried from the BufferizableOpInterface
.
Definition at line 142 of file BufferizableOpInterface.cpp.
References mlir::Region::getParentOp(), mlir::Region::getParentRegion(), mlir::Region::getRegionNumber(), isRepetitiveRegion(), and options.
SmallVector< func::ReturnOp > mlir::bufferization::getReturnOps | ( | func::FuncOp | funcOp | ) |
Helper function that returns all func.return ops in the given function.
Return all func.return ops in the given function.
Definition at line 23 of file FuncBufferizableOpInterfaceImpl.cpp.
Referenced by foldMemRefCasts().
bool mlir::bufferization::hasTensorSemantics | ( | Operation * | op | ) |
Return "true" if the given op has tensor semantics and should be bufferized.
If the op is bufferizable, the BufferizableOpInterface is queried. Otherwise, an op has tensor semantics if it has tensor operands, tensor op results and/or tensor block arguments.
Definition at line 728 of file BufferizableOpInterface.cpp.
References mlir::bufferization::detail::defaultHasTensorSemantics().
Referenced by mlir::bufferization::OneShotAnalysisState::analyzeOp(), bufferizeOp(), mlir::vector::getMixedSizesXfer(), mlir::linalg::transposeBatchMatmul(), and mlir::linalg::transposeMatmul().
void mlir::bufferization::hoistBuffersFromLoops | ( | Operation * | op | ) |
Within the given operation, hoist buffers from loops where possible.
See "BufferLoopHoistingPass" for more information.
Definition at line 473 of file BufferOptimizations.cpp.
void mlir::bufferization::insertSymbol | ( | Operation * | op, |
BufferizationState & | state | ||
) |
Definition at line 171 of file BufferUtils.cpp.
LogicalResult mlir::bufferization::insertTensorCopies | ( | Operation * | op, |
const AnalysisState & | analysisState, | ||
const BufferizationState & | bufferizationState | ||
) |
Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops.
After applying this transform, the IR can be bufferized without inserting additional buffer allocations.
Definition at line 51 of file TensorCopyInsertion.cpp.
References mlir::WalkResult::advance(), mlir::bufferization::BufferizationOptions::dynCastBufferizableOp(), mlir::Operation::getContext(), mlir::bufferization::AnalysisState::getOptions(), mlir::Operation::getParentWithTrait(), mlir::Operation::hasTrait(), mlir::WalkResult::interrupt(), mlir::OpBuilder::setInsertionPoint(), mlir::WalkResult::skip(), mlir::Operation::walk(), and mlir::WalkResult::wasInterrupted().
LogicalResult mlir::bufferization::insertTensorCopies | ( | Operation * | op, |
const OneShotBufferizationOptions & | options, | ||
const BufferizationState & | bufferizationState, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Resolve RaW and other conflicts by inserting bufferization.alloc_tensor ops.
After applying this transform, the IR can be bufferized without inserting additional buffer allocations.
Definition at line 29 of file TensorCopyInsertion.cpp.
References analyzeModuleOp(), analyzeOp(), and options.
Referenced by bufferizeOp(), and mlir::sparse_tensor::SparsificationAndBufferizationPass::runOnOperation().
void mlir::bufferization::populateBufferizationDeallocLoweringPattern | ( | RewritePatternSet & | patterns, |
const DeallocHelperMap & | deallocHelperFuncMap | ||
) |
Adds the conversion pattern of the bufferization.dealloc
operation to the given pattern set for use in other transformation passes.
Definition at line 543 of file LowerDeallocations.cpp.
References mlir::patterns.
void mlir::bufferization::populateDeallocOpCanonicalizationPatterns | ( | RewritePatternSet & | patterns, |
MLIRContext * | context | ||
) |
Add the canonicalization patterns for bufferization.dealloc to the given pattern set to make them available to other passes (such as BufferDeallocationSimplification).
Definition at line 1182 of file BufferizationOps.cpp.
References mlir::patterns.
void mlir::bufferization::populateDynamicDimSizes | ( | OpBuilder & | b, |
Location | loc, | ||
Value | shapedValue, | ||
SmallVector< Value > & | dynamicDims | ||
) |
Populate dynamicDims
with tensor::DimOp / memref::DimOp results for all dynamic dimensions of the given shaped value.
Definition at line 131 of file BufferizationOps.cpp.
References mlir::OpBuilder::create(), and mlir::Value::getType().
void mlir::bufferization::populateEmptyTensorToAllocTensorPattern | ( | RewritePatternSet & | patterns | ) |
Populate patterns to lower tensor.empty ops to bufferization.alloc_tensor ops.
Definition at line 52 of file EmptyTensorToAllocTensor.cpp.
References mlir::patterns.
LogicalResult mlir::bufferization::promoteBufferResultsToOutParams | ( | ModuleOp | module, |
const BufferResultsToOutParamsOpts & | options | ||
) |
Replace buffers that are returned from a function with an out parameter.
Also update all call sites.
Definition at line 214 of file BufferResultsToOutParams.cpp.
References options, updateCalls(), updateFuncOp(), and updateReturnOps().
void mlir::bufferization::registerBufferizationPipelines | ( | ) |
Registers all pipelines for the bufferization
dialect.
Currently, this includes only the "buffer-deallocation-pipeline".
Definition at line 42 of file BufferizationPipelines.cpp.
References buildBufferDeallocationPipeline().
Referenced by mlir::registerAllPasses().
void mlir::bufferization::registerTransformDialectExtension | ( | DialectRegistry & | registry | ) |
Definition at line 180 of file BufferizationTransformOps.cpp.
References mlir::DialectRegistry::addExtensions().
Referenced by mlir::registerAllExtensions().
void mlir::bufferization::removeBufferizationAttributesInModule | ( | ModuleOp | moduleOp | ) |
Remove bufferization attributes on every FuncOp arguments in the ModuleOp.
Definition at line 514 of file OneShotModuleBufferize.cpp.
References removeBufferizationAttributes().
Referenced by mlir::sparse_tensor::SparsificationAndBufferizationPass::runDenseBufferization().
void mlir::bufferization::removeSymbol | ( | Operation * | op, |
BufferizationState & | state | ||
) |
Definition at line 164 of file BufferUtils.cpp.
void mlir::bufferization::replaceOpWithBufferizedValues | ( | RewriterBase & | rewriter, |
Operation * | op, | ||
ValueRange | values | ||
) |
Replace an op with replacement values.
The op is deleted. Tensor OpResults must be replaced with memref values.
Definition at line 734 of file BufferizableOpInterface.cpp.
References mlir::OpBuilder::create(), mlir::Value::getLoc(), mlir::Operation::getNumResults(), mlir::Operation::getOpResults(), mlir::Value::getType(), mlir::RewriterBase::replaceOp(), and mlir::OpBuilder::setInsertionPointAfter().
Referenced by replaceOpWithNewBufferizedOp().
OpTy mlir::bufferization::replaceOpWithNewBufferizedOp | ( | RewriterBase & | rewriter, |
Operation * | op, | ||
Args &&... | args | ||
) |
Replace an op with a new op.
The new op must have the same number of results as the replaced op. The new op may not return any tensor values.
Definition at line 652 of file BufferizableOpInterface.h.
References mlir::OpBuilder::create(), mlir::Operation::getLoc(), mlir::Operation::getResults(), and replaceOpWithBufferizedValues().
LogicalResult mlir::bufferization::runOneShotBufferize | ( | Operation * | op, |
const OneShotBufferizationOptions & | options, | ||
BufferizationState & | state, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Run One-Shot Bufferize on the given op: Analysis + Bufferization.
Definition at line 1368 of file OneShotAnalysis.cpp.
LogicalResult mlir::bufferization::runOneShotModuleBufferize | ( | ModuleOp | moduleOp, |
const bufferization::OneShotBufferizationOptions & | options, | ||
BufferizationState & | state, | ||
BufferizationStatistics * | statistics = nullptr |
||
) |
Run One-Shot Module Bufferization on the given module.
Performs a simple function call analysis to determine which function arguments are inplaceable. Then analyzes and bufferizes FuncOps one-by-one with One-Shot Bufferize.
Definition at line 588 of file OneShotModuleBufferize.cpp.