26 if (!ShapedType::isDynamic(dstStaticShape[dimIndex])) {
30 AffineMap map = reassociationMap[dimIndex];
32 cast<AffineDimExpr>(map.
getResults().front()).getPosition();
33 unsigned endPos = cast<AffineDimExpr>(map.
getResults().back()).getPosition();
36 for (
auto dim : llvm::seq_inclusive(startPos, endPos)) {
37 dynamicDims.push_back(builder.
createOrFold<tensor::DimOp>(loc, src, dim));
39 expr = (expr ? expr * currExpr : currExpr);
54 return llvm::to_vector<4>(llvm::map_range(
55 llvm::seq<int64_t>(0, dstStaticShape.size()), [&](int64_t dim) {
56 return getCollapsedOutputDimFromInputShape(
57 builder, loc, dim, src, dstStaticShape, reassociation);
62 :
public ReifyRankedShapedTypeOpInterface::ExternalModel<
63 ReifyCollapseShapeOp, CollapseShapeOp> {
68 auto reshapeOp = cast<tensor::CollapseShapeOp>(op);
70 b, loc, reshapeOp.getSrc(), reshapeOp.getResultType().getShape(),
71 reshapeOp.getReassociationMaps()));
78 struct ReifyExpandShapeOp
79 :
public ReifyRankedShapedTypeOpInterface::ExternalModel<ReifyExpandShapeOp,
84 auto expandShapeOp = cast<tensor::ExpandShapeOp>(op);
86 expandShapeOp.getMixedOutputShape();
93 :
public ReifyRankedShapedTypeOpInterface::ExternalModel<ReifyPadOp,
98 auto padOp = cast<PadOp>(op);
100 auto lowPad = padOp.getMixedLowPad();
101 auto highPad = padOp.getMixedHighPad();
103 for (
auto dim : llvm::seq<int64_t>(0, padOp.getSourceType().getRank())) {
104 if (!padOp.getResultType().isDynamicDim(dim)) {
105 shapes.push_back(b.
getIndexAttr(padOp.getResultType().getDimSize(dim)));
111 mapOperands.push_back(
112 b.
createOrFold<tensor::DimOp>(loc, padOp.getSource(), dim));
113 mapOperands.push_back(lowPad[dim]);
114 mapOperands.push_back(highPad[dim]);
122 reifiedReturnShapes.emplace_back(std::move(shapes));
132 ExpandShapeOp::attachInterface<ReifyExpandShapeOp>(*ctx);
133 CollapseShapeOp::attachInterface<ReifyCollapseShapeOp>(*ctx);
134 PadOp::attachInterface<ReifyPadOp>(*ctx);
static OpFoldResult getCollapsedOutputDimFromInputShape(OpBuilder &builder, Location loc, int64_t dimIndex, Value src, ArrayRef< int64_t > dstStaticShape, ArrayRef< AffineMap > reassociationMap)
For reshape op compute the shape at dimension dimIndex of the output in terms of shape of the src,...
static SmallVector< OpFoldResult, 4 > getCollapsedOutputShapeFromInputShape(OpBuilder &builder, Location loc, Value src, ArrayRef< int64_t > dstStaticShape, ArrayRef< AffineMap > reassociation)
Given the src of a collapsing reshape op and its reassociation maps, compute the shape of the result ...
Base type for affine expression.
A multi-dimensional affine map Affine map's are immutable like Type's, and they are uniqued.
static AffineMap get(MLIRContext *context)
Returns a zero result affine map with no dimensions or symbols: () -> ().
ArrayRef< AffineExpr > getResults() const
IntegerAttr getIndexAttr(int64_t value)
AffineExpr getAffineSymbolExpr(unsigned position)
AffineExpr getAffineDimExpr(unsigned position)
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
bool addExtension(TypeID extensionID, std::unique_ptr< DialectExtensionBase > extension)
Add the given extension to the registry.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
This class helps build Operations.
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 i...
This class represents a single result from folding an operation.
Operation is the basic unit of execution within MLIR.
Location getLoc()
The source location the operation was defined or derived from.
This class represents an instance of an SSA value in the MLIR system, representing a computable value...
AffineApplyOp makeComposedAffineApply(OpBuilder &b, Location loc, AffineMap map, ArrayRef< OpFoldResult > operands)
Returns a composed AffineApplyOp by composing map and operands with other AffineApplyOps supplying th...
OpFoldResult makeComposedFoldedAffineApply(OpBuilder &b, Location loc, AffineMap map, ArrayRef< OpFoldResult > operands)
Constructs an AffineApplyOp that applies map to operands after composing the map with the maps of any...
void registerInferTypeOpInterfaceExternalModels(mlir::DialectRegistry ®istry)
Registers external models for Infer Type interfaces for tensor ops.
Include the generated interface declarations.
LogicalResult reifyResultShapes(OpBuilder &b, Operation *op, ReifiedRankedShapedTypeDims &reifiedReturnShapes)
Reify the shape of the result of an operation (typically in terms of the shape of its operands).
Value getValueOrCreateConstantIndexOp(OpBuilder &b, Location loc, OpFoldResult ofr)
Converts an OpFoldResult to a Value.
LogicalResult reifyResultShapes(Operation *op, OpBuilder &b, ReifiedRankedShapedTypeDims &reifiedReturnShapes) const