MLIR
16.0.0git
|
#include "mlir/Analysis/SliceAnalysis.h"
#include "mlir/Dialect/Affine/Analysis/LoopAnalysis.h"
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
#include "mlir/Dialect/Func/IR/FuncOps.h"
#include "mlir/Dialect/Linalg/Analysis/DependenceAnalysis.h"
#include "mlir/Dialect/Linalg/IR/Linalg.h"
#include "mlir/Dialect/Linalg/Transforms/Transforms.h"
#include "mlir/Dialect/Linalg/Utils/Utils.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
#include "mlir/Dialect/Vector/IR/VectorOps.h"
#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/AffineExpr.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Support/LLVM.h"
#include "mlir/Transforms/RegionUtils.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <type_traits>
Go to the source code of this file.
Classes | |
struct | VectorizationResult |
struct | GenericPadOpVectorizationPattern |
Rewrite a tensor::PadOp into a sequence of InitTensorOp, FillOp and InsertSliceOp. More... | |
struct | VectorizePadOpUserPattern< OpTy > |
Base pattern for rewriting tensor::PadOps whose result is consumed by a given operation type OpTy. More... | |
struct | PadOpVectorizationWithTransferReadPattern |
Rewrite use of tensor::PadOp result in TransferReadOp. More... | |
struct | PadOpVectorizationWithTransferWritePattern |
Rewrite use of tensor::PadOp result in TransferWriteOp. More... | |
struct | PadOpVectorizationWithInsertSlicePattern |
Rewrite use of tensor::PadOp result in InsertSliceOp. More... | |
struct | VectorizeConvolution |
Macros | |
#define | DEBUG_TYPE "linalg-vectorization" |
#define | DBGS() (llvm::dbgs() << '[' << DEBUG_TYPE << "] ") |
#define | LDBG(X) LLVM_DEBUG(DBGS() << X) |
Typedefs | |
using | CustomVectorizationHook = std::function< VectorizationResult(Operation *, const BlockAndValueMapping &)> |
Enumerations | |
enum | VectorizationStatus { Failure = 0, NoReplace, NewOp } |
Helper data structure to represent the result of vectorization. More... | |
Functions | |
static FailureOr< Operation * > | vectorizeConvolution (OpBuilder &b, LinalgOp convOp) |
Try to vectorize convOp as a convolution. More... | |
template<typename OpType > | |
static OpType | getSingleOpOfType (Block &block) |
Return the unique instance of OpType in block if it is indeed unique. More... | |
static AffineMap | reindexIndexingMap (AffineMap map) |
Given an indexing map coming from a LinalgOp indexing, restricted to a projectedPermutation, compress the unused dimensions to serve as a permutation_map for a vector transfer operation. More... | |
static Operation * | matchLinalgReduction (OpOperand *outputOperand) |
Check whether outputOperand is a reduction with a single combiner operation. More... | |
static Value | broadcastIfNeeded (OpBuilder &b, Value value, ArrayRef< int64_t > shape) |
Broadcast value to a vector of shape if possible. More... | |
static Operation * | buildMultiDimReduce (OpBuilder &b, Operation *reduceOp, Value valueToReduce, Value acc, const SmallVector< bool > &reductionMask) |
Create MultiDimReductionOp to compute the reduction for reductionOp . More... | |
static SmallVector< bool > | getReductionMask (LinalgOp linalgOp) |
static Value | buildVectorWrite (OpBuilder &b, Value value, OpOperand *outputOperand) |
Build a vector.transfer_write of value into outputOperand at indices set to all 0 ; where outputOperand is an output operand of the LinalgOp currently being vectorized. More... | |
static VectorizationResult | vectorizeLinalgYield (OpBuilder &b, Operation *op, const BlockAndValueMapping &bvm, LinalgOp linalgOp, SmallVectorImpl< Value > &newResults) |
Helper function to vectorize the terminator of a linalgOp . More... | |
static VectorizationResult | vectorizeLinalgIndex (OpBuilder &b, Operation *op, LinalgOp linalgOp) |
Helper function to vectorize the index operations of a linalgOp . More... | |
static Operation * | reduceIfNeeded (OpBuilder &b, LinalgOp linalgOp, Operation *op, Value reduceValue, Value initialValue, const BlockAndValueMapping &bvm) |
Emit reduction operations if the shapes of the value to reduce is different that the result shape. More... | |
static VectorizationResult | vectorizeOneOp (OpBuilder &b, LinalgOp linalgOp, Operation *op, const BlockAndValueMapping &bvm, ArrayRef< CustomVectorizationHook > customVectorizationHooks) |
Generic vectorization for a single operation op , given already vectorized operands carried by bvm . More... | |
static LogicalResult | vectorizeAsLinalgGeneric (OpBuilder &b, LinalgOp linalgOp, SmallVectorImpl< Value > &newResults) |
Generic vectorization function that rewrites the body of a linalgOp into vector form. More... | |
static LogicalResult | reductionPreconditions (LinalgOp op) |
static LogicalResult | vectorizeStaticLinalgOpPrecondition (linalg::LinalgOp op) |
static LogicalResult | vectorizeLinalgOpPrecondition (LinalgOp linalgOp) |
static int64_t | getIntFromAttr (Attribute attr) |
Helper function that retrieves the value of an IntegerAttr. More... | |
static SmallVector< Value > | ofrToIndexValues (OpBuilder &builder, Location loc, ArrayRef< OpFoldResult > ofrs) |
Given an ArrayRef of OpFoldResults, return a vector of Values. More... | |
static bool | mayExistInterleavedUses (Operation *firstOp, Operation *secondOp, ValueRange values) |
Check whether there is any interleaved use of any values between firstOp and secondOp . More... | |
static memref::SubViewOp | getSubViewUseIfUnique (Value v) |
Return the unique subview use of v if it is indeed unique, null otherwise. More... | |
template<int N> | |
static void | bindShapeDims (ShapedType shapedType) |
template<int N, typename IntTy , typename... IntTy2> | |
static void | bindShapeDims (ShapedType shapedType, IntTy &val, IntTy2 &...vals) |
template<typename... IntTy> | |
static void | bindShapeDims (ShapedType shapedType, IntTy &...vals) |
Bind a pack of int& to the leading dimensions of shapedType.getShape(). More... | |
#define DBGS | ( | ) | (llvm::dbgs() << '[' << DEBUG_TYPE << "] ") |
Definition at line 45 of file Vectorization.cpp.
#define DEBUG_TYPE "linalg-vectorization" |
Definition at line 43 of file Vectorization.cpp.
#define LDBG | ( | X | ) | LLVM_DEBUG(DBGS() << X) |
Definition at line 46 of file Vectorization.cpp.
Referenced by buildVectorWrite(), mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), mayExistInterleavedUses(), reductionPreconditions(), mlir::linalg::vectorize(), vectorizeAsLinalgGeneric(), vectorizeLinalgOpPrecondition(), vectorizeOneOp(), and vectorizeStaticLinalgOpPrecondition().
using CustomVectorizationHook = std::function<VectorizationResult( Operation *, const BlockAndValueMapping &)> |
Definition at line 239 of file Vectorization.cpp.
enum VectorizationStatus |
Helper data structure to represent the result of vectorization.
In certain specific cases, like terminators, we do not want to propagate/
Definition at line 96 of file Vectorization.cpp.
|
static |
Definition at line 1285 of file Vectorization.cpp.
Referenced by bindShapeDims().
|
static |
Definition at line 1288 of file Vectorization.cpp.
References bindShapeDims().
|
static |
Bind a pack of int& to the leading dimensions of shapedType.getShape().
Definition at line 1295 of file Vectorization.cpp.
References bindShapeDims(), mlir::failure(), mlir::linalg::getCombinerOpKind(), mlir::Operation::getOperand(), mlir::Operation::getOperands(), and matchLinalgReduction().
Broadcast value
to a vector of shape
if possible.
Return value otherwise.
Definition at line 160 of file Vectorization.cpp.
References mlir::OpBuilder::createOrFold(), mlir::getElementTypeOrSelf(), mlir::OpBuilder::getInsertionPoint(), mlir::Value::getType(), mlir::vector::isBroadcastableTo(), mlir::vector::Success, and value.
Referenced by buildVectorWrite(), and vectorizeOneOp().
|
static |
Create MultiDimReductionOp to compute the reduction for reductionOp
.
This assumes that reductionOp
has two operands and one of them is the reduction initial value.
Definition at line 177 of file Vectorization.cpp.
References mlir::OpBuilder::create(), mlir::linalg::getCombinerOpKind(), and mlir::Operation::getLoc().
Referenced by reduceIfNeeded().
Build a vector.transfer_write of value
into outputOperand
at indices set to all 0
; where outputOperand
is an output operand of the LinalgOp currently being vectorized.
If dest
has null rank, build an memref.store. Return the produced value or null if no value is produced.
Definition at line 201 of file Vectorization.cpp.
References mlir::applyPermutationMap(), broadcastIfNeeded(), mlir::OpBuilder::create(), mlir::IROperand< DerivedT, IRValueT >::get(), mlir::getElementTypeOrSelf(), mlir::Value::getLoc(), mlir::detail::IROperandBase::getOwner(), mlir::Operation::getResult(), mlir::Operation::getResults(), mlir::Value::getType(), mlir::inversePermutation(), mlir::Type::isa(), LDBG, reindexIndexingMap(), value, and vectorType().
Referenced by vectorizeLinalgYield().
|
static |
Helper function that retrieves the value of an IntegerAttr.
Definition at line 658 of file Vectorization.cpp.
References mlir::Attribute::cast().
Referenced by ofrToIndexValues().
|
static |
Definition at line 186 of file Vectorization.cpp.
References mlir::isReductionIterator().
Referenced by reduceIfNeeded().
|
static |
Return the unique instance of OpType in block
if it is indeed unique.
Return null if none or more than 1 instances exist.
Definition at line 55 of file Vectorization.cpp.
|
static |
Return the unique subview use of v
if it is indeed unique, null otherwise.
Definition at line 1128 of file Vectorization.cpp.
References mlir::Value::getUses().
Referenced by mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), and mlir::linalg::LinalgCopyVTWForwardingPattern::matchAndRewrite().
Check whether outputOperand
is a reduction with a single combiner operation.
Return the combiner operation of the reduction. Return nullptr otherwise. Multiple reduction operations would impose an ordering between reduction dimensions and is currently unsupported in Linalg. This limitation is motivated by the fact that e.g. min(max(X)) != max(min(X))
Definition at line 144 of file Vectorization.cpp.
References mlir::OpOperand::getOperandNumber(), mlir::detail::IROperandBase::getOwner(), and mlir::matchReduction().
Referenced by bindShapeDims(), and reductionPreconditions().
|
static |
Check whether there is any interleaved use of any values
between firstOp
and secondOp
.
Conservatively return true
if any op or value is in a different block.
Definition at line 1101 of file Vectorization.cpp.
References mlir::Operation::getBlock(), mlir::Operation::isBeforeInBlock(), and LDBG.
Referenced by mlir::linalg::LinalgCopyVTRForwardingPattern::matchAndRewrite(), and mlir::linalg::LinalgCopyVTWForwardingPattern::matchAndRewrite().
|
static |
Given an ArrayRef of OpFoldResults, return a vector of Values.
IntegerAttrs are converted to ConstantIndexOps. Other attribute types are not supported.
Definition at line 665 of file Vectorization.cpp.
References mlir::OpBuilder::create(), and getIntFromAttr().
Referenced by PadOpVectorizationWithInsertSlicePattern::rewriteUser(), and GenericPadOpVectorizationPattern::tryVectorizeCopy().
|
static |
Emit reduction operations if the shapes of the value to reduce is different that the result shape.
Definition at line 305 of file Vectorization.cpp.
References buildMultiDimReduce(), mlir::Type::dyn_cast(), getReductionMask(), mlir::Value::getType(), and mlir::BlockAndValueMapping::lookup().
Referenced by vectorizeOneOp().
|
static |
Definition at line 536 of file Vectorization.cpp.
References mlir::failure(), mlir::linalg::getCombinerOpKind(), mlir::isReductionIterator(), LDBG, matchLinalgReduction(), and mlir::success().
Referenced by vectorizeStaticLinalgOpPrecondition().
Given an indexing map
coming from a LinalgOp indexing, restricted to a projectedPermutation, compress the unused dimensions to serve as a permutation_map for a vector transfer operation.
For example, given a linalg op such as:
the iteration domain size of the linalg op is 3x5x4x6x2. The first affine map is reindexed to affine_map<(d0, d1, d2) -> (d2, d0, d1)>
, the second affine map is reindexed to affine_map<(d0, d1) -> (d0, d1)>
.
Definition at line 85 of file Vectorization.cpp.
References mlir::AffineMap::isProjectedPermutation().
Referenced by buildVectorWrite(), and vectorizeAsLinalgGeneric().
|
static |
Generic vectorization function that rewrites the body of a linalgOp
into vector form.
Generic vectorization proceeds as follows:
linalgOp
has one non-empty region.When broadcastToMaximalCommonShape
is set to true, eager broadcasting is performed to the maximal common vector size implied by the linalgOp
iteration space. This eager broadcasting is introduced in the permutation_map of the vector.transfer_read operations. The eager broadcasting makes it trivial to detrmine where broadcast, transposes and reductions should occur, without any bookkeeping. The tradeoff is that, in the absence of good canonicalizations, the amount of work increases. This is not deemed a problem as we expect canonicalizations and foldings to aggressively clean up the useless work.
Definition at line 440 of file Vectorization.cpp.
References mlir::AffineMap::compose(), mlir::OpBuilder::create(), mlir::failure(), Failure, mlir::BlockArgument::getArgNumber(), mlir::Block::getArgument(), mlir::getElementTypeOrSelf(), mlir::Block::getOperations(), mlir::Operation::getResults(), mlir::getUsedValuesDefinedAbove(), mlir::inverseAndBroadcastProjectedPermutation(), mlir::inversePermutation(), LDBG, mlir::BlockAndValueMapping::map(), NewOp, VectorizationResult::newOp, reindexIndexingMap(), VectorizationResult::status, mlir::success(), vectorizeLinalgIndex(), vectorizeLinalgYield(), and vectorizeOneOp().
Referenced by mlir::linalg::vectorize().
Try to vectorize convOp
as a convolution.
Helper function to vectorize a LinalgOp with convolution semantics.
Definition at line 1657 of file Vectorization.cpp.
Referenced by VectorizeConvolution::matchAndRewrite(), and mlir::linalg::vectorize().
|
static |
Helper function to vectorize the index operations of a linalgOp
.
Return VectorizationStatus::NewOp to signal the vectorization algorithm that it should map the produced operations. This function is meant to be used as a CustomVectorizationHook.
Definition at line 271 of file Vectorization.cpp.
References mlir::OpBuilder::create(), Failure, mlir::Builder::getIndexType(), mlir::Builder::getIndexVectorAttr(), and NewOp.
Referenced by vectorizeAsLinalgGeneric().
|
static |
Definition at line 586 of file Vectorization.cpp.
References mlir::failure(), LDBG, and vectorizeStaticLinalgOpPrecondition().
Referenced by mlir::linalg::vectorize().
|
static |
Helper function to vectorize the terminator of a linalgOp
.
New result vector values are appended to newResults
. Return VectorizationStatus::NoReplace to signal the vectorization algorithm that it should not try to map produced operations and instead return the results using the newResults
vector making them available to the vectorization algorithm for RAUW. This function is meant to be used as a CustomVectorizationHook.
Definition at line 249 of file Vectorization.cpp.
References buildVectorWrite(), mlir::detail::enumerate(), Failure, mlir::BlockAndValueMapping::lookup(), and NoReplace.
Referenced by vectorizeAsLinalgGeneric().
|
static |
Generic vectorization for a single operation op
, given already vectorized operands carried by bvm
.
Vectorization occurs as follows:
customVectorizationHooks
and return its result on success.ElementwiseMappable
op. It is the purpose of the customVectorizationHooks
to cover such cases.op
in vector form to a vector of shape prescribed by the first operand of maximal rank. Other operands have smaller rank and are broadcast accordingly. It is assumed this broadcast is always legal, otherwise, it means one of the customVectorizationHooks
is incorrect.This function assumes all operands of op
have been vectorized and are in the bvm
mapping. As a consequence, this function is meant to be called on a topologically-sorted list of ops. This function does not update bvm
but returns a VectorizationStatus that instructs the caller what bvm
update needs to occur.
Definition at line 341 of file Vectorization.cpp.
References broadcastIfNeeded(), mlir::OpBuilder::clone(), mlir::OpBuilder::create(), Failure, mlir::Operation::getAttrs(), mlir::OperationName::getIdentifier(), mlir::Operation::getLoc(), mlir::Operation::getName(), mlir::Operation::getOperands(), mlir::Operation::getResultTypes(), mlir::OpTrait::hasElementwiseMappableTraits(), LDBG, mlir::BlockAndValueMapping::lookup(), mlir::matchReduction(), NewOp, reduceIfNeeded(), and VectorizationResult::status.
Referenced by vectorizeAsLinalgGeneric().
|
static |
Definition at line 551 of file Vectorization.cpp.
References mlir::linalg::allIndexingsAreProjectedPermutation(), mlir::failed(), mlir::failure(), mlir::Region::front(), mlir::Operation::getRegion(), mlir::linalg::isElementwise(), LDBG, reductionPreconditions(), and mlir::success().
Referenced by vectorizeLinalgOpPrecondition().