Skip to content

Commit cc0d208

Browse files
[mlir][Linalg] Drop deprecated convolution vectorization patterns
Differential revision: https://reviews.llvm.org/D117326
1 parent 289021a commit cc0d208

File tree

12 files changed

+0
-446
lines changed

12 files changed

+0
-446
lines changed

mlir/include/mlir/Dialect/Linalg/Transforms/Transforms.h

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ using LinalgLoops = SmallVector<Operation *, 4>;
4949
void populatePadTensorTilingPatterns(RewritePatternSet &patterns,
5050
const LinalgTilingOptions &options);
5151

52-
/// [DEPRECATED] Populate patterns for vectorization of all ConvN-D ops.
53-
void populateConvVectorizationPatterns(
54-
MLIRContext *context, SmallVectorImpl<RewritePatternSet> &patterns,
55-
ArrayRef<int64_t> tileSizes);
56-
5752
/// Populate patterns for vectorizing low-D convolution ops. This is a step in
5853
/// progressive lowering for convolution ops, it assume high-D convolution ops
5954
/// were decomposed previously.
@@ -1246,54 +1241,6 @@ struct LinalgCopyVTWForwardingPattern
12461241
PatternRewriter &rewriter) const override;
12471242
};
12481243

1249-
/// Converts Convolution op into vector contraction.
1250-
///
1251-
/// Conversion expects ConvOp to have dimensions marked in the *mask* as
1252-
/// false of size 1. This ensures that the ConvOp can be lowered to vector
1253-
/// contraction of dimensions marked in the *mask* as true.
1254-
///
1255-
/// A good example for vectorization is ConvNHWCOp which is 2D Conv op
1256-
/// with channels as the last dimension. Let's vectorize last 3 dimensions.
1257-
/// The initial op definition looks like this:
1258-
/// ```
1259-
/// linalg.conv_2d_nhwc %arg0, %arg1, %arg2 :
1260-
/// (memref<1x3x3x3xf32>, memref<1x3x3x3xf32>, memref<?x?x?x?xf32>)
1261-
/// ```
1262-
/// This op can be expressed as a dot product between %arg0 (input) and
1263-
/// %arg1 (kernel) which is written into first entry of %arg2 (output). This is
1264-
/// the ConvOp this pass expects and converts into:
1265-
/// ```
1266-
/// #map0 = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
1267-
/// #map1 = affine_map<(d0, d1, d2) -> ()>
1268-
/// .....
1269-
/// %0 = vector.transfer_read %arg0[%c0, %c0, %c0, %c0], %c0_f32
1270-
/// : memref<1x3x3x3xf32>, vector<3x3x3xf32>
1271-
/// %1 = vector.transfer_read %arg1[%c0, %c0, %c0, %c0], %c0_f32
1272-
/// : memref<1x3x3x3xf32>, vector<3x3x3xf32>
1273-
/// %2 = vector.contract {indexing_maps = [#map0, #map0, #map1],
1274-
/// iterator_types = ["reduction", "reduction", "reduction"]} %0, %1,
1275-
/// %c0_f32 : vector<3x3x3xf32>, vector<3x3x3xf32> into f32
1276-
/// store %2, %arg2[%c0, %c0, %c0, %c0] : memref<?x?x?x?xf32>
1277-
/// ```
1278-
/// where first 2 operations read input and kernel memory buffers into vectors.
1279-
/// Subsequently, they are contracted together and the result is written to
1280-
/// the first entry of the output buffer.
1281-
template <typename ConvOp, int N>
1282-
class ConvOpVectorization : public OpRewritePattern<ConvOp> {
1283-
using OpRewritePattern<ConvOp>::OpRewritePattern;
1284-
SmallVector<bool, 4> mask;
1285-
1286-
public:
1287-
ConvOpVectorization(MLIRContext *context, const SmallVector<bool, 4> &msk)
1288-
: OpRewritePattern<ConvOp>(context) {
1289-
assert(msk.size() == N && "Mask size does not match rank");
1290-
this->mask = msk;
1291-
}
1292-
1293-
LogicalResult matchAndRewrite(ConvOp minOp,
1294-
PatternRewriter &rewriter) const override;
1295-
};
1296-
12971244
/// Rewrite a TiledLoopOp with bounds/step that potentially do not divide evenly
12981245
/// into a TiledLoopOp where the step divides the iteration space evenly,
12991246
/// followed by another TiledLoopOp for the last (partial) iteration (if any).

mlir/lib/Dialect/Linalg/Transforms/Vectorization.cpp

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,134 +1098,6 @@ void mlir::linalg::populatePadTensorOpVectorizationPatterns(
10981098
patterns.getContext(), baseBenefit.getBenefit() + 1);
10991099
}
11001100

