MLIR
17.0.0git
|
#include <optional>
#include <type_traits>
#include "mlir/Dialect/Affine/IR/AffineOps.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/Dialect/Linalg/IR/Linalg.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/Dialect/SCF/IR/SCF.h"
#include "mlir/Dialect/Utils/StructuredOpsUtils.h"
#include "mlir/Dialect/Vector/Transforms/VectorTransforms.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Interfaces/VectorInterfaces.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "vector-transfer-split" |
Functions | |
static std::optional< int64_t > | extractConstantIndex (Value v) |
static Value | createFoldedSLE (RewriterBase &b, Value v, Value ub) |
static Value | createInBoundsCond (RewriterBase &b, VectorTransferOpInterface xferOp) |
Build the condition to ensure that a particular VectorTransferOpInterface is in-bounds. More... | |
static LogicalResult | splitFullAndPartialTransferPrecondition (VectorTransferOpInterface xferOp) |
Split a vector.transfer operation into an in-bounds (i.e., no out-of-bounds masking) fast path and a slow path. More... | |
static MemRefType | getCastCompatibleMemRefType (MemRefType aT, MemRefType bT) |
Given two MemRefTypes aT and bT , return a MemRefType to which both can be cast. More... | |
static std::pair< Value, Value > | createSubViewIntersection (RewriterBase &b, VectorTransferOpInterface xferOp, Value alloc) |
Operates under a scoped context to build the intersection between the view xferOp.source() @ xferOp.indices() and the view alloc . More... | |
static scf::IfOp | createFullPartialLinalgCopy (RewriterBase &b, vector::TransferReadOp xferOp, TypeRange returnTypes, Value inBoundsCond, MemRefType compatibleMemRefType, Value alloc) |
Given an xferOp for which: More... | |
static scf::IfOp | createFullPartialVectorTransferRead (RewriterBase &b, vector::TransferReadOp xferOp, TypeRange returnTypes, Value inBoundsCond, MemRefType compatibleMemRefType, Value alloc) |
Given an xferOp for which: More... | |
static ValueRange | getLocationToWriteFullVec (RewriterBase &b, vector::TransferWriteOp xferOp, TypeRange returnTypes, Value inBoundsCond, MemRefType compatibleMemRefType, Value alloc) |
Given an xferOp for which: More... | |
static void | createFullPartialLinalgCopy (RewriterBase &b, vector::TransferWriteOp xferOp, Value inBoundsCond, Value alloc) |
Given an xferOp for which: More... | |
static void | createFullPartialVectorTransferWrite (RewriterBase &b, vector::TransferWriteOp xferOp, Value inBoundsCond, Value alloc) |
Given an xferOp for which: More... | |
static Operation * | getAutomaticAllocationScope (Operation *op) |
#define DEBUG_TYPE "vector-transfer-split" |
Definition at line 36 of file VectorTransferSplitRewritePatterns.cpp.
|
static |
Definition at line 53 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::create(), extractConstantIndex(), and mlir::Value::getLoc().
Referenced by createInBoundsCond().
|
static |
Given an xferOp
for which:
inBoundsCond
and a compatibleMemRefType
have been computed.alloc
has been allocated. Produce IR resembling: Definition at line 246 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::create(), and createSubViewIntersection().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Given an xferOp
for which:
inBoundsCond
has been computed.alloc
has been allocated.Definition at line 394 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::create(), and createSubViewIntersection().
|
static |
Given an xferOp
for which:
inBoundsCond
and a compatibleMemRefType
have been computed.alloc
has been allocated. Produce IR resembling: Definition at line 300 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::clone(), mlir::OpBuilder::create(), mlir::get(), and mlir::Value::getType().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Given an xferOp
for which:
inBoundsCond
has been computed.alloc
has been allocated.Definition at line 422 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::clone(), mlir::OpBuilder::create(), mlir::get(), and mlir::IRMapping::map().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Build the condition to ensure that a particular VectorTransferOpInterface is in-bounds.
Definition at line 63 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::create(), createFoldedSLE(), mlir::vector::createOrFoldDimOp(), mlir::getAffineConstantExpr(), mlir::getAffineDimExpr(), and mlir::affine::makeComposedAffineApply().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Operates under a scoped context to build the intersection between the view xferOp.source()
@ xferOp.indices()
and the view alloc
.
Definition at line 188 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::bindDims(), mlir::OpBuilder::create(), mlir::vector::createOrFoldDimOp(), mlir::Builder::getIndexAttr(), mlir::Value::getType(), and mlir::AffineMap::inferFromExprList().
Referenced by createFullPartialLinalgCopy().
|
static |
Definition at line 41 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::Value::getDefiningOp().
Referenced by createFoldedSLE().
Definition at line 443 of file VectorTransferSplitRewritePatterns.cpp.
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Given two MemRefTypes aT
and bT
, return a MemRefType to which both can be cast.
If the MemRefTypes don't have the same rank or are not strided, return null; otherwise:
aT
and bT
are cast-compatible, return aT
.aT
and bT
. b. using a dynamic shape and/or stride for the dimensions that don't agree. Definition at line 156 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::failed(), mlir::get(), and mlir::getStridesAndOffset().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Given an xferOp
for which:
inBoundsCond
and a compatibleMemRefType
have been computed.alloc
has been allocated. Produce IR resembling: Definition at line 351 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::OpBuilder::create().
Referenced by mlir::vector::splitFullAndPartialTransfer().
|
static |
Split a vector.transfer operation into an in-bounds (i.e., no out-of-bounds masking) fast path and a slow path.
If ifOp
is not null and the result is success, the
ifOp` points to the newly created conditional upon function return. To accommodate for the fact that the original vector.transfer indexing may be arbitrary and the slow path indexes @[0...0] in the temporary buffer, the scf.if op returns a view and values of type index. At this time, only vector.transfer_read case is implemented.
Example (a 2-D vector.transfer_read): ``` %1 = vector.transfer_read %0[...], pad : memref<A...>, vector<...> ``` is transformed into: ``` %1:3 = scf.if (inBounds) { // fast path, direct cast memref.cast A: memref<A...> to compatibleMemRefType scf.yield view : compatibleMemRefType, index, index } else { // slow path, not in-bounds vector.transfer or linalg.copy. memref.cast alloc: memref<B...> to compatibleMemRefType scf.yield %4 : compatibleMemRefType, index, index */ // } /** %0 = vector.transfer_read %1#0[%1#1, %1#2] {in_bounds = [true ... true]} `` where
alloc` is a top of the function alloca'ed buffer of one vector.
Preconditions:
xferOp.permutation_map()
must be a minor identity mapxferOp.memref()
and the rank of the xferOp.vector()
must be equal. This will be relaxed in the future but requires rank-reducing subviews. Definition at line 128 of file VectorTransferSplitRewritePatterns.cpp.
References mlir::failure(), and mlir::success().
Referenced by mlir::vector::splitFullAndPartialTransfer().