Skip to content

Commit f83950a

Browse files
angelz913kuhar
andauthored
[mlir][spirv] Implement vector unrolling for convert-to-spirv pass (#100138)
### Description This PR builds on #99872. It implements a minimal version of function body vector unrolling to convert vector types into 1D and with a size supported by SPIR-V (2, 3 or 4 depending on the original dimension). The ops that are currently supported include those with elementwise traits (e.g. `arith.addi`), `vector.reduction` and `vector.transpose`. This PR also includes new LIT tests that only check for vector unrolling. ### Future Plans - Support more ops --------- Co-authored-by: Jakub Kuderski <[email protected]>
1 parent 374bbc9 commit f83950a

File tree

17 files changed

+371
-38
lines changed

17 files changed

+371
-38
lines changed

mlir/include/mlir/Conversion/Passes.td

+4-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ def ConvertToSPIRVPass : Pass<"convert-to-spirv"> {
4747
let options = [
4848
Option<"runSignatureConversion", "run-signature-conversion", "bool",
4949
/*default=*/"true",
50-
"Run function signature conversion to convert vector types">
50+
"Run function signature conversion to convert vector types">,
51+
Option<"runVectorUnrolling", "run-vector-unrolling", "bool",
52+
/*default=*/"true",
53+
"Run vector unrolling to convert vector types in function bodies">
5154
];
5255
}
5356

mlir/include/mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h

+21
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h"
2020
#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
2121
#include "mlir/Transforms/DialectConversion.h"
22+
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
2223
#include "mlir/Transforms/OneToNTypeConversion.h"
2324
#include "llvm/ADT/SmallSet.h"
25+
#include "llvm/Support/LogicalResult.h"
2426

2527
namespace mlir {
2628

@@ -189,6 +191,25 @@ Value getVulkanElementPtr(const SPIRVTypeConverter &typeConverter,
189191
MemRefType baseType, Value basePtr,
190192
ValueRange indices, Location loc, OpBuilder &builder);
191193

194+
// Find the largest factor of size among {2,3,4} for the lowest dimension of
195+
// the target shape.
196+
int getComputeVectorSize(int64_t size);
197+
198+
// GetNativeVectorShape implementation for reduction ops.
199+
SmallVector<int64_t> getNativeVectorShapeImpl(vector::ReductionOp op);
200+
201+
// GetNativeVectorShape implementation for transpose ops.
202+
SmallVector<int64_t> getNativeVectorShapeImpl(vector::TransposeOp op);
203+
204+
// For general ops.
205+
std::optional<SmallVector<int64_t>> getNativeVectorShape(Operation *op);
206+
207+
// Unroll vectors in function signatures to native size.
208+
LogicalResult unrollVectorsInSignatures(Operation *op);
209+
210+
// Unroll vectors in function bodies to native size.
211+
LogicalResult unrollVectorsInFuncBodies(Operation *op);
212+
192213
} // namespace spirv
193214
} // namespace mlir
194215

mlir/lib/Conversion/ConvertToSPIRV/ConvertToSPIRVPass.cpp

+10-11
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.h"
1818
#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h"
1919
#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h"
20+
#include "mlir/Dialect/Vector/IR/VectorOps.h"
21+
#include "mlir/Dialect/Vector/Transforms/LoweringPatterns.h"
2022
#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
2123
#include "mlir/IR/PatternMatch.h"
2224
#include "mlir/Pass/Pass.h"
@@ -42,19 +44,16 @@ struct ConvertToSPIRVPass final
4244
using ConvertToSPIRVPassBase::ConvertToSPIRVPassBase;
4345

4446
void runOnOperation() override {
45-
MLIRContext *context = &getContext();
4647
Operation *op = getOperation();
48+
MLIRContext *context = &getContext();
4749

48-
if (runSignatureConversion) {
49-
// Unroll vectors in function signatures to native vector size.
50-
RewritePatternSet patterns(context);
51-
populateFuncOpVectorRewritePatterns(patterns);
52-
populateReturnOpVectorRewritePatterns(patterns);
53-
GreedyRewriteConfig config;
54-
config.strictMode = GreedyRewriteStrictness::ExistingOps;
55-
if (failed(applyPatternsAndFoldGreedily(op, std::move(patterns), config)))
56-
return signalPassFailure();
57-
}
50+
// Unroll vectors in function signatures to native size.
51+
if (runSignatureConversion && failed(spirv::unrollVectorsInSignatures(op)))
52+
return signalPassFailure();
53+
54+
// Unroll vectors in function bodies to native size.
55+
if (runVectorUnrolling && failed(spirv::unrollVectorsInFuncBodies(op)))
56+
return signalPassFailure();
5857

5958
spirv::TargetEnvAttr targetAttr = spirv::lookupTargetEnvOrDefault(op);
6059
std::unique_ptr<ConversionTarget> target =

mlir/lib/Dialect/SPIRV/Transforms/SPIRVConversion.cpp

+127-12
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,21 @@
2020
#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h"
2121
#include "mlir/Dialect/Utils/IndexingUtils.h"
2222
#include "mlir/Dialect/Vector/IR/VectorOps.h"
23+
#include "mlir/Dialect/Vector/Transforms/LoweringPatterns.h"
2324
#include "mlir/Dialect/Vector/Transforms/VectorRewritePatterns.h"
2425
#include "mlir/IR/BuiltinTypes.h"
2526
#include "mlir/IR/Operation.h"
2627
#include "mlir/IR/PatternMatch.h"
28+
#include "mlir/Pass/Pass.h"
2729
#include "mlir/Support/LLVM.h"
2830
#include "mlir/Transforms/DialectConversion.h"
31+
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
2932
#include "mlir/Transforms/OneToNTypeConversion.h"
3033
#include "llvm/ADT/STLExtras.h"
3134
#include "llvm/ADT/SmallVector.h"
3235
#include "llvm/ADT/StringExtras.h"
3336
#include "llvm/Support/Debug.h"
37+
#include "llvm/Support/LogicalResult.h"
3438
#include "llvm/Support/MathExtras.h"
3539

3640
#include <functional>
@@ -46,14 +50,6 @@ namespace {
4650
// Utility functions
4751
//===----------------------------------------------------------------------===//
4852

49-
static int getComputeVectorSize(int64_t size) {
50-
for (int i : {4, 3, 2}) {
51-
if (size % i == 0)
52-
return i;
53-
}
54-
return 1;
55-
}
56-
5753
static std::optional<SmallVector<int64_t>> getTargetShape(VectorType vecType) {
5854
LLVM_DEBUG(llvm::dbgs() << "Get target shape\n");
5955
if (vecType.isScalable()) {
@@ -62,8 +58,8 @@ static std::optional<SmallVector<int64_t>> getTargetShape(VectorType vecType) {
6258
return std::nullopt;
6359
}
6460
SmallVector<int64_t> unrollShape = llvm::to_vector<4>(vecType.getShape());
65-
std::optional<SmallVector<int64_t>> targetShape =
66-
SmallVector<int64_t>(1, getComputeVectorSize(vecType.getShape().back()));
61+
std::optional<SmallVector<int64_t>> targetShape = SmallVector<int64_t>(
62+
1, mlir::spirv::getComputeVectorSize(vecType.getShape().back()));
6763
if (!targetShape) {
6864
LLVM_DEBUG(llvm::dbgs() << "--no unrolling target shape defined\n");
6965
return std::nullopt;
@@ -1098,13 +1094,20 @@ struct ReturnOpVectorUnroll final : OpRewritePattern<func::ReturnOp> {
10981094
// the original operand of illegal type.
10991095
auto originalShape =
11001096
llvm::to_vector_of<int64_t, 4>(origVecType.getShape());
1101-
SmallVector<int64_t> strides(targetShape->size(), 1);
1097+
SmallVector<int64_t> strides(originalShape.size(), 1);
1098+
SmallVector<int64_t> extractShape(originalShape.size(), 1);
1099+
extractShape.back() = targetShape->back();
11021100
SmallVector<Type> newTypes;
11031101
Value returnValue = returnOp.getOperand(origResultNo);
11041102
for (SmallVector<int64_t> offsets :
11051103
StaticTileOffsetRange(originalShape, *targetShape)) {
11061104
Value result = rewriter.create<vector::ExtractStridedSliceOp>(
1107-
loc, returnValue, offsets, *targetShape, strides);
1105+
loc, returnValue, offsets, extractShape, strides);
1106+
if (originalShape.size() > 1) {
1107+
SmallVector<int64_t> extractIndices(originalShape.size() - 1, 0);
1108+
result =
1109+
rewriter.create<vector::ExtractOp>(loc, result, extractIndices);
1110+
}
11081111
newOperands.push_back(result);
11091112
newTypes.push_back(unrolledType);
11101113
}
@@ -1285,6 +1288,118 @@ Value mlir::spirv::getElementPtr(const SPIRVTypeConverter &typeConverter,
12851288
builder);
12861289
}
12871290

1291+
//===----------------------------------------------------------------------===//
1292+
// Public functions for vector unrolling
1293+
//===----------------------------------------------------------------------===//
1294+
1295+
int mlir::spirv::getComputeVectorSize(int64_t size) {
1296+
for (int i : {4, 3, 2}) {
1297+
if (size % i == 0)
1298+
return i;
1299+
}
1300+
return 1;
1301+
}
1302+
1303+
SmallVector<int64_t>
1304+
mlir::spirv::getNativeVectorShapeImpl(vector::ReductionOp op) {
1305+
VectorType srcVectorType = op.getSourceVectorType();
1306+
assert(srcVectorType.getRank() == 1); // Guaranteed by semantics
1307+
int64_t vectorSize =
1308+
mlir::spirv::getComputeVectorSize(srcVectorType.getDimSize(0));
1309+
return {vectorSize};
1310+
}
1311+
1312+
SmallVector<int64_t>
1313+
mlir::spirv::getNativeVectorShapeImpl(vector::TransposeOp op) {
1314+
VectorType vectorType = op.getResultVectorType();
1315+
SmallVector<int64_t> nativeSize(vectorType.getRank(), 1);
1316+
nativeSize.back() =
1317+
mlir::spirv::getComputeVectorSize(vectorType.getShape().back());
1318+
return nativeSize;
1319+
}
1320+
1321+
std::optional<SmallVector<int64_t>>
1322+
mlir::spirv::getNativeVectorShape(Operation *op) {
1323+
if (OpTrait::hasElementwiseMappableTraits(op) && op->getNumResults() == 1) {
1324+
if (auto vecType = dyn_cast<VectorType>(op->getResultTypes()[0])) {
1325+
SmallVector<int64_t> nativeSize(vecType.getRank(), 1);
1326+
nativeSize.back() =
1327+
mlir::spirv::getComputeVectorSize(vecType.getShape().back());
1328+
return nativeSize;
1329+
}
1330+
}
1331+
1332+
return TypeSwitch<Operation *, std::optional<SmallVector<int64_t>>>(op)
1333+
.Case<vector::ReductionOp, vector::TransposeOp>(
1334+
[](auto typedOp) { return getNativeVectorShapeImpl(typedOp); })
1335+
.Default([](Operation *) { return std::nullopt; });
1336+
}
1337+
1338+
LogicalResult mlir::spirv::unrollVectorsInSignatures(Operation *op) {
1339+
MLIRContext *context = op->getContext();
1340+
RewritePatternSet patterns(context);
1341+
populateFuncOpVectorRewritePatterns(patterns);
1342+
populateReturnOpVectorRewritePatterns(patterns);
1343+
// We only want to apply signature conversion once to the existing func ops.
1344+
// Without specifying strictMode, the greedy pattern rewriter will keep
1345+
// looking for newly created func ops.
1346+
GreedyRewriteConfig config;
1347+
config.strictMode = GreedyRewriteStrictness::ExistingOps;
1348+
return applyPatternsAndFoldGreedily(op, std::move(patterns), config);
1349+
}
1350+
1351+
LogicalResult mlir::spirv::unrollVectorsInFuncBodies(Operation *op) {
1352+
MLIRContext *context = op->getContext();
1353+
1354+
// Unroll vectors in function bodies to native vector size.
1355+
{
1356+
RewritePatternSet patterns(context);
1357+
auto options = vector::UnrollVectorOptions().setNativeShapeFn(
1358+
[](auto op) { return mlir::spirv::getNativeVectorShape(op); });
1359+
populateVectorUnrollPatterns(patterns, options);
1360+
if (failed(applyPatternsAndFoldGreedily(op, std::move(patterns))))
1361+
return failure();
1362+
}
1363+
1364+
// Convert transpose ops into extract and insert pairs, in preparation of
1365+
// further transformations to canonicalize/cancel.
1366+
{
1367+
RewritePatternSet patterns(context);
1368+
auto options = vector::VectorTransformsOptions().setVectorTransposeLowering(
1369+
vector::VectorTransposeLowering::EltWise);
1370+
vector::populateVectorTransposeLoweringPatterns(patterns, options);
1371+
vector::populateVectorShapeCastLoweringPatterns(patterns);
1372+
if (failed(applyPatternsAndFoldGreedily(op, std::move(patterns))))
1373+
return failure();
1374+
}
1375+
1376+
// Run canonicalization to cast away leading size-1 dimensions.
1377+
{
1378+
RewritePatternSet patterns(context);
1379+
1380+
// We need to pull in casting way leading one dims.
1381+
vector::populateCastAwayVectorLeadingOneDimPatterns(patterns);
1382+
vector::ReductionOp::getCanonicalizationPatterns(patterns, context);
1383+
vector::TransposeOp::getCanonicalizationPatterns(patterns, context);
1384+
1385+
// Decompose different rank insert_strided_slice and n-D
1386+
// extract_slided_slice.
1387+
vector::populateVectorInsertExtractStridedSliceDecompositionPatterns(
1388+
patterns);
1389+
vector::InsertOp::getCanonicalizationPatterns(patterns, context);
1390+
vector::ExtractOp::getCanonicalizationPatterns(patterns, context);
1391+
1392+
// Trimming leading unit dims may generate broadcast/shape_cast ops. Clean
1393+
// them up.
1394+
vector::BroadcastOp::getCanonicalizationPatterns(patterns, context);
1395+
vector::ShapeCastOp::getCanonicalizationPatterns(patterns, context);
1396+
1397+
if (failed(applyPatternsAndFoldGreedily(op, std::move(patterns))))
1398+
return failure();
1399+
}
1400+
return success();
1401+
}
1402+
12881403
//===----------------------------------------------------------------------===//
12891404
// SPIR-V TypeConverter
12901405
//===----------------------------------------------------------------------===//

mlir/test/Conversion/ConvertToSPIRV/arith.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false" -split-input-file %s | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
//===----------------------------------------------------------------------===//
44
// arithmetic ops

mlir/test/Conversion/ConvertToSPIRV/combined.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false" %s | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
// CHECK-LABEL: @combined
44
// CHECK: %[[C0_F32:.*]] = spirv.Constant 0.000000e+00 : f32

mlir/test/Conversion/ConvertToSPIRV/func-signature-vector-unroll.mlir

+44
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,28 @@ func.func @simple_vector_8(%arg0 : vector<8xi32>) -> vector<8xi32> {
6666

6767
// -----
6868

69+
// CHECK-LABEL: @simple_vector_2d
70+
// CHECK-SAME: (%[[ARG0:.+]]: vector<4xi32>, %[[ARG1:.+]]: vector<4xi32>, %[[ARG2:.+]]: vector<4xi32>, %[[ARG3:.+]]: vector<4xi32>)
71+
func.func @simple_vector_2d(%arg0 : vector<4x4xi32>) -> vector<4x4xi32> {
72+
// CHECK: %[[CST:.*]] = arith.constant dense<0> : vector<4x4xi32>
73+
// CHECK: %[[INSERT0:.*]] = vector.insert_strided_slice %[[ARG0]], %[[CST]] {offsets = [0, 0], strides = [1]} : vector<4xi32> into vector<4x4xi32>
74+
// CHECK: %[[INSERT1:.*]] = vector.insert_strided_slice %[[ARG1]], %[[INSERT0]] {offsets = [1, 0], strides = [1]} : vector<4xi32> into vector<4x4xi32>
75+
// CHECK: %[[INSERT2:.*]] = vector.insert_strided_slice %[[ARG2]], %[[INSERT1]] {offsets = [2, 0], strides = [1]} : vector<4xi32> into vector<4x4xi32>
76+
// CHECK: %[[INSERT3:.*]] = vector.insert_strided_slice %[[ARG3]], %[[INSERT2]] {offsets = [3, 0], strides = [1]} : vector<4xi32> into vector<4x4xi32>
77+
// CHECK: %[[EXTRACT0:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [0, 0], sizes = [1, 4], strides = [1, 1]} : vector<4x4xi32> to vector<1x4xi32>
78+
// CHECK: %[[EXTRACT0_1:.*]] = vector.extract %[[EXTRACT0]][0] : vector<4xi32> from vector<1x4xi32>
79+
// CHECK: %[[EXTRACT1:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [1, 0], sizes = [1, 4], strides = [1, 1]} : vector<4x4xi32> to vector<1x4xi32>
80+
// CHECK: %[[EXTRACT1_1:.*]] = vector.extract %[[EXTRACT1]][0] : vector<4xi32> from vector<1x4xi32>
81+
// CHECK: %[[EXTRACT2:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [2, 0], sizes = [1, 4], strides = [1, 1]} : vector<4x4xi32> to vector<1x4xi32>
82+
// CHECK: %[[EXTRACT2_1:.*]] = vector.extract %[[EXTRACT2]][0] : vector<4xi32> from vector<1x4xi32>
83+
// CHECK: %[[EXTRACT3:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [3, 0], sizes = [1, 4], strides = [1, 1]} : vector<4x4xi32> to vector<1x4xi32>
84+
// CHECK: %[[EXTRACT3_1:.*]] = vector.extract %[[EXTRACT3]][0] : vector<4xi32> from vector<1x4xi32>
85+
// CHECK: return %[[EXTRACT0_1]], %[[EXTRACT1_1]], %[[EXTRACT2_1]], %[[EXTRACT3_1]] : vector<4xi32>, vector<4xi32>, vector<4xi32>, vector<4xi32>
86+
return %arg0 : vector<4x4xi32>
87+
}
88+
89+
// -----
90+
6991
// CHECK-LABEL: @vector_6and8
7092
// CHECK-SAME: (%[[ARG0:.+]]: vector<3xi32>, %[[ARG1:.+]]: vector<3xi32>, %[[ARG2:.+]]: vector<4xi32>, %[[ARG3:.+]]: vector<4xi32>)
7193
func.func @vector_6and8(%arg0 : vector<6xi32>, %arg1 : vector<8xi32>) -> (vector<6xi32>, vector<8xi32>) {
@@ -113,6 +135,28 @@ func.func @scalar_vector(%arg0 : vector<8xi32>, %arg1 : vector<3xi32>, %arg2 : i
113135

114136
// -----
115137

138+
// CHECK-LABEL: @vector_2dand1d
139+
// CHECK-SAME: (%[[ARG0:.+]]: vector<3xi32>, %[[ARG1:.+]]: vector<3xi32>, %[[ARG2:.+]]: vector<3xi32>, %[[ARG3:.+]]: vector<3xi32>, %[[ARG4:.+]]: vector<4xi32>)
140+
func.func @vector_2dand1d(%arg0 : vector<2x6xi32>, %arg1 : vector<4xi32>) -> (vector<2x6xi32>, vector<4xi32>) {
141+
// CHECK: %[[CST:.*]] = arith.constant dense<0> : vector<2x6xi32>
142+
// CHECK: %[[INSERT0:.*]] = vector.insert_strided_slice %[[ARG0]], %[[CST]] {offsets = [0, 0], strides = [1]} : vector<3xi32> into vector<2x6xi32>
143+
// CHECK: %[[INSERT1:.*]] = vector.insert_strided_slice %[[ARG1]], %[[INSERT0]] {offsets = [0, 3], strides = [1]} : vector<3xi32> into vector<2x6xi32>
144+
// CHECK: %[[INSERT2:.*]] = vector.insert_strided_slice %[[ARG2]], %[[INSERT1]] {offsets = [1, 0], strides = [1]} : vector<3xi32> into vector<2x6xi32>
145+
// CHECK: %[[INSERT3:.*]] = vector.insert_strided_slice %[[ARG3]], %[[INSERT2]] {offsets = [1, 3], strides = [1]} : vector<3xi32> into vector<2x6xi32>
146+
// CHECK: %[[EXTRACT0:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [0, 0], sizes = [1, 3], strides = [1, 1]} : vector<2x6xi32> to vector<1x3xi32>
147+
// CHECK: %[[EXTRACT0_1:.*]] = vector.extract %[[EXTRACT0]][0] : vector<3xi32> from vector<1x3xi32>
148+
// CHECK: %[[EXTRACT1:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [0, 3], sizes = [1, 3], strides = [1, 1]} : vector<2x6xi32> to vector<1x3xi32>
149+
// CHECK: %[[EXTRACT1_1:.*]] = vector.extract %[[EXTRACT1]][0] : vector<3xi32> from vector<1x3xi32>
150+
// CHECK: %[[EXTRACT2:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [1, 0], sizes = [1, 3], strides = [1, 1]} : vector<2x6xi32> to vector<1x3xi32>
151+
// CHECK: %[[EXTRACT2_1:.*]] = vector.extract %[[EXTRACT2]][0] : vector<3xi32> from vector<1x3xi32>
152+
// CHECK: %[[EXTRACT3:.*]] = vector.extract_strided_slice %[[INSERT3]] {offsets = [1, 3], sizes = [1, 3], strides = [1, 1]} : vector<2x6xi32> to vector<1x3xi32>
153+
// CHECK: %[[EXTRACT3_1:.*]] = vector.extract %[[EXTRACT3]][0] : vector<3xi32> from vector<1x3xi32>
154+
// CHECK: return %[[EXTRACT0_1]], %[[EXTRACT1_1]], %[[EXTRACT2_1]], %[[EXTRACT3_1]], %[[ARG4]] : vector<3xi32>, vector<3xi32>, vector<3xi32>, vector<3xi32>, vector<4xi32>
155+
return %arg0, %arg1 : vector<2x6xi32>, vector<4xi32>
156+
}
157+
158+
// -----
159+
116160
// CHECK-LABEL: @reduction
117161
// CHECK-SAME: (%[[ARG0:.+]]: vector<4xi32>, %[[ARG1:.+]]: vector<4xi32>, %[[ARG2:.+]]: vector<4xi32>, %[[ARG3:.+]]: vector<4xi32>, %[[ARG4:.+]]: i32)
118162
func.func @reduction(%arg0 : vector<8xi32>, %arg1 : vector<8xi32>, %arg2 : i32) -> (i32) {

mlir/test/Conversion/ConvertToSPIRV/index.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt %s -convert-to-spirv="run-signature-conversion=false" | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
// CHECK-LABEL: @basic
44
func.func @basic(%a: index, %b: index) {

mlir/test/Conversion/ConvertToSPIRV/scf.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false" %s | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
// CHECK-LABEL: @if_yield
44
// CHECK: %[[VAR:.*]] = spirv.Variable : !spirv.ptr<f32, Function>

mlir/test/Conversion/ConvertToSPIRV/simple.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false" %s | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
// CHECK-LABEL: @return_scalar
44
// CHECK-SAME: %[[ARG0:.*]]: i32

mlir/test/Conversion/ConvertToSPIRV/ub.mlir

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false" %s | FileCheck %s
1+
// RUN: mlir-opt -convert-to-spirv="run-signature-conversion=false run-vector-unrolling=false" -split-input-file %s | FileCheck %s
22

33
// CHECK-LABEL: @ub
44
// CHECK: %[[UNDEF:.*]] = spirv.Undef : i32

0 commit comments

Comments
 (0)