MLIR: mlir::RewriterBase Class Reference (original) (raw)

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...

Public Member Functions

void

inlineRegionBefore (Region &region, Region &parent, Region::iterator before)

Move the blocks that belong to "region" before the given position in another region "parent". More...

void

inlineRegionBefore (Region &region, Block *before)

virtual void

replaceOp (Operation *op, ValueRange newValues)

Replace the results of the given (original) operation with the specified list of values (replacements). More...

virtual void

replaceOp (Operation *op, Operation *newOp)

Replace the results of the given (original) operation with the specified new op (replacement). More...

template<typename OpTy , typename... Args>

OpTy

replaceOpWithNewOp (Operation *op, Args &&...args)

Replace the results of the given (original) op with a new op that is created without verification (replacement). 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

inlineBlockBefore (Block *source, Block *dest, Block::iterator before, ValueRange argValues=std::nullopt)

Inline the operations of block 'source' into block 'dest' before the given position. More...

void

inlineBlockBefore (Block *source, Operation *op, ValueRange argValues=std::nullopt)

Inline the operations of block 'source' before the operation 'op'. More...

void

mergeBlocks (Block *source, Block *dest, ValueRange argValues=std::nullopt)

Inline the operations of block 'source' into the end of block 'dest'. More...

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...

void

moveOpBefore (Operation *op, Operation *existingOp)

Unlink this operation from its current block and insert it right before existingOp which may be in the same or another block in the same function. More...

void

moveOpBefore (Operation *op, Block *block, Block::iterator iterator)

Unlink this operation from its current block and insert it right before iterator in the specified block. More...

void

moveOpAfter (Operation *op, Operation *existingOp)

Unlink this operation from its current block and insert it right after existingOp which may be in the same or another block in the same function. More...

void

moveOpAfter (Operation *op, Block *block, Block::iterator iterator)

Unlink this operation from its current block and insert it right after iterator in the specified block. More...

void

moveBlockBefore (Block *block, Block *anotherBlock)

Unlink this block and insert it right before existingBlock. More...

void

moveBlockBefore (Block *block, Region *region, Region::iterator iterator)

Unlink this block and insert it right before the location that the given iterator points to in the given region. More...

virtual void

startOpModification (Operation *op)

This method is used to notify the rewriter that an in-place operation modification is about to happen. More...

virtual void

finalizeOpModification (Operation *op)

This method is used to signal the end of an in-place modification of the given operation. More...

virtual void

cancelOpModification (Operation *op)

This method cancels a pending in-place modification. More...

template

void

modifyOpInPlace (Operation *root, CallableT &&callable)

This method is a utility wrapper around an in-place modification of an operation. More...

void

replaceAllUsesWith (Value from, Value to)

Find uses of from and replace them with to. More...

void

replaceAllUsesWith (Block *from, Block *to)

void

replaceAllUsesWith (ValueRange from, ValueRange to)

void

replaceAllOpUsesWith (Operation *from, ValueRange to)

Find uses of from and replace them with to. More...

void

replaceAllOpUsesWith (Operation *from, Operation *to)

void

replaceUsesWithIf (Value from, Value to, function_ref< bool(OpOperand &)> functor, bool *allUsesReplaced=nullptr)

Find uses of from and replace them with to if the functor returns true. More...

void

replaceUsesWithIf (ValueRange from, ValueRange to, function_ref< bool(OpOperand &)> functor, bool *allUsesReplaced=nullptr)

void

replaceOpUsesWithIf (Operation *from, ValueRange to, function_ref< bool(OpOperand &)> functor, bool *allUsesReplaced=nullptr)

void

replaceOpUsesWithinBlock (Operation *op, ValueRange newValues, Block *block, bool *allUsesReplaced=nullptr)

Find uses of from within block and replace them with to. 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...

void

replaceAllUsesExcept (Value from, Value to, const SmallPtrSetImpl< Operation * > &preservedUsers)

template

std::enable_if_t<!std::is_convertible< CallbackT, Twine >::value, LogicalResult >

notifyMatchFailure (Location loc, CallbackT &&reasonCallback)

Used to notify the listener 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

std::enable_if_t<!std::is_convertible< CallbackT, Twine >::value, LogicalResult >

notifyMatchFailure (Operation *op, CallbackT &&reasonCallback)

template

LogicalResult

notifyMatchFailure (ArgT &&arg, const Twine &msg)

template

LogicalResult

notifyMatchFailure (ArgT &&arg, const char *msg)

- Public Member Functions inherited from mlir::OpBuilder

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 &region, 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, SmallVectorImpl< Operation * > *materializedConstants=nullptr)

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

OpT

cloneWithoutRegions (OpT op)

void

cloneRegionBefore (Region &region, 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 &region, Region &parent, Region::iterator before)

void

cloneRegionBefore (Region &region, Block *before)

- Public Member Functions inherited from mlir::Builder

Builder (MLIRContext *context)

Builder (Operation *op)

MLIRContext *

getContext () const

Location

getUnknownLoc ()

Location

getFusedLoc (ArrayRef< Location > locs, Attribute metadata=Attribute())

FloatType

getF8E8M0Type ()

FloatType

getBF16Type ()

FloatType

getF16Type ()

FloatType

getTF32Type ()

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)

TypedAttr

getZeroAttr (Type type)

TypedAttr

getOneAttr (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)

DenseFPElementsAttr

getF32VectorAttr (ArrayRef< float > values)

DenseFPElementsAttr

getF64VectorAttr (ArrayRef< double > 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...

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 358 of file PatternMatch.h.

Inline the operations of block 'source' into block 'dest' before the given position.

The source block will be deleted and must have no uses. 'argValues' is used to replace the block arguments of 'source'.

If the source block is inserted at the end of the dest block, the dest block must have no successors. Similarly, if the source block is inserted somewhere in the middle (or beginning) of the dest block, the source block must have no successors. Otherwise, the resulting IR would have unreachable operations.

Reimplemented in mlir::ConversionPatternRewriter.

Definition at line 287 of file PatternMatch.cpp.

References mlir::Block::empty(), mlir::Block::end(), eraseBlock(), mlir::Block::front(), mlir::Block::getArguments(), mlir::Block::getNumArguments(), mlir::Block::getOperations(), mlir::Block::hasNoPredecessors(), mlir::Block::hasNoSuccessors(), mlir::OpBuilder::listener, moveOpBefore(), and replaceAllUsesWith().

Referenced by mlir::coalesceLoops(), fuseIfLegal(), genForeachOnSparseConstant(), inlineBlockBefore(), mlir::sparse_tensor::insertYieldOp(), AllocaScopeInliner::matchAndRewrite(), mergeBlocks(), mlir::scf::promote(), and replaceOpWithRegion().

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.

Definition at line 368 of file PatternMatch.cpp.

References mlir::Region::empty(), mlir::Region::front(), mlir::Region::getBlocks(), mlir::OpBuilder::listener, and moveBlockBefore().

Referenced by mlir::convertFuncOpToLLVMFuncOp(), createDecl(), mlir::linalg::dropUnitDims(), mlir::linalg::generalizeNamedOp(), inlineRegionBefore(), lowerAsEntryFunction(), MultiBlockExecuteInliner::matchAndRewrite(), mlir::GPUFuncOpLowering::matchAndRewrite(), mlir::gpu::WarpDistributionPattern::moveRegionToNewWarpOpAndReplaceReturns(), mlir::normalizeForallOp(), mlir::linalg::splitReduction(), mlir::linalg::splitReductionByScaling(), and wrapInExecuteRegion().