1101-
// TODO: cleanup all the convolution vectorization patterns.
1102-
template <class ConvOp, int N>
1103-
LogicalResult ConvOpVectorization<ConvOp, N>::matchAndRewrite(
1104-
ConvOp op, PatternRewriter &rewriter) const {
1105-
Location loc = op.getLoc();
1106-
MLIRContext *context = op.getContext();
1107-
1108-
OpOperand *input = op.getInputOperand(0);
1109-
OpOperand *kernel = op.getInputOperand(1);
1110-
OpOperand *output = op.getOutputOperand(0);
1111-
ArrayRef<int64_t> inShape = op.getShape(input);
1112-
ArrayRef<int64_t> kShape = op.getShape(kernel);
1113-
1114-
if (llvm::any_of(inShape, ShapedType::isDynamic) ||
1115-
llvm::any_of(kShape, ShapedType::isDynamic))
1116-
return failure();
1117-
1118-
SmallVector<AffineExpr, 4> mapping;
1119-
SmallVector<int64_t, 4> vectorDims;
1120-
// Fail to apply when the size of not vectorized dimension is not 1.
1121-
for (unsigned i = 0; i < N; i++) {
1122-
if (!mask[i] && (inShape[i] != 1 || kShape[i] != 1))
1123-
return failure();
1124-
1125-
if (mask[i] && inShape[i] != kShape[i])
1126-
return failure();
1127-
1128-
if (mask[i]) {
1129-
mapping.push_back(getAffineDimExpr(i, context));
1130-
vectorDims.push_back(inShape[i]);
1131-
}
1132-
}
1133-
1134-
int64_t rank = op.getRank(input);
1135-
int64_t numDims = mapping.size();
1136-
Type elemType = getElementTypeOrSelf(input->get());
1137-
1138-
auto map = AffineMap::get(rank, 0, mapping, context);
1139-
SmallVector<Value, 4> zeros(rank,
1140-
rewriter.create<arith::ConstantIndexOp>(loc, 0));
1141-
auto vecType = VectorType::get(vectorDims, elemType);
1142-
1143-
auto inputVec = rewriter.create<vector::TransferReadOp>(
1144-
loc, vecType, input->get(), zeros, map);
1145-
auto kernelVec = rewriter.create<vector::TransferReadOp>(
1146-
loc, vecType, kernel->get(), zeros, map);
1147-
1148-
auto acc = rewriter.create<arith::ConstantOp>(loc, elemType,
1149-
rewriter.getZeroAttr(elemType));
1150-
1151-
std::array<AffineMap, 3> indexingMaps{
1152-
AffineMap::getMultiDimIdentityMap(numDims, context),
1153-
AffineMap::getMultiDimIdentityMap(numDims, context),
1154-
AffineMap::get(numDims, 0, {}, context)};
1155-
1156-
std::vector<StringRef> iteratorTypes(numDims, "reduction");
1157-
1158-
auto result = rewriter.create<vector::ContractionOp>(
1159-
loc, inputVec, kernelVec, acc,
1160-
rewriter.getAffineMapArrayAttr(indexingMaps),
1161-
rewriter.getStrArrayAttr(iteratorTypes));
1162-
1163-
rewriter.create<memref::StoreOp>(loc, result, output->get(),
1164-
ValueRange(zeros));
1165-
rewriter.eraseOp(op);
1166-
return success();
1167-
}
1168-
1169-
/// Inserts tiling, promotion and vectorization pattern for ConvOp
1170-
/// conversion into corresponding pattern lists.
1171-
template <typename ConvOp, unsigned N>
1172-
static void populateVectorizationPatterns(
1173-
RewritePatternSet &tilingPatterns, RewritePatternSet &promotionPatterns,
1174-
RewritePatternSet &vectorizationPatterns, ArrayRef<int64_t> tileSizes) {
1175-
auto *context = tilingPatterns.getContext();
1176-
if (tileSizes.size() < N)
1177-
return;
1178-
1179-
constexpr static StringRef kTiledMarker = "TILED";
1180-
constexpr static StringRef kPromotedMarker = "PROMOTED";
1181-
tilingPatterns.add<LinalgTilingPattern>(
1182-
ConvOp::getOperationName(), context,
1183-
LinalgTilingOptions().setTileSizes(tileSizes),
1184-
LinalgTransformationFilter(ArrayRef<StringAttr>{},
1185-
StringAttr::get(context, kTiledMarker)));
1186-
1187-
promotionPatterns.add<LinalgPromotionPattern<ConvOp>>(
1188-
context, LinalgPromotionOptions().setUseFullTileBuffersByDefault(true),
1189-
LinalgTransformationFilter(StringAttr::get(context, kTiledMarker),
1190-
StringAttr::get(context, kPromotedMarker)));
1191-
1192-
SmallVector<bool, 4> mask(N);
1193-
int offset = tileSizes.size() - N;
1194-
std::transform(tileSizes.begin() + offset, tileSizes.end(), mask.begin(),
1195-
[](int64_t i) -> bool { return i > 1; });
1196-
1197-
vectorizationPatterns.add<ConvOpVectorization<ConvOp, N>>(context, mask);
1198-
}
1199-
1200-
void mlir::linalg::populateConvVectorizationPatterns(
1201-
MLIRContext *context, SmallVectorImpl<RewritePatternSet> &patterns,
1202-
ArrayRef<int64_t> tileSizes) {
1203-
RewritePatternSet tiling(context);
1204-
RewritePatternSet promotion(context);
1205-
RewritePatternSet vectorization(context);
1206-
populateVectorizationPatterns<Conv1DOp, 1>(tiling, promotion, vectorization,
1207-
tileSizes);
1208-
1209-
populateVectorizationPatterns<Conv2DOp, 2>(tiling, promotion, vectorization,
1210-
tileSizes);
1211-
1212-
populateVectorizationPatterns<Conv3DOp, 3>(tiling, promotion, vectorization,
1213-
tileSizes);
1214-
1215-
populateVectorizationPatterns<Conv1DNwcWcfOp, 3>(tiling, promotion,
1216-
vectorization, tileSizes);
1217-
1218-
populateVectorizationPatterns<Conv2DNhwcHwcfOp, 4>(tiling, promotion,
1219-
vectorization, tileSizes);
1220-
1221-
populateVectorizationPatterns<Conv3DNdhwcDhwcfOp, 5>(
1222-
tiling, promotion, vectorization, tileSizes);
1223-
1224-
patterns.push_back(std::move(tiling));
1225-
patterns.push_back(std::move(promotion));
1226-
patterns.push_back(std::move(vectorization));
1227-
}
1228-
12291101
//----------------------------------------------------------------------------//
12301102
// Forwarding patterns
12311103
//----------------------------------------------------------------------------//

