MLIR 22.0.0git
ViewLikeInterfaceUtils.cpp
Go to the documentation of this file.
1//===- ViewLikeInterfaceUtils.cpp -----------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
13
14using namespace mlir;
15using namespace affine;
16
18 OpBuilder &builder, Location loc, ArrayRef<OpFoldResult> producerOffsets,
19 ArrayRef<OpFoldResult> producerSizes,
20 ArrayRef<OpFoldResult> producerStrides,
21 const llvm::SmallBitVector &droppedProducerDims,
22 ArrayRef<OpFoldResult> consumerOffsets,
23 ArrayRef<OpFoldResult> consumerSizes,
24 ArrayRef<OpFoldResult> consumerStrides,
25 SmallVector<OpFoldResult> &combinedOffsets,
26 SmallVector<OpFoldResult> &combinedSizes,
27 SmallVector<OpFoldResult> &combinedStrides) {
28 combinedOffsets.resize(producerOffsets.size());
29 combinedSizes.resize(producerOffsets.size());
30 combinedStrides.resize(producerOffsets.size());
31
32 AffineExpr s0, s1, s2;
33 bindSymbols(builder.getContext(), s0, s1, s2);
34
35 unsigned consumerPos = 0;
36 for (auto i : llvm::seq<unsigned>(0, producerOffsets.size())) {
37 if (droppedProducerDims.test(i)) {
38 // For dropped dims, get the values from the producer.
39 combinedOffsets[i] = producerOffsets[i];
40 combinedSizes[i] = producerSizes[i];
41 combinedStrides[i] = producerStrides[i];
42 continue;
43 }
44 // The combined offset is computed as
45 // producer_offset + consumer_offset * producer_strides.
46 combinedOffsets[i] = makeComposedFoldedAffineApply(
47 builder, loc, s0 * s1 + s2,
48 {consumerOffsets[consumerPos], producerStrides[i], producerOffsets[i]});
49 combinedSizes[i] = consumerSizes[consumerPos];
50 // The combined stride is computed as
51 // consumer_stride * producer_stride.
52 combinedStrides[i] = makeComposedFoldedAffineApply(
53 builder, loc, s0 * s1,
54 {consumerStrides[consumerPos], producerStrides[i]});
55
56 consumerPos++;
57 }
58 return success();
59}
60
62 OpBuilder &builder, Location loc, OffsetSizeAndStrideOpInterface producer,
63 OffsetSizeAndStrideOpInterface consumer,
64 const llvm::SmallBitVector &droppedProducerDims,
65 SmallVector<OpFoldResult> &combinedOffsets,
66 SmallVector<OpFoldResult> &combinedSizes,
67 SmallVector<OpFoldResult> &combinedStrides) {
68 SmallVector<OpFoldResult> consumerOffsets = consumer.getMixedOffsets();
69 SmallVector<OpFoldResult> consumerSizes = consumer.getMixedSizes();
70 SmallVector<OpFoldResult> consumerStrides = consumer.getMixedStrides();
71 SmallVector<OpFoldResult> producerOffsets = producer.getMixedOffsets();
72 SmallVector<OpFoldResult> producerSizes = producer.getMixedSizes();
73 SmallVector<OpFoldResult> producerStrides = producer.getMixedStrides();
75 builder, loc, producerOffsets, producerSizes, producerStrides,
76 droppedProducerDims, consumerOffsets, consumerSizes, consumerStrides,
77 combinedOffsets, combinedSizes, combinedStrides);
78}
79
81 RewriterBase &rewriter, Location loc,
82 ArrayRef<OpFoldResult> mixedSourceOffsets,
83 ArrayRef<OpFoldResult> mixedSourceStrides,
84 const llvm::SmallBitVector &rankReducedDims,
85 ArrayRef<OpFoldResult> consumerIndices,
86 SmallVectorImpl<Value> &resolvedIndices) {
87 OpFoldResult zero = rewriter.getIndexAttr(0);
88
89 // For each dimension that is rank-reduced, add a zero to the indices.
90 int64_t indicesDim = 0;
92 for (auto dim : llvm::seq<int64_t>(0, mixedSourceOffsets.size())) {
93 OpFoldResult ofr =
94 (rankReducedDims.test(dim)) ? zero : consumerIndices[indicesDim++];
95 indices.push_back(ofr);
96 }
97
98 resolvedIndices.resize(indices.size());
99 resolvedIndices.clear();
100 for (auto [offset, index, stride] :
101 llvm::zip_equal(mixedSourceOffsets, indices, mixedSourceStrides)) {
102 AffineExpr off, idx, str;
103 bindSymbols(rewriter.getContext(), off, idx, str);
105 rewriter, loc, AffineMap::get(0, 3, off + idx * str),
106 {offset, index, stride});
107 resolvedIndices.push_back(
108 getValueOrCreateConstantIndexOp(rewriter, loc, ofr));
109 }
110}
111
113 ArrayRef<OpFoldResult> sourceSizes, ArrayRef<OpFoldResult> destSizes,
114 const llvm::SmallBitVector &rankReducedSourceDims,
115 SmallVectorImpl<OpFoldResult> &resolvedSizes) {
116 int64_t dim = 0;
117 int64_t srcRank = sourceSizes.size();
118 for (int64_t srcDim = 0; srcDim < srcRank; ++srcDim) {
119 if (rankReducedSourceDims[srcDim]) {
120 resolvedSizes.push_back(sourceSizes[srcDim]);
121 continue;
122 }
123 resolvedSizes.push_back(destSizes[dim++]);
124 }
125}
return success()
Base type for affine expression.
Definition AffineExpr.h:68
static AffineMap get(MLIRContext *context)
Returns a zero result affine map with no dimensions or symbols: () -> ().
IntegerAttr getIndexAttr(int64_t value)
Definition Builders.cpp:108
MLIRContext * getContext() const
Definition Builders.h:56
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition Location.h:76
This class helps build Operations.
Definition Builders.h:207
This class represents a single result from folding an operation.
This class coordinates the application of a rewrite on a set of IR, providing a way for clients to tr...
void resolveSizesIntoOpWithSizes(ArrayRef< OpFoldResult > sourceSizes, ArrayRef< OpFoldResult > destSizes, const llvm::SmallBitVector &rankReducedSourceDims, SmallVectorImpl< OpFoldResult > &resolvedSizes)
Given sourceSizes, destSizes and information about which dimensions are dropped by the source: rankRe...
OpFoldResult makeComposedFoldedAffineApply(OpBuilder &b, Location loc, AffineMap map, ArrayRef< OpFoldResult > operands, bool composeAffineMin=false)
Constructs an AffineApplyOp that applies map to operands after composing the map with the maps of any...
void resolveIndicesIntoOpWithOffsetsAndStrides(RewriterBase &rewriter, Location loc, ArrayRef< OpFoldResult > mixedSourceOffsets, ArrayRef< OpFoldResult > mixedSourceStrides, const llvm::SmallBitVector &rankReducedDims, ArrayRef< OpFoldResult > consumerIndices, SmallVectorImpl< Value > &resolvedIndices)
Given the 'consumerIndices' of a load/store operation operating on an op with offsets and strides,...
LogicalResult mergeOffsetsSizesAndStrides(OpBuilder &builder, Location loc, ArrayRef< OpFoldResult > producerOffsets, ArrayRef< OpFoldResult > producerSizes, ArrayRef< OpFoldResult > producerStrides, const llvm::SmallBitVector &droppedProducerDims, ArrayRef< OpFoldResult > consumerOffsets, ArrayRef< OpFoldResult > consumerSizes, ArrayRef< OpFoldResult > consumerStrides, SmallVector< OpFoldResult > &combinedOffsets, SmallVector< OpFoldResult > &combinedSizes, SmallVector< OpFoldResult > &combinedStrides)
Fills the combinedOffsets, combinedSizes and combinedStrides to use when combining a producer slice i...
Include the generated interface declarations.
void bindSymbols(MLIRContext *ctx, AffineExprTy &...exprs)
Bind a list of AffineExpr references to SymbolExpr at positions: [0 .
Definition AffineExpr.h:325
Value getValueOrCreateConstantIndexOp(OpBuilder &b, Location loc, OpFoldResult ofr)
Converts an OpFoldResult to a Value.
Definition Utils.cpp:111