MLIR
17.0.0git
|
This class coordinates the application of a rewrite on a set of IR, providing a way for clients to track mutations and create new operations. More...
#include "mlir/IR/PatternMatch.h"
Public Member Functions | |
virtual void | inlineRegionBefore (Region ®ion, Region &parent, Region::iterator before) |
Move the blocks that belong to "region" before the given position in another region "parent". More... | |
void | inlineRegionBefore (Region ®ion, Block *before) |
virtual void | cloneRegionBefore (Region ®ion, Region &parent, Region::iterator before, IRMapping &mapping) |
Clone the blocks that belong to "region" before the given position in another region "parent". More... | |
void | cloneRegionBefore (Region ®ion, Region &parent, Region::iterator before) |
void | cloneRegionBefore (Region ®ion, Block *before) |
virtual void | replaceOpWithIf (Operation *op, ValueRange newValues, bool *allUsesReplaced, llvm::unique_function< bool(OpOperand &) const > functor) |
This method replaces the uses of the results of op with the values in newValues when the provided functor returns true for a specific use. More... | |
void | replaceOpWithIf (Operation *op, ValueRange newValues, llvm::unique_function< bool(OpOperand &) const > functor) |
void | replaceOpWithinBlock (Operation *op, ValueRange newValues, Block *block, bool *allUsesReplaced=nullptr) |
This method replaces the uses of the results of op with the values in newValues when a use is nested within the given block . More... | |
virtual void | replaceOp (Operation *op, ValueRange newValues) |
This method replaces the results of the operation with the specified list of values. More... | |
template<typename OpTy , typename... Args> | |
OpTy | replaceOpWithNewOp (Operation *op, Args &&...args) |
Replaces the result op with a new op that is created without verification. More... | |
virtual void | eraseOp (Operation *op) |
This method erases an operation that is known to have no uses. More... | |
virtual void | eraseBlock (Block *block) |
This method erases all operations in a block. More... | |
virtual void | mergeBlocks (Block *source, Block *dest, ValueRange argValues=std::nullopt) |
Merge the operations of block 'source' into the end of block 'dest'. More... | |
void | mergeBlockBefore (Block *source, Operation *op, ValueRange argValues=std::nullopt) |
virtual Block * | splitBlock (Block *block, Block::iterator before) |
Split the operations starting at "before" (inclusive) out of the given block into a new block, and return it. More... | |
virtual void | startRootUpdate (Operation *op) |
This method is used to notify the rewriter that an in-place operation modification is about to happen. More... | |
virtual void | finalizeRootUpdate (Operation *op) |
This method is used to signal the end of a root update on the given operation. More... | |
virtual void | cancelRootUpdate (Operation *op) |
This method cancels a pending root update. More... | |
template<typename CallableT > | |
void | updateRootInPlace (Operation *root, CallableT &&callable) |
This method is a utility wrapper around a root update of an operation. More... | |
void | replaceAllUsesWith (Value from, Value to) |
Find uses of from and replace them with to . More... | |
void | replaceUseIf (Value from, Value to, llvm::unique_function< bool(OpOperand &) const > functor) |
Find uses of from and replace them with to if the functor returns true. More... | |
void | replaceAllUsesExcept (Value from, Value to, Operation *exceptedUser) |
Find uses of from and replace them with to except if the user is exceptedUser . More... | |
template<typename CallbackT > | |
std::enable_if_t<!std::is_convertible< CallbackT, Twine >::value, LogicalResult > | notifyMatchFailure (Location loc, CallbackT &&reasonCallback) |
Used to notify the rewriter that the IR failed to be rewritten because of a match failure, and provide a callback to populate a diagnostic with the reason why the failure occurred. More... | |
template<typename CallbackT > | |
std::enable_if_t<!std::is_convertible< CallbackT, Twine >::value, LogicalResult > | notifyMatchFailure (Operation *op, CallbackT &&reasonCallback) |
template<typename ArgT > | |
LogicalResult | notifyMatchFailure (ArgT &&arg, const Twine &msg) |
template<typename ArgT > | |
LogicalResult | notifyMatchFailure (ArgT &&arg, const char *msg) |
![]() | |
OpBuilder (MLIRContext *ctx, Listener *listener=nullptr) | |
Create a builder with the given context. More... | |
OpBuilder (Region *region, Listener *listener=nullptr) | |
Create a builder and set the insertion point to the start of the region. More... | |
OpBuilder (Region ®ion, Listener *listener=nullptr) | |
OpBuilder (Operation *op, Listener *listener=nullptr) | |
Create a builder and set insertion point to the given operation, which will cause subsequent insertions to go right before it. More... | |
OpBuilder (Block *block, Block::iterator insertPoint, Listener *listener=nullptr) | |
void | setListener (Listener *newListener) |
Sets the listener of this builder to the one provided. More... | |
Listener * | getListener () const |
Returns the current listener of this builder, or nullptr if this builder doesn't have a listener. More... | |
void | clearInsertionPoint () |
Reset the insertion point to no location. More... | |
InsertPoint | saveInsertionPoint () const |
Return a saved insertion point. More... | |
void | restoreInsertionPoint (InsertPoint ip) |
Restore the insert point to a previously saved point. More... | |
void | setInsertionPoint (Block *block, Block::iterator insertPoint) |
Set the insertion point to the specified location. More... | |
void | setInsertionPoint (Operation *op) |
Sets the insertion point to the specified operation, which will cause subsequent insertions to go right before it. More... | |
void | setInsertionPointAfter (Operation *op) |
Sets the insertion point to the node after the specified operation, which will cause subsequent insertions to go right after it. More... | |
void | setInsertionPointAfterValue (Value val) |
Sets the insertion point to the node after the specified value. More... | |
void | setInsertionPointToStart (Block *block) |
Sets the insertion point to the start of the specified block. More... | |
void | setInsertionPointToEnd (Block *block) |
Sets the insertion point to the end of the specified block. More... | |
Block * | getInsertionBlock () const |
Return the block the current insertion point belongs to. More... | |
Block::iterator | getInsertionPoint () const |
Returns the current insertion point of the builder. More... | |
Block * | getBlock () const |
Returns the current block of the builder. More... | |
Block * | createBlock (Region *parent, Region::iterator insertPt={}, TypeRange argTypes=std::nullopt, ArrayRef< Location > locs=std::nullopt) |
Add new block with 'argTypes' arguments and set the insertion point to the end of it. More... | |
Block * | createBlock (Block *insertBefore, TypeRange argTypes=std::nullopt, ArrayRef< Location > locs=std::nullopt) |
Add new block with 'argTypes' arguments and set the insertion point to the end of it. More... | |
Operation * | insert (Operation *op) |
Insert the given operation at the current insertion point and return it. More... | |
Operation * | create (const OperationState &state) |
Creates an operation given the fields represented as an OperationState. More... | |
Operation * | create (Location loc, StringAttr opName, ValueRange operands, TypeRange types={}, ArrayRef< NamedAttribute > attributes={}, BlockRange successors={}, MutableArrayRef< std::unique_ptr< Region >> regions={}) |
Creates an operation with the given fields. More... | |
template<typename OpTy , typename... Args> | |
OpTy | create (Location location, Args &&...args) |
Create an operation of specific op type at the current insertion point. More... | |
template<typename OpTy , typename... Args> | |
void | createOrFold (SmallVectorImpl< Value > &results, Location location, Args &&...args) |
Create an operation of specific op type at the current insertion point, and immediately try to fold it. More... | |
template<typename OpTy , typename... Args> | |
std::enable_if_t< OpTy::template hasTrait< OpTrait::OneResult >), Value > | createOrFold (Location location, Args &&...args) |
Overload to create or fold a single result operation. More... | |
template<typename OpTy , typename... Args> | |
std::enable_if_t< OpTy::template hasTrait< OpTrait::ZeroResults >), OpTy > | createOrFold (Location location, Args &&...args) |
Overload to create or fold a zero result operation. More... | |
LogicalResult | tryFold (Operation *op, SmallVectorImpl< Value > &results) |
Attempts to fold the given operation and places new results within 'results'. More... | |
Operation * | clone (Operation &op, IRMapping &mapper) |
Creates a deep copy of the specified operation, remapping any operands that use values outside of the operation using the map that is provided ( leaving them alone if no entry is present). More... | |
Operation * | clone (Operation &op) |
Operation * | cloneWithoutRegions (Operation &op, IRMapping &mapper) |
Creates a deep copy of this operation but keep the operation regions empty. More... | |
Operation * | cloneWithoutRegions (Operation &op) |
template<typename OpT > | |
OpT | cloneWithoutRegions (OpT op) |
![]() | |
Builder (MLIRContext *context) | |
Builder (Operation *op) | |
MLIRContext * | getContext () const |
Location | getUnknownLoc () |
Location | getFusedLoc (ArrayRef< Location > locs, Attribute metadata=Attribute()) |
FloatType | getFloat8E5M2Type () |
FloatType | getFloat8E4M3FNType () |
FloatType | getBF16Type () |
FloatType | getF16Type () |
FloatType | getF32Type () |
FloatType | getF64Type () |
FloatType | getF80Type () |
FloatType | getF128Type () |
IndexType | getIndexType () |
IntegerType | getI1Type () |
IntegerType | getI2Type () |
IntegerType | getI4Type () |
IntegerType | getI8Type () |
IntegerType | getI16Type () |
IntegerType | getI32Type () |
IntegerType | getI64Type () |
IntegerType | getIntegerType (unsigned width) |
IntegerType | getIntegerType (unsigned width, bool isSigned) |
FunctionType | getFunctionType (TypeRange inputs, TypeRange results) |
TupleType | getTupleType (TypeRange elementTypes) |
NoneType | getNoneType () |
template<typename Ty , typename... Args> | |
Ty | getType (Args &&...args) |
Get or construct an instance of the type Ty with provided arguments. More... | |
template<typename Attr , typename... Args> | |
Attr | getAttr (Args &&...args) |
Get or construct an instance of the attribute Attr with provided arguments. More... | |
NamedAttribute | getNamedAttr (StringRef name, Attribute val) |
UnitAttr | getUnitAttr () |
BoolAttr | getBoolAttr (bool value) |
DictionaryAttr | getDictionaryAttr (ArrayRef< NamedAttribute > value) |
IntegerAttr | getIntegerAttr (Type type, int64_t value) |
IntegerAttr | getIntegerAttr (Type type, const APInt &value) |
FloatAttr | getFloatAttr (Type type, double value) |
FloatAttr | getFloatAttr (Type type, const APFloat &value) |
StringAttr | getStringAttr (const Twine &bytes) |
ArrayAttr | getArrayAttr (ArrayRef< Attribute > value) |
Attribute | getZeroAttr (Type type) |
FloatAttr | getF16FloatAttr (float value) |
FloatAttr | getF32FloatAttr (float value) |
FloatAttr | getF64FloatAttr (double value) |
IntegerAttr | getI8IntegerAttr (int8_t value) |
IntegerAttr | getI16IntegerAttr (int16_t value) |
IntegerAttr | getI32IntegerAttr (int32_t value) |
IntegerAttr | getI64IntegerAttr (int64_t value) |
IntegerAttr | getIndexAttr (int64_t value) |
IntegerAttr | getSI32IntegerAttr (int32_t value) |
Signed and unsigned integer attribute getters. More... | |
IntegerAttr | getUI32IntegerAttr (uint32_t value) |
DenseIntElementsAttr | getBoolVectorAttr (ArrayRef< bool > values) |
Vector-typed DenseIntElementsAttr getters. values must not be empty. More... | |
DenseIntElementsAttr | getI32VectorAttr (ArrayRef< int32_t > values) |
DenseIntElementsAttr | getI64VectorAttr (ArrayRef< int64_t > values) |
DenseIntElementsAttr | getIndexVectorAttr (ArrayRef< int64_t > values) |
DenseIntElementsAttr | getI32TensorAttr (ArrayRef< int32_t > values) |
Tensor-typed DenseIntElementsAttr getters. More... | |
DenseIntElementsAttr | getI64TensorAttr (ArrayRef< int64_t > values) |
DenseIntElementsAttr | getIndexTensorAttr (ArrayRef< int64_t > values) |
DenseBoolArrayAttr | getDenseBoolArrayAttr (ArrayRef< bool > values) |
Tensor-typed DenseArrayAttr getters. More... | |
DenseI8ArrayAttr | getDenseI8ArrayAttr (ArrayRef< int8_t > values) |
DenseI16ArrayAttr | getDenseI16ArrayAttr (ArrayRef< int16_t > values) |
DenseI32ArrayAttr | getDenseI32ArrayAttr (ArrayRef< int32_t > values) |
DenseI64ArrayAttr | getDenseI64ArrayAttr (ArrayRef< int64_t > values) |
DenseF32ArrayAttr | getDenseF32ArrayAttr (ArrayRef< float > values) |
DenseF64ArrayAttr | getDenseF64ArrayAttr (ArrayRef< double > values) |
ArrayAttr | getAffineMapArrayAttr (ArrayRef< AffineMap > values) |
ArrayAttr | getBoolArrayAttr (ArrayRef< bool > values) |
ArrayAttr | getI32ArrayAttr (ArrayRef< int32_t > values) |
ArrayAttr | getI64ArrayAttr (ArrayRef< int64_t > values) |
ArrayAttr | getIndexArrayAttr (ArrayRef< int64_t > values) |
ArrayAttr | getF32ArrayAttr (ArrayRef< float > values) |
ArrayAttr | getF64ArrayAttr (ArrayRef< double > values) |
ArrayAttr | getStrArrayAttr (ArrayRef< StringRef > values) |
ArrayAttr | getTypeArrayAttr (TypeRange values) |
AffineExpr | getAffineDimExpr (unsigned position) |
AffineExpr | getAffineSymbolExpr (unsigned position) |
AffineExpr | getAffineConstantExpr (int64_t constant) |
AffineMap | getEmptyAffineMap () |
Returns a zero result affine map with no dimensions or symbols: () -> (). More... | |
AffineMap | getConstantAffineMap (int64_t val) |
Returns a single constant result affine map with 0 dimensions and 0 symbols. More... | |
AffineMap | getDimIdentityMap () |
AffineMap | getMultiDimIdentityMap (unsigned rank) |
AffineMap | getSymbolIdentityMap () |
AffineMap | getSingleDimShiftAffineMap (int64_t shift) |
Returns a map that shifts its (single) input dimension by 'shift'. More... | |
AffineMap | getShiftedAffineMap (AffineMap map, int64_t shift) |
Returns an affine map that is a translation (shift) of all result expressions in 'map' by 'shift'. More... | |
![]() | |
virtual | ~Listener () |
virtual void | notifyOperationInserted (Operation *op) |
Notification handler for when an operation is inserted into the builder. More... | |
virtual void | notifyBlockCreated (Block *block) |
Notification handler for when a block is created using the builder. More... | |
Protected Member Functions | |
RewriterBase (MLIRContext *ctx) | |
Initialize the builder with this rewriter as the listener. More... | |
RewriterBase (const OpBuilder &otherBuilder) | |
~RewriterBase () override | |
virtual void | notifyRootReplaced (Operation *op, ValueRange replacement) |
These are the callback methods that subclasses can choose to implement if they would like to be notified about certain types of mutations. More... | |
virtual void | notifyOperationRemoved (Operation *op) |
This is called on an operation that a rewrite is removing, right before the operation is deleted. More... | |
virtual LogicalResult | notifyMatchFailure (Location loc, function_ref< void(Diagnostic &)> reasonCallback) |
Notify the rewriter that the pattern failed to match the given operation, and provide a callback to populate a diagnostic with the reason why the failure occurred. More... | |
Additional Inherited Members | |
![]() | |
static OpBuilder | atBlockBegin (Block *block, Listener *listener=nullptr) |
Create a builder and set the insertion point to before the first operation in the block but still inside the block. More... | |
static OpBuilder | atBlockEnd (Block *block, Listener *listener=nullptr) |
Create a builder and set the insertion point to after the last operation in the block but still inside the block. More... | |
static OpBuilder | atBlockTerminator (Block *block, Listener *listener=nullptr) |
Create a builder and set the insertion point to before the block terminator. More... | |
![]() | |
MLIRContext * | context |
This class coordinates the application of a rewrite on a set of IR, providing a way for clients to track mutations and create new operations.
This class serves as a common API for IR mutation between pattern rewrites and non-pattern rewrites, and facilitates the development of shared IR transformation utilities.
Definition at line 399 of file PatternMatch.h.
|
inlineexplicitprotected |
Initialize the builder with this rewriter as the listener.
Definition at line 559 of file PatternMatch.h.
|
inlineexplicitprotected |
Definition at line 560 of file PatternMatch.h.
References mlir::OpBuilder::setListener().
|
overrideprotected |
Definition at line 220 of file PatternMatch.cpp.
|
inlinevirtual |
This method cancels a pending root update.
This can only be called on operations that were provided to a call to startRootUpdate
.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 493 of file PatternMatch.h.
Definition at line 397 of file PatternMatch.cpp.
References cloneRegionBefore(), and mlir::Block::getParent().
void RewriterBase::cloneRegionBefore | ( | Region & | region, |
Region & | parent, | ||
Region::iterator | before | ||
) |
Definition at line 392 of file PatternMatch.cpp.
References cloneRegionBefore().
|
virtual |
Clone the blocks that belong to "region" before the given position in another region "parent".
The two regions must be different. The caller is responsible for creating or updating the operation transferring flow of control to the region and passing it the correct block arguments.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 387 of file PatternMatch.cpp.
References mlir::Region::cloneInto().
Referenced by cloneRegionBefore(), mlir::ConversionPatternRewriter::cloneRegionBefore(), fuseWithReshapeByExpansion(), inlineIfCase(), and inlineWhileCase().
|
virtual |
This method erases all operations in a block.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 281 of file PatternMatch.cpp.
References mlir::Block::erase(), eraseOp(), and mlir::Operation::use_empty().
Referenced by mlir::eraseUnreachableBlocks(), inlineIfCase(), inlineWhileCase(), and moveRegionToNewWarpOpAndReplaceReturns().
|
virtual |
This method erases an operation that is known to have no uses.
The uses of the given operation must be known to be dead.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 275 of file PatternMatch.cpp.
References mlir::Operation::erase(), notifyOperationRemoved(), and mlir::Operation::use_empty().
Referenced by deleteDeadness(), eraseBlock(), mlir::linalg::fuseElementwiseOps(), genForeachOnSparseConstant(), inlineIfCase(), inlineWhileCase(), mlir::sparse_tensor::insertYieldOp(), mlir::transform::gpu::mapForeachToBlocksImpl(), AllocaScopeInliner::matchAndRewrite(), MultiBlockExecuteInliner::matchAndRewrite(), VectorizeConvolution::matchAndRewrite(), mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), mlir::linalg::LinalgCopyVTWForwardingPattern::matchAndRewrite(), mlir::outlineSingleBlockRegion(), mlir::scf::ForLoopPipeliningPattern::returningMatchAndRewrite(), rewriteOneForeachThreadToGpuThreads(), simplifyBrToBlockWithSinglePred(), mlir::vector::splitFullAndPartialTransfer(), tileAndFuseFirstExtractUseThroughContainingOpBlockArgument(), mlir::linalg::tileReductionUsingForeachThread(), tileToForeachThreadOpImpl(), mlir::linalg::vectorize(), and yieldTiledValues().
|
inlinevirtual |
This method is used to signal the end of a root update on the given operation.
This can only be called on operations that were provided to a call to startRootUpdate
.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 489 of file PatternMatch.h.
Referenced by mlir::linalg::interchangeGenericOp(), and updateRootInPlace().
Definition at line 379 of file PatternMatch.cpp.
References mlir::Block::getParent(), and inlineRegionBefore().
|
virtual |
Move the blocks that belong to "region" before the given position in another region "parent".
Move the blocks that belong to "region" before the given position in another region.
The two regions must be different. The caller is responsible for creating or updating the operation transferring flow of control to the region and passing it the correct block arguments.
The two regions must be different. The caller is in charge to update create the operation transferring the control flow to the region and pass it the correct block arguments.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 375 of file PatternMatch.cpp.
References mlir::Region::getBlocks().
Referenced by createDecl(), mlir::linalg::generalizeNamedOp(), inlineRegionBefore(), mlir::ConversionPatternRewriter::inlineRegionBefore(), MultiBlockExecuteInliner::matchAndRewrite(), moveRegionToNewWarpOpAndReplaceReturns(), mlir::linalg::splitReduction(), mlir::linalg::splitReductionByScaling(), and wrapInExecuteRegion().
void RewriterBase::mergeBlockBefore | ( | Block * | source, |
Operation * | op, | ||
ValueRange | argValues = std::nullopt |
||
) |
Definition at line 334 of file PatternMatch.cpp.
References mlir::Operation::getBlock(), mlir::Block::hasNoPredecessors(), mlir::Block::hasNoSuccessors(), mergeBlocks(), and splitBlock().
Referenced by genForeachOnSparseConstant(), mlir::sparse_tensor::insertYieldOp(), and AllocaScopeInliner::matchAndRewrite().
|
virtual |
Merge the operations of block 'source' into the end of block 'dest'.
'source's predecessors must either be empty or only contain 'dest‘. 'argValues’ is used to replace the block arguments of 'source' after merging.
'source's predecessors must be empty or only contain 'dest‘. 'argValues’ is used to replace the block arguments of 'source' after merging.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 293 of file PatternMatch.cpp.
References mlir::IRObjectWithUseList< OperandType >::dropAllUses(), mlir::Block::end(), mlir::Block::erase(), mlir::Block::getArguments(), mlir::Block::getNumArguments(), mlir::Block::getOperations(), and mlir::Block::getPredecessors().
Referenced by mlir::linalg::collapseGenericOpIterationDims(), mergeBlockBefore(), mlir::outlineSingleBlockRegion(), and simplifyBrToBlockWithSinglePred().
|
inline |
Definition at line 553 of file PatternMatch.h.
References notifyMatchFailure().
|
inline |
Definition at line 548 of file PatternMatch.h.
References diag(), and notifyMatchFailure().
|
inline |
Used to notify the rewriter that the IR failed to be rewritten because of a match failure, and provide a callback to populate a diagnostic with the reason why the failure occurred.
This method allows for derived rewriters to optionally hook into the reason why a rewrite failed, and display it to users.
Definition at line 533 of file PatternMatch.h.
References mlir::failure().
Referenced by mlir::tosa::checkHasDynamicBatchDims(), mlir::linalg::collapseGenericOpIterationDims(), createLinalgBodyCalculationForElementwiseOp(), elementwiseMatchAndRewriteHelper(), mlir::linalg::fuseElementwiseOps(), fuseWithReshapeByExpansion(), mlir::linalg::generalizeNamedOp(), getLibraryCallSymbolRef(), insertCasts(), mlir::linalg::interchangeGenericOp(), isGenericOpExpandable(), mlir::scf::lowerToLoopsUsingSCFForOp(), mlir::math::ErfPolynomialApproximation::matchAndRewrite(), mlir::linalg::GeneralizeOuterUnitDimsPackOpPattern::matchAndRewrite(), mlir::linalg::GeneralizeOuterUnitDimsUnPackOpPattern::matchAndRewrite(), MaterializePadValue::matchAndRewrite(), ReshapeConstOptimization::matchAndRewrite(), TransposeIsReshape::matchAndRewrite(), ConsolidateTransposeOptimization::matchAndRewrite(), mlir::vector::ContractionOpLowering::matchAndRewrite(), mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), TransferWriteToVectorStoreLowering::matchAndRewrite(), mlir::linalg::LinalgCopyVTWForwardingPattern::matchAndRewrite(), TransposeOpLowering::matchAndRewrite(), notifyMatchFailure(), mlir::linalg::pack(), packGemmGreedily(), mlir::linalg::packTranspose(), processParallelLoop(), reduceMatchAndRewriteHelper(), mlir::linalg::splitReduction(), mlir::linalg::splitReductionByScaling(), mlir::scf::tileConsumerAndFuseProducerGreedilyUsingSCFForOp(), mlir::linalg::tileReductionUsingForeachThread(), mlir::scf::tileReductionUsingScf(), mlir::scf::tileUsingSCFForOp(), and mlir::detail::pdl_function_builder::verifyAsArgs().
|
inlineprotectedvirtual |
Notify the rewriter that the pattern failed to match the given operation, and provide a callback to populate a diagnostic with the reason why the failure occurred.
This method allows for derived rewriters to optionally hook into the reason why a rewrite failed, and display it to users.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 583 of file PatternMatch.h.
References mlir::failure().
|
inline |
Definition at line 543 of file PatternMatch.h.
References mlir::Operation::getLoc(), and notifyMatchFailure().
|
inlineprotectedvirtual |
This is called on an operation that a rewrite is removing, right before the operation is deleted.
At this point, the operation has zero uses.
Definition at line 576 of file PatternMatch.h.
Referenced by eraseOp(), and replaceOp().
|
inlineprotectedvirtual |
These are the callback methods that subclasses can choose to implement if they would like to be notified about certain types of mutations.
Notify the rewriter that the specified operation is about to be replaced with the set of values potentially produced by new operations. This is called before the uses of the operation have been changed.
Definition at line 572 of file PatternMatch.h.
Referenced by replaceOp(), and replaceOpWithIf().
|
inline |
Find uses of from
and replace them with to
except if the user is exceptedUser
.
It also marks every modified uses and notifies the rewriter that an in-place operation modification is about to happen.
Definition at line 519 of file PatternMatch.h.
References mlir::detail::IROperandBase::getOwner(), and replaceUseIf().
Referenced by VectorizationState::maskOperation().
Find uses of from
and replace them with to
.
Find uses of from
and replace it with to
It also marks every modified uses and notifies the rewriter that an in-place operation modification is about to happen.
Definition at line 313 of file PatternMatch.cpp.
References mlir::Value::getUses(), and updateRootInPlace().
Referenced by mlir::transform::gpu::mapForeachToBlocksImpl(), FoldLaunchArguments::matchAndRewrite(), rewriteOneForeachThreadToGpuThreads(), and mlir::scf::tileAndFuseProducerOfSlice().
|
virtual |
This method replaces the results of the operation with the specified list of values.
The number of provided values must match the number of results of the operation.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 261 of file PatternMatch.cpp.
References mlir::Operation::erase(), mlir::Operation::getNumResults(), notifyOperationRemoved(), notifyRootReplaced(), and mlir::Operation::replaceAllUsesWith().
Referenced by applyTilingToAll(), convertAffineApply(), convertCtlzOp(), mlir::bufferization::dropEquivalentBufferResults(), elementwiseMatchAndRewriteHelper(), mlir::bufferization::eliminateEmptyTensors(), mlir::bufferization::foldToMemrefToTensorPair(), mlir::linalg::generalizeNamedOp(), generateCollapsedIndexingRegion(), genForeachOnSparseConstant(), CanonicalizeContractAdd< AddOpType >::matchAndRewrite(), AllocaScopeInliner::matchAndRewrite(), AllocaScopeHoister::matchAndRewrite(), FoldTensorCastProducerOp::matchAndRewrite(), MultiBlockExecuteInliner::matchAndRewrite(), Convert1DExtractStridedSliceIntoExtractInsertChain::matchAndRewrite(), DecomposeNDExtractStridedSlice::matchAndRewrite(), ConvertSameRankInsertStridedSliceIntoShuffle::matchAndRewrite(), VectorizeConvolution::matchAndRewrite(), mlir::math::ErfPolynomialApproximation::matchAndRewrite(), mlir::linalg::ExtractSliceOfPadTensorSwapPattern::matchAndRewrite(), mlir::linalg::GeneralizeOuterUnitDimsPackOpPattern::matchAndRewrite(), mlir::linalg::GeneralizeOuterUnitDimsUnPackOpPattern::matchAndRewrite(), AddZeroOptimization::matchAndRewrite(), ClampIsNoOp::matchAndRewrite(), ConcatOptimization::matchAndRewrite(), MaxPool2dIsNoOp::matchAndRewrite(), MulOneOptimization::matchAndRewrite(), mlir::vector::ContractionOpToMatmulOpLowering::matchAndRewrite(), mlir::vector::ContractionOpToOuterProductOpLowering::matchAndRewrite(), mlir::vector::ContractionOpToDotLowering::matchAndRewrite(), mlir::vector::ContractionOpLowering::matchAndRewrite(), VectorCreateMaskOpConversion::matchAndRewrite(), InnerOuterDimReductionConversion::matchAndRewrite(), ReduceMultiDimReductionRank::matchAndRewrite(), TwoDimMultiReductionToElementWise::matchAndRewrite(), TwoDimMultiReductionToReduction::matchAndRewrite(), TransferReadToVectorLoadLowering::matchAndRewrite(), mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), TransposeOpLowering::matchAndRewrite(), moveRegionToNewWarpOpAndAppendReturns(), SliceCanonicalizer::operator()(), mlir::linalg::pack(), mlir::linalg::packTranspose(), replaceIndexOpsByInductionVariables(), mlir::bufferization::replaceOpWithBufferizedValues(), mlir::linalg::DownscaleSizeOneWindowed2DConvolution< Conv2DOp, Conv1DOp >::returningMatchAndRewrite(), mlir::linalg::DownscaleDepthwiseConv2DNhwcHwcOp::returningMatchAndRewrite(), mlir::scf::ForLoopPipeliningPattern::returningMatchAndRewrite(), mlir::linalg::LinalgPaddingPattern::returningMatchAndRewrite(), PadOpVectorizationWithTransferWritePattern::rewriteUser(), mlir::tensor::simplifyCollapseShapeWithRankReducingExtractSlice(), mlir::linalg::splitOp(), mlir::linalg::splitReduction(), mlir::linalg::splitReductionByScaling(), tileAndFuseFirstExtractUse(), tileAndFuseFirstExtractUseThroughContainingOpBlockArgument(), mlir::linalg::tileReductionUsingForeachThread(), mlir::scf::tileReductionUsingScf(), mlir::transform::tileToForeachThreadOpImpl(), transposeOneLinalgOperandAndReplace(), updateExpandedGenericOpRegion(), mlir::linalg::vectorize(), mlir::linalg::vectorizeCopy(), and wrapInExecuteRegion().
|
virtual |
This method replaces the uses of the results of op
with the values in newValues
when the provided functor
returns true for a specific use.
The number of values in newValues
is required to match the number of results of op
. allUsesReplaced
, if non-null, is set to true if all of the uses of op
were replaced. Note that in some rewriters, the given 'functor' may be stored beyond the lifetime of the rewrite being applied. As such, the function should not capture by reference and instead use value capture as necessary.
The number of values in newValues
is required to match the number of results of op
.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 228 of file PatternMatch.cpp.
References mlir::Operation::getNumResults(), mlir::Operation::getResults(), and notifyRootReplaced().
Referenced by mlir::linalg::offsetIndices(), replaceOpWithIf(), and replaceOpWithinBlock().
|
inline |
Definition at line 430 of file PatternMatch.h.
References replaceOpWithIf().
void RewriterBase::replaceOpWithinBlock | ( | Operation * | op, |
ValueRange | newValues, | ||
Block * | block, | ||
bool * | allUsesReplaced = nullptr |
||
) |
This method replaces the uses of the results of op
with the values in newValues
when a use is nested within the given block
.
The number of values in newValues
is required to match the number of results of op
. If all uses of this operation are replaced, the operation is erased.
Definition at line 251 of file PatternMatch.cpp.
References mlir::detail::IROperandBase::getOwner(), mlir::Block::getParentOp(), and replaceOpWithIf().
|
inline |
Replaces the result op with a new op that is created without verification.
The result values of the two ops must be the same types.
Definition at line 451 of file PatternMatch.h.
References mlir::Operation::getLoc().
Referenced by canonicalizeMinMaxOp(), convertTanhOp(), createDecl(), createElementwiseOp(), dropSwitchCasesThatMatchDefault(), foldSwitch(), mlir::bufferization::foldToMemrefToTensorPair(), genResult(), insertCasts(), mlir::linalg::interchangeGenericOp(), matchAndReplaceDepthwiseConv(), SelectI1Simplify::matchAndRewrite(), SelectToExtUI::matchAndRewrite(), CmpFIntToFPConst::matchAndRewrite(), mlir::ComposeCollapseOfExpandOp< CollapseOpTy, ExpandOpTy, CastOpTy >::matchAndRewrite(), CollapseShapeOpMemRefCastFolder::matchAndRewrite(), mlir::ComposeExpandOfCollapseOp< ExpandOpTy, CollapseOpTy >::matchAndRewrite(), Convert1DExtractStridedSliceIntoShuffle::matchAndRewrite(), mlir::GPUReturnOpLowering::matchAndRewrite(), DecomposeDifferentRankInsertStridedSlice::matchAndRewrite(), ConvertSameRankInsertStridedSliceIntoShuffle::matchAndRewrite(), mlir::linalg::LinalgOpToLibraryCallRewrite::matchAndRewrite(), mlir::ComposeReassociativeReshapeOps< ReshapeOpTy >::matchAndRewrite(), ConvertAccessChain::matchAndRewrite(), ConvertAddressOf::matchAndRewrite(), ConvertStore::matchAndRewrite(), DeduplicateAffineMinMaxExpressions< T >::matchAndRewrite(), MergeAffineMinMaxOp< T >::matchAndRewrite(), CanonicalizeAffineMinMaxOpExprAndTermOrder< T >::matchAndRewrite(), CanonicalizeSingleResultAffineMinMaxOp< T >::matchAndRewrite(), SwapExtractSliceOfFill::matchAndRewrite(), mlir::linalg::PadOpTransformationPattern::matchAndRewrite(), mlir::linalg::GeneralizePadOpPattern::matchAndRewrite(), ClampClampOptimization::matchAndRewrite(), ConcatOptimization::matchAndRewrite(), MaterializePadValue::matchAndRewrite(), ReshapeReshapeOptimization::matchAndRewrite(), ReshapeConstOptimization::matchAndRewrite(), TransposeIsReshape::matchAndRewrite(), ConsolidateTransposeOptimization::matchAndRewrite(), BubbleUpBitCastForStridedSliceInsert::matchAndRewrite(), mlir::nvgpu::PrepareContractToGPUMMASync::matchAndRewrite(), BubbleDownVectorBitCastForExtract::matchAndRewrite(), BubbleDownBitCastForStridedSliceExtract::matchAndRewrite(), VectorLoadToMemrefLoadLowering::matchAndRewrite(), ReduceMultiDimReductionRank::matchAndRewrite(), OneDimMultiReductionToTwoDim::matchAndRewrite(), VectorStoreToMemrefStoreLowering::matchAndRewrite(), TransferReadPermutationLowering::matchAndRewrite(), TransferOpReduceRank::matchAndRewrite(), TransferReadToVectorLoadLowering::matchAndRewrite(), TransferWritePermutationLowering::matchAndRewrite(), TransferWriteNonPermutationLowering::matchAndRewrite(), TransferWriteToVectorStoreLowering::matchAndRewrite(), matchAndRewriteSortOp(), SubViewCanonicalizer::operator()(), reduceMatchAndRewriteHelper(), replaceUnitDimIndexOps(), replaceWithLoadOrStore(), PadOpVectorizationWithInsertSlicePattern::rewriteUser(), PadOpVectorizationWithTransferWritePattern::rewriteUser(), mlir::tensor::simplifyCollapseShapeWithRankReducingExtractSlice(), simplifyPassThroughBr(), simplifyPassThroughSwitch(), simplifySwitchFromDefaultSwitchOnSameCondition(), simplifySwitchFromSwitchOnSameCondition(), simplifySwitchWithOnlyDefault(), and GenericPadOpVectorizationPattern::tryVectorizeCopy().
void RewriterBase::replaceUseIf | ( | Value | from, |
Value | to, | ||
llvm::unique_function< bool(OpOperand &) const > | functor | ||
) |
Find uses of from
and replace them with to
if the functor
returns true.
It also marks every modified uses and notifies the rewriter that an in-place operation modification is about to happen.
Definition at line 323 of file PatternMatch.cpp.
References mlir::Value::getUses(), and updateRootInPlace().
Referenced by replaceAllUsesExcept().
|
virtual |
Split the operations starting at "before" (inclusive) out of the given block into a new block, and return it.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 356 of file PatternMatch.cpp.
References mlir::Block::splitBlock().
Referenced by MultiBlockExecuteInliner::matchAndRewrite(), mergeBlockBefore(), and mlir::ConversionPatternRewriter::splitBlock().
|
inlinevirtual |
This method is used to notify the rewriter that an in-place operation modification is about to happen.
A call to this function must be followed by a call to either finalizeRootUpdate
or cancelRootUpdate
. This is a minor efficiency win (it avoids creating a new operation and removing the old one) but also often allows simpler code in the client.
Reimplemented in mlir::ConversionPatternRewriter.
Definition at line 484 of file PatternMatch.h.
Referenced by mlir::linalg::interchangeGenericOp(), and updateRootInPlace().
|
inline |
This method is a utility wrapper around a root update of an operation.
It wraps calls to startRootUpdate
and finalizeRootUpdate
around the given callable.
Definition at line 499 of file PatternMatch.h.
References finalizeRootUpdate(), and startRootUpdate().
Referenced by cloneAndFuseFirstUse(), convertFuncOpTypes(), CollapseShapeOpMemRefCastFolder::matchAndRewrite(), MaterializeTransferMask< ConcreteOp >::matchAndRewrite(), SortCommutativeOperands::matchAndRewrite(), moveRegionToNewWarpOpAndReplaceReturns(), peelForLoop(), replaceAllUsesWith(), replaceUseIf(), PadOpVectorizationWithTransferReadPattern::rewriteUser(), mlir::vector::splitFullAndPartialTransfer(), mlir::linalg::splitOp(), tileAndFuseFirstExtractUseThroughContainingOpBlockArgument(), and mlir::linalg::tileReductionUsingForeachThread().