mlir/test/Conversion/LinalgToVector/linalg-to-vector.mlir

Lines changed: 0 additions & 53 deletions
This file was deleted.

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-1d-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=4" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns a 1-D buffer of size %s1 filled with the value %f

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-1d-nwc-wcf-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,1,1,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=2,4" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,1,1,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns 3-D buffer of size (%s1, %s2, %s3) filled with the value %f

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-2d-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,1,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=2,2" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,1,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns a 2-D buffer of size (%s1, %s2) filled with the value %f

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-2d-nhwc-hwcf-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,1,1,1,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=2,3,3,2" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,1,1,1,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns 4-D buffer of size (%s1, %s2, %s3, %s4) filled with the value %f

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-3d-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,1,1,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=2,2,2" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,1,1,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns 3-D buffer of size (%s1, %s2, %s3) filled with the value %f

mlir/test/Integration/Dialect/Linalg/CPU/test-conv-3d-ndhwc-dhwcf-call.mlir

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@
99
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
1010
// RUN: | FileCheck %s
1111

12-
// RUN: mlir-opt %s -test-conv-vectorization="tile-sizes=1,1,1,1,1,3,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
13-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
14-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
15-
// RUN: | FileCheck %s
16-
17-
// RUN: mlir-opt %s -linalg-tile="tile-sizes=0,5,5,5" \
18-
// RUN: -test-conv-vectorization="tile-sizes=1,1,1,1,1,3,3,3,3" -convert-linalg-to-llvm -lower-affine -convert-scf-to-std -convert-vector-to-llvm --convert-memref-to-llvm -convert-std-to-llvm -reconcile-unrealized-casts | \
19-
// RUN: mlir-cpu-runner -e main -entry-point-result=void \
20-
// RUN: -shared-libs=%mlir_integration_test_dir/libmlir_runner_utils%shlibext \
21-
// RUN: | FileCheck %s
22-
2312
func private @print_memref_f32(memref<*xf32>)
2413

2514
// Creates and returns 5-D buffer of size (%s1, %s2, %s3, %s4, %s5) filled with the value %f

mlir/test/lib/Dialect/Linalg/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Exclude tests from libMLIR.so
22
add_mlir_library(MLIRLinalgTestPasses
33
TestComprehensiveBufferize.cpp
4-
TestConvVectorization.cpp
54
TestLinalgCodegenStrategy.cpp
65
TestLinalgDistribution.cpp
76
TestLinalgElementwiseFusion.cpp

0 commit comments

Comments
 (0)