[Mlir-commits] [mlir] 34696e6 - [NFC] Generalize a couple of passes so they can operate on any FunctionLike op.
Stella Laurenzo
llvmlistbot at llvm.org
Mon Dec 13 12:01:58 PST 2021
Author: Stella Laurenzo
Date: 2021-12-13T12:01:53-08:00
New Revision: 34696e6542894ac63dbfb899b0181c539c223ef1
URL: https://github.com/llvm/llvm-project/commit/34696e6542894ac63dbfb899b0181c539c223ef1
DIFF: https://github.com/llvm/llvm-project/commit/34696e6542894ac63dbfb899b0181c539c223ef1.diff
LOG: [NFC] Generalize a couple of passes so they can operate on any FunctionLike op.
* Generalizes passes linalg-detensorize, linalg-fold-unit-extent-dims, convert-elementwise-to-linalg.
* I feel that more work could be done in the future (i.e. make FunctionLike into a proper OpInterface and extend actions in dialect conversion to be trait based), and this patch would be a good record of why that is useful.
* Note for downstreams:
* Since these passes are now generic, they do not automatically nest with pass managers set up for that.
* If running them over nested functions, you must nest explicitly. Upstream has adopted this style but *-opt still has some uses of implicit pipelines via args. See tests for argument changes needed.
Differential Revision: https://reviews.llvm.org/D115645
Added:
Modified:
mlir/include/mlir/Dialect/Linalg/Passes.h
mlir/include/mlir/Dialect/Linalg/Passes.td
mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp
mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp
mlir/test/Dialect/Linalg/convert-elementwise-to-linalg.mlir
mlir/test/Dialect/Linalg/detensorize_0d.mlir
mlir/test/Dialect/Linalg/detensorize_br_operands.mlir
mlir/test/Dialect/Linalg/detensorize_if.mlir
mlir/test/Dialect/Linalg/detensorize_trivial.mlir
mlir/test/Dialect/Linalg/detensorize_while.mlir
mlir/test/Dialect/Linalg/detensorize_while_impure_cf.mlir
mlir/test/Dialect/Linalg/detensorize_while_pure_cf.mlir
mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir
mlir/test/Dialect/Linalg/fold-unit-trip-loops.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Linalg/Passes.h b/mlir/include/mlir/Dialect/Linalg/Passes.h
index b4f3f070673e0..f21252800af89 100644
--- a/mlir/include/mlir/Dialect/Linalg/Passes.h
+++ b/mlir/include/mlir/Dialect/Linalg/Passes.h
@@ -19,9 +19,9 @@
namespace mlir {
-std::unique_ptr<OperationPass<FuncOp>> createConvertElementwiseToLinalgPass();
+std::unique_ptr<Pass> createConvertElementwiseToLinalgPass();
-std::unique_ptr<OperationPass<FuncOp>> createLinalgFoldUnitExtentDimsPass();
+std::unique_ptr<Pass> createLinalgFoldUnitExtentDimsPass();
std::unique_ptr<Pass> createLinalgElementwiseOpFusionPass();
std::unique_ptr<Pass> createFoldReshapeOpsByLinearizationPass();
diff --git a/mlir/include/mlir/Dialect/Linalg/Passes.td b/mlir/include/mlir/Dialect/Linalg/Passes.td
index cfba6ac546a13..ae1e806d58423 100644
--- a/mlir/include/mlir/Dialect/Linalg/Passes.td
+++ b/mlir/include/mlir/Dialect/Linalg/Passes.td
@@ -11,12 +11,15 @@
include "mlir/Pass/PassBase.td"
-def ConvertElementwiseToLinalg : FunctionPass<"convert-elementwise-to-linalg"> {
+def ConvertElementwiseToLinalg : Pass<"convert-elementwise-to-linalg", ""> {
let summary = "Convert ElementwiseMappable ops to linalg";
let description = [{
Convert ops with the `ElementwiseMappable` trait to linalg parallel loops.
This pass only converts ops that operate on ranked tensors.
+
+ This can be run on any op with the FunctionLike trait and must not be
+ run on others.
}];
let constructor = "mlir::createConvertElementwiseToLinalgPass()";
let dependentDialects = ["linalg::LinalgDialect", "memref::MemRefDialect"];
@@ -54,8 +57,12 @@ def LinalgComprehensiveModuleBufferize :
let constructor = "mlir::createLinalgComprehensiveModuleBufferizePass()";
}
-def LinalgFoldUnitExtentDims : FunctionPass<"linalg-fold-unit-extent-dims"> {
+def LinalgFoldUnitExtentDims : Pass<"linalg-fold-unit-extent-dims", ""> {
let summary = "Remove unit-extent dimension in Linalg ops on tensors";
+ let description = [{
+ This can be run on any op with the FunctionLike trait and must not be
+ run on others.
+ }];
let constructor = "mlir::createLinalgFoldUnitExtentDimsPass()";
let options = [
Option<"foldOneTripLoopsOnly", "fold-one-trip-loops-only", "bool",
@@ -197,7 +204,7 @@ def LinalgGeneralization : FunctionPass<"linalg-generalize-named-ops"> {
let dependentDialects = ["linalg::LinalgDialect"];
}
-def LinalgDetensorize : FunctionPass<"linalg-detensorize"> {
+def LinalgDetensorize : Pass<"linalg-detensorize", ""> {
let summary = "Detensorize linalg ops";
let constructor = "mlir::createLinalgDetensorizePass()";
let dependentDialects = [];
@@ -222,6 +229,9 @@ def LinalgDetensorize : FunctionPass<"linalg-detensorize"> {
In addition to detensoring individual ops, this pass detensors internal
control flow inside a function. All blocks except for the entry block are
detensored by converting their arguments whenever possible.
+
+ This can be run on any op with the FunctionLike trait and must not be
+ run on others.
}];
}
diff --git a/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp b/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
index 0da4f282cde1e..276d4b7280174 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/Detensorize.cpp
@@ -93,10 +93,11 @@ class DetensorizeGenericOp : public OpConversionPattern<GenericOp> {
/// A conversion pattern for detensoring internal (non-entry) blocks within a
/// function.
struct FunctionNonEntryBlockConversion : public ConversionPattern {
- FunctionNonEntryBlockConversion(StringRef functionLikeOpName,
- MLIRContext *ctx, TypeConverter &converter,
+ FunctionNonEntryBlockConversion(MLIRContext *ctx, TypeConverter &converter,
DenseSet<BlockArgument> blockArgsToDetensor)
- : ConversionPattern(converter, functionLikeOpName, /*benefit=*/1, ctx),
+ : ConversionPattern(converter, MatchTraitOpTypeTag(),
+ TypeID::get<OpTrait::FunctionLike>(), /*benefit=*/1,
+ ctx),
blockArgsToDetensor(blockArgsToDetensor) {}
LogicalResult
@@ -235,7 +236,8 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
/// detensored, then:
/// - opsToDetensor should be = {linalg.generic{add}}.
/// - blockArgsToDetensor should be = {bb1 -> {0}, bb2 -> {0}}.
- virtual void compute(FuncOp func, DetensorizeTypeConverter typeConverter,
+ virtual void compute(Operation *func,
+ DetensorizeTypeConverter typeConverter,
DenseSet<Operation *> &opsToDetensor,
DenseSet<BlockArgument> &blockArgsToDetensor) = 0;
@@ -286,18 +288,18 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
/// AND can be detensored.
class ControlFlowDetectionModel : public CostModel {
public:
- void compute(FuncOp func, DetensorizeTypeConverter typeConverter,
+ void compute(Operation *func, DetensorizeTypeConverter typeConverter,
DenseSet<Operation *> &opsToDetensor,
DenseSet<BlockArgument> &blockArgsToDetensor) override {
SmallVector<Value> workList;
- func.walk([&](CondBranchOp condBr) {
+ func->walk([&](CondBranchOp condBr) {
for (auto operand : condBr.getOperands()) {
workList.push_back(operand);
}
});
- func.walk([&](BranchOp br) {
+ func->walk([&](BranchOp br) {
for (auto operand : br.getOperands()) {
workList.push_back(operand);
}
@@ -491,21 +493,24 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
/// Detensorize everything that can detensored.
class AggressiveDetensoringModel : public CostModel {
public:
- void compute(FuncOp func, DetensorizeTypeConverter typeConverter,
+ void compute(Operation *func, DetensorizeTypeConverter typeConverter,
DenseSet<Operation *> &opsToDetensor,
DenseSet<BlockArgument> &blockArgsToDetensor) override {
- func.walk([&](GenericOp genericOp) {
+ func->walk([&](GenericOp genericOp) {
if (shouldBeDetensored(genericOp, typeConverter))
opsToDetensor.insert(genericOp);
});
- for (Block &block : llvm::drop_begin(func.getBody(), 1))
+ for (Block &block :
+ llvm::drop_begin(function_like_impl::getFunctionBody(func), 1))
for (BlockArgument blockArgument : block.getArguments())
blockArgsToDetensor.insert(blockArgument);
}
};
- void runOnFunction() override {
+ void runOnOperation() override {
+ assert(getOperation()->hasTrait<OpTrait::FunctionLike>() &&
+ "DetensorizePass can only be run on FunctionLike operations");
MLIRContext *context = &getContext();
DetensorizeTypeConverter typeConverter;
RewritePatternSet patterns(context);
@@ -516,12 +521,12 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
if (aggressiveMode.getValue()) {
AggressiveDetensoringModel costModel;
- costModel.compute(getFunction(), typeConverter, opsToDetensor,
+ costModel.compute(getOperation(), typeConverter, opsToDetensor,
blockArgsToDetensor);
} else {
ControlFlowDetectionModel costModel;
- costModel.compute(getFunction(), typeConverter, opsToDetensor,
+ costModel.compute(getOperation(), typeConverter, opsToDetensor,
blockArgsToDetensor);
}
@@ -531,24 +536,26 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
target.addDynamicallyLegalOp<GenericOp>(
[&](GenericOp op) { return !opsToDetensor.count(op); });
- target.addDynamicallyLegalOp<FuncOp>([&](FuncOp op) {
+ target.markUnknownOpDynamicallyLegal([&](Operation *op) {
// A function is legal if all of its non-entry blocks are legal. We
// don't legalize the entry block (i.e. the function's signature)
// since detensoring can't happen along external calling convention
// boundaries, which we conservatively approximate as all function
// signatures.
- return llvm::all_of(llvm::drop_begin(op.getBody(), 1), [&](Block &block) {
- if (llvm::any_of(blockArgsToDetensor, [&](BlockArgument blockArgument) {
- return blockArgument.getOwner() == &block &&
- !typeConverter.isLegal(blockArgument.getType());
- })) {
- return false;
- }
- return true;
- });
- });
+ if (op->hasTrait<OpTrait::FunctionLike>()) {
+ auto &body = function_like_impl::getFunctionBody(op);
+ return llvm::all_of(llvm::drop_begin(body, 1), [&](Block &block) {
+ if (llvm::any_of(
+ blockArgsToDetensor, [&](BlockArgument blockArgument) {
+ return blockArgument.getOwner() == &block &&
+ !typeConverter.isLegal(blockArgument.getType());
+ })) {
+ return false;
+ }
+ return true;
+ });
+ }
- target.markUnknownOpDynamicallyLegal([&](Operation *op) {
if (isNotBranchOpInterfaceOrReturnLikeOp(op) ||
isLegalForReturnOpTypeConversionPattern(op, typeConverter,
/*returnOpAlwaysLegal*/ true))
@@ -570,8 +577,7 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
});
patterns.insert<DetensorizeGenericOp>(typeConverter, context);
- patterns.insert<FunctionNonEntryBlockConversion>(FuncOp::getOperationName(),
- context, typeConverter,
+ patterns.insert<FunctionNonEntryBlockConversion>(context, typeConverter,
blockArgsToDetensor);
// Since non-entry block arguments get detensorized, we also need to
// update the control flow inside the function to reflect the correct
@@ -585,12 +591,13 @@ struct LinalgDetensorize : public LinalgDetensorizeBase<LinalgDetensorize> {
populateBranchOpInterfaceTypeConversionPattern(patterns, typeConverter,
shouldConvertBranchOperand);
- if (failed(applyFullConversion(getFunction(), target, std::move(patterns))))
+ if (failed(
+ applyFullConversion(getOperation(), target, std::move(patterns))))
signalPassFailure();
RewritePatternSet canonPatterns(context);
canonPatterns.add<ExtractFromReshapeFromElements>(context);
- if (failed(applyPatternsAndFoldGreedily(getFunction(),
+ if (failed(applyPatternsAndFoldGreedily(getOperation(),
std::move(canonPatterns))))
signalPassFailure();
}
diff --git a/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp b/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp
index cfd582dd97a24..6ae5fe1c076e0 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/DropUnitDims.cpp
@@ -558,20 +558,23 @@ namespace {
/// Pass that removes unit-extent dims within generic ops.
struct LinalgFoldUnitExtentDimsPass
: public LinalgFoldUnitExtentDimsBase<LinalgFoldUnitExtentDimsPass> {
- void runOnFunction() override {
- FuncOp funcOp = getFunction();
- MLIRContext *context = funcOp.getContext();
+ void runOnOperation() override {
+ auto funcOp = getOperation();
+ assert(funcOp->hasTrait<OpTrait::FunctionLike>() &&
+ "LinalgFoldUnitExtentDimsPass can only be run on FunctionLike "
+ "operations");
+ MLIRContext *context = funcOp->getContext();
RewritePatternSet patterns(context);
if (foldOneTripLoopsOnly)
patterns.add<FoldUnitDimLoops>(context);
else
populateFoldUnitExtentDimsPatterns(patterns);
- (void)applyPatternsAndFoldGreedily(funcOp.getBody(), std::move(patterns));
+ (void)applyPatternsAndFoldGreedily(
+ function_like_impl::getFunctionBody(funcOp), std::move(patterns));
}
};
} // namespace
-std::unique_ptr<OperationPass<FuncOp>>
-mlir::createLinalgFoldUnitExtentDimsPass() {
+std::unique_ptr<Pass> mlir::createLinalgFoldUnitExtentDimsPass() {
return std::make_unique<LinalgFoldUnitExtentDimsPass>();
}
diff --git a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp
index 9ce3dc5fb42f0..38b4ab641cce3 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseToLinalg.cpp
@@ -126,8 +126,12 @@ namespace {
class ConvertElementwiseToLinalgPass
: public ConvertElementwiseToLinalgBase<ConvertElementwiseToLinalgPass> {
- void runOnFunction() final {
+ void runOnOperation() final {
auto func = getOperation();
+ assert(func->hasTrait<OpTrait::FunctionLike>() &&
+ "ConvertElementwiseToLinalgPass can only be run on FunctionLike "
+ "operations");
+
auto *context = &getContext();
ConversionTarget target(*context);
RewritePatternSet patterns(context);
@@ -143,7 +147,6 @@ class ConvertElementwiseToLinalgPass
};
} // namespace
-std::unique_ptr<OperationPass<FuncOp>>
-mlir::createConvertElementwiseToLinalgPass() {
+std::unique_ptr<Pass> mlir::createConvertElementwiseToLinalgPass() {
return std::make_unique<ConvertElementwiseToLinalgPass>();
}
diff --git a/mlir/test/Dialect/Linalg/convert-elementwise-to-linalg.mlir b/mlir/test/Dialect/Linalg/convert-elementwise-to-linalg.mlir
index 9ac90d154c8e7..394e33df321f8 100644
--- a/mlir/test/Dialect/Linalg/convert-elementwise-to-linalg.mlir
+++ b/mlir/test/Dialect/Linalg/convert-elementwise-to-linalg.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt -convert-elementwise-to-linalg -split-input-file %s | FileCheck %s
+// RUN: mlir-opt -pass-pipeline="builtin.func(convert-elementwise-to-linalg)" -split-input-file %s | FileCheck %s
// In-depth checking of the linalg.generic op for a very trivial case.
// CHECK: #[[$MAP:.*]] = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_0d.mlir b/mlir/test/Dialect/Linalg/detensorize_0d.mlir
index 5e8c7580efe6d..2d73c5b97c455 100644
--- a/mlir/test/Dialect/Linalg/detensorize_0d.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_0d.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -allow-unregistered-dialect -linalg-detensorize=aggressive-mode | FileCheck %s
+// RUN: mlir-opt %s -allow-unregistered-dialect -pass-pipeline="builtin.func(linalg-detensorize{aggressive-mode})" | FileCheck %s
#map = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_br_operands.mlir b/mlir/test/Dialect/Linalg/detensorize_br_operands.mlir
index f6ddc54f7145d..2682a298dd2aa 100644
--- a/mlir/test/Dialect/Linalg/detensorize_br_operands.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_br_operands.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -split-input-file -allow-unregistered-dialect -linalg-detensorize | FileCheck %s
+// RUN: mlir-opt %s -split-input-file -allow-unregistered-dialect -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s
// TODO: Detensoring breaks if %arg0 or %arg1 are passed directly as tensors. Fix that.
func @if_true_test(%arg0: i1, %arg1: i32) -> tensor<i32> attributes {} {
diff --git a/mlir/test/Dialect/Linalg/detensorize_if.mlir b/mlir/test/Dialect/Linalg/detensorize_if.mlir
index e780829dfe671..c9e843bc7d69b 100644
--- a/mlir/test/Dialect/Linalg/detensorize_if.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_if.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -split-input-file -allow-unregistered-dialect -linalg-detensorize | FileCheck %s
+// RUN: mlir-opt %s -split-input-file -allow-unregistered-dialect -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s
#map0 = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_trivial.mlir b/mlir/test/Dialect/Linalg/detensorize_trivial.mlir
index 513509b4b7070..5862327ebe6c7 100644
--- a/mlir/test/Dialect/Linalg/detensorize_trivial.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_trivial.mlir
@@ -1,5 +1,5 @@
-// RUN: mlir-opt %s -linalg-detensorize=aggressive-mode | FileCheck %s -check-prefix=DET-ALL
-// RUN: mlir-opt %s -linalg-detensorize | FileCheck %s -check-prefix=DET-CF
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize{aggressive-mode})" | FileCheck %s -check-prefix=DET-ALL
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s -check-prefix=DET-CF
#map0 = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_while.mlir b/mlir/test/Dialect/Linalg/detensorize_while.mlir
index 54f459d57c480..9ece0029737c9 100644
--- a/mlir/test/Dialect/Linalg/detensorize_while.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_while.mlir
@@ -1,5 +1,5 @@
-// RUN: mlir-opt %s -linalg-detensorize=aggressive-mode | FileCheck %s -check-prefix=DET-ALL
-// RUN: mlir-opt %s -linalg-detensorize | FileCheck %s -check-prefix=DET-CF
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize{aggressive-mode})" | FileCheck %s -check-prefix=DET-ALL
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s -check-prefix=DET-CF
#map0 = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_while_impure_cf.mlir b/mlir/test/Dialect/Linalg/detensorize_while_impure_cf.mlir
index cf380db3c19f6..765692fa2d3d4 100644
--- a/mlir/test/Dialect/Linalg/detensorize_while_impure_cf.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_while_impure_cf.mlir
@@ -1,5 +1,5 @@
-// RUN: mlir-opt %s -linalg-detensorize=aggressive-mode | FileCheck %s -check-prefix=DET-ALL
-// RUN: mlir-opt %s -linalg-detensorize | FileCheck %s -check-prefix=DET-CF
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize{aggressive-mode})" | FileCheck %s -check-prefix=DET-ALL
+// RUN: mlir-opt %s -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s -check-prefix=DET-CF
#map0 = affine_map<() -> ()>
#map1 = affine_map<(i) -> ()>
diff --git a/mlir/test/Dialect/Linalg/detensorize_while_pure_cf.mlir b/mlir/test/Dialect/Linalg/detensorize_while_pure_cf.mlir
index 1b720160affe2..5ac7ab5206804 100644
--- a/mlir/test/Dialect/Linalg/detensorize_while_pure_cf.mlir
+++ b/mlir/test/Dialect/Linalg/detensorize_while_pure_cf.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -allow-unregistered-dialect -linalg-detensorize | FileCheck %s
+// RUN: mlir-opt %s -allow-unregistered-dialect -pass-pipeline="builtin.func(linalg-detensorize)" | FileCheck %s
#map0 = affine_map<() -> ()>
diff --git a/mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir b/mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir
index 634f38455192d..79765ca9dac78 100644
--- a/mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir
+++ b/mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -split-input-file -linalg-fold-unit-extent-dims | FileCheck %s
+// RUN: mlir-opt %s -split-input-file -pass-pipeline="builtin.func(linalg-fold-unit-extent-dims)" | FileCheck %s
#accesses = [
affine_map<(i, j, k, l, m) -> (i, k, m)>,
diff --git a/mlir/test/Dialect/Linalg/fold-unit-trip-loops.mlir b/mlir/test/Dialect/Linalg/fold-unit-trip-loops.mlir
index d0c526e441b69..7654e520a855d 100644
--- a/mlir/test/Dialect/Linalg/fold-unit-trip-loops.mlir
+++ b/mlir/test/Dialect/Linalg/fold-unit-trip-loops.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -split-input-file -linalg-fold-unit-extent-dims="fold-one-trip-loops-only" | FileCheck %s
+// RUN: mlir-opt %s -split-input-file -pass-pipeline="builtin.func(linalg-fold-unit-extent-dims{fold-one-trip-loops-only})" | FileCheck %s
#accesses = [
affine_map<(i, j, k, l, m) -> (i, k, m)>,
More information about the Mlir-commits
mailing list