From c67e04074c262aadf9804d1bb0f14eef52f4077f Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Thu, 1 Feb 2024 19:57:26 +0000 Subject: [PATCH 1/9] Add replaceWithZeroTripCheck to LoopLikeOpInterface --- .../mlir/Interfaces/LoopLikeInterface.td | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td index e2ac85a3f7725..77409cb3a8274 100644 --- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td +++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td @@ -220,6 +220,28 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> { /*defaultImplementation=*/[{ return ::mlir::failure(); }] + >, + InterfaceMethod<[{ + Add a zero-trip-check around the loop to check if the loop body is ever + run and return the new loop inside the check. The loop body is moved + over to the new loop. Returns "failure" if the loop doesn't support + this transformation. + + After the transformation, the ops inserted to the parent region of the + loop are guaranteed to be run only if the loop body runs at least one + iteration. + + Note: Ops in the loop body might be rearranged because of loop rotating + to maintain the semantic. Terminators might be removed/added during this + transformation. + }], + /*retTy=*/"::mlir::FailureOr<::mlir::LoopLikeOpInterface>", + /*methodName=*/"replaceWithZeroTripCheck", + /*args=*/(ins "::mlir::RewriterBase &":$rewriter), + /*methodBody=*/"", + /*defaultImplementation=*/[{ + return ::mlir::failure(); + }] > ]; From 059df4e60bdc0ce4dd9d36b78f89c34daf262ded Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Fri, 2 Feb 2024 18:59:03 +0000 Subject: [PATCH 2/9] Add tests --- mlir/unittests/Interfaces/CMakeLists.txt | 3 + .../Interfaces/LoopLikeInterfaceTest.cpp | 101 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp diff --git a/mlir/unittests/Interfaces/CMakeLists.txt b/mlir/unittests/Interfaces/CMakeLists.txt index d192b2922d6b9..cab9503cf295b 100644 --- a/mlir/unittests/Interfaces/CMakeLists.txt +++ b/mlir/unittests/Interfaces/CMakeLists.txt @@ -3,6 +3,7 @@ add_mlir_unittest(MLIRInterfacesTests DataLayoutInterfacesTest.cpp InferIntRangeInterfaceTest.cpp InferTypeOpInterfaceTest.cpp + LoopLikeInterfaceTest.cpp ) target_link_libraries(MLIRInterfacesTests @@ -12,7 +13,9 @@ target_link_libraries(MLIRInterfacesTests MLIRDataLayoutInterfaces MLIRDLTIDialect MLIRFuncDialect + MLIRIR MLIRInferIntRangeInterface MLIRInferTypeOpInterface + MLIRLoopLikeInterface MLIRParser ) diff --git a/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp b/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp new file mode 100644 index 0000000000000..b0b7680fed68e --- /dev/null +++ b/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp @@ -0,0 +1,101 @@ +//===- LoopLikeInterfaceTest.cpp - Unit tests for Loop Like Interfaces. ---===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "mlir/Interfaces/LoopLikeInterface.h" +#include "mlir/IR/BuiltinOps.h" +#include "mlir/IR/Dialect.h" +#include "mlir/IR/DialectImplementation.h" +#include "mlir/IR/OpDefinition.h" +#include "mlir/IR/OpImplementation.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Parser/Parser.h" + +#include + +using namespace mlir; + +struct NoZeroTripCheckLoopOp + : public Op { + using Op::Op; + + static ArrayRef getAttributeNames() { return {}; } + + static StringRef getOperationName() { + return "looptest.no_zero_trip_check_loop_op"; + } + + SmallVector getLoopRegions() { return {}; } +}; + +struct ImplZeroTripCheckLoopOp + : public Op { + using Op::Op; + + static ArrayRef getAttributeNames() { return {}; } + + static StringRef getOperationName() { + return "looptest.impl_zero_trip_check_loop_op"; + } + + SmallVector getLoopRegions() { return {}; } + + FailureOr + replaceWithZeroTripCheck(RewriterBase &rewriter) { + return cast(this->getOperation()); + } +}; + +/// A dialect putting all the above together. +struct LoopTestDialect : Dialect { + explicit LoopTestDialect(MLIRContext *ctx) + : Dialect(getDialectNamespace(), ctx, TypeID::get()) { + addOperations(); + } + static StringRef getDialectNamespace() { return "looptest"; } +}; + +TEST(LoopLikeOpInterface, NoReplaceWithZeroTripCheck) { + const char *ir = R"MLIR( + "looptest.no_zero_trip_check_loop_op"() : () -> () + )MLIR"; + + DialectRegistry registry; + registry.insert(); + MLIRContext ctx(registry); + + OwningOpRef module = parseSourceString(ir, &ctx); + LoopLikeOpInterface testOp = + cast(module->getBody()->getOperations().front()); + + IRRewriter rewriter(&ctx); + FailureOr result = + testOp.replaceWithZeroTripCheck(rewriter); + + EXPECT_TRUE(failed(result)); +} + +TEST(LoopLikeOpInterface, ImplReplaceWithZeroTripCheck) { + const char *ir = R"MLIR( + "looptest.impl_zero_trip_check_loop_op"() : () -> () + )MLIR"; + + DialectRegistry registry; + registry.insert(); + MLIRContext ctx(registry); + + OwningOpRef module = parseSourceString(ir, &ctx); + LoopLikeOpInterface testOp = + cast(module->getBody()->getOperations().front()); + + IRRewriter rewriter(&ctx); + FailureOr result = + testOp.replaceWithZeroTripCheck(rewriter); + + EXPECT_TRUE(succeeded(result)); + EXPECT_EQ(*result, testOp); +} From 2cf88e0ac78d84e908c32bfdf93ed7cd0693df7d Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Fri, 2 Feb 2024 19:12:14 +0000 Subject: [PATCH 3/9] Update comments --- mlir/include/mlir/Interfaces/LoopLikeInterface.td | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td index 77409cb3a8274..81f202cf34186 100644 --- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td +++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td @@ -233,7 +233,10 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> { Note: Ops in the loop body might be rearranged because of loop rotating to maintain the semantic. Terminators might be removed/added during this - transformation. + transformation. Also callers are not required to check the side-effect + of loop condition, so the transformation needs to consider that to make + sure the loop behavior is unchanged when moving the condtion out of the + loop for the zero-trip-check. }], /*retTy=*/"::mlir::FailureOr<::mlir::LoopLikeOpInterface>", /*methodName=*/"replaceWithZeroTripCheck", From ab65656260ec3325634b5196a18ed8caf8b87523 Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Mon, 5 Feb 2024 21:39:51 +0000 Subject: [PATCH 4/9] Update comments --- mlir/include/mlir/Interfaces/LoopLikeInterface.td | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td index 81f202cf34186..572845f46d320 100644 --- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td +++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td @@ -223,9 +223,8 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> { >, InterfaceMethod<[{ Add a zero-trip-check around the loop to check if the loop body is ever - run and return the new loop inside the check. The loop body is moved - over to the new loop. Returns "failure" if the loop doesn't support - this transformation. + run and return the same loop (moved) or a new loop (replaced) inside the + check. Returns "failure" if the loop doesn't support the transformation. After the transformation, the ops inserted to the parent region of the loop are guaranteed to be run only if the loop body runs at least one @@ -235,7 +234,7 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> { to maintain the semantic. Terminators might be removed/added during this transformation. Also callers are not required to check the side-effect of loop condition, so the transformation needs to consider that to make - sure the loop behavior is unchanged when moving the condtion out of the + sure the loop behavior is unchanged when moving the condition out of the loop for the zero-trip-check. }], /*retTy=*/"::mlir::FailureOr<::mlir::LoopLikeOpInterface>", From bd919fb2d0ee6ff00c5090fa0e2c9dc44252e6be Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Mon, 5 Feb 2024 22:58:38 +0000 Subject: [PATCH 5/9] Add test pass --- .../LoopLikeInterface/CMakeLists.txt | 1 + .../TestLoopZeroTripCheck.cpp | 52 +++++++++++++++++++ mlir/tools/mlir-opt/mlir-opt.cpp | 2 + 3 files changed, 55 insertions(+) create mode 100644 mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp diff --git a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt b/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt index f20219e00cb86..19a727822dc67 100644 --- a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt +++ b/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt @@ -1,5 +1,6 @@ add_mlir_library(MLIRLoopLikeInterfaceTestPasses TestBlockInLoop.cpp + TestLoopZeroTripCheck.cpp EXCLUDE_FROM_LIBMLIR diff --git a/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp b/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp new file mode 100644 index 0000000000000..45f0f312aceea --- /dev/null +++ b/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp @@ -0,0 +1,52 @@ +//===- TestLoopZeroTripCheck.cpp.cpp -- Pass to test replaceWithZeroTripC--===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the passes to test replaceWithZeroTripCheck of loop ops. +// +//===----------------------------------------------------------------------===// + +#include "mlir/Dialect/Func/IR/FuncOps.h" +#include "mlir/IR/PatternMatch.h" +#include "mlir/Interfaces/LoopLikeInterface.h" +#include "mlir/Pass/Pass.h" + +using namespace mlir; + +namespace { + +struct TestLoopZeroTripCheck + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestLoopZeroTripCheck) + + StringRef getArgument() const final { return "test-loop-zero-trip-check"; } + StringRef getDescription() const final { + return "test replaceWithZeroTripCheck of loop ops"; + } + + void runOnOperation() override { + func::FuncOp func = getOperation(); + MLIRContext *context = &getContext(); + IRRewriter rewriter(context); + func.walk([&](LoopLikeOpInterface op) { + auto result = op.replaceWithZeroTripCheck(rewriter); + if (failed(result)) { + // Ignore failures (e.g. not implemented) in tests. + } + }); + } +}; + +} // namespace + +namespace mlir { +namespace test { +void registerTestLoopZeroTripCheckPass() { + PassRegistration(); +} +} // namespace test +} // namespace mlir diff --git a/mlir/tools/mlir-opt/mlir-opt.cpp b/mlir/tools/mlir-opt/mlir-opt.cpp index 428bdd9691e09..6ac3283bcb9d1 100644 --- a/mlir/tools/mlir-opt/mlir-opt.cpp +++ b/mlir/tools/mlir-opt/mlir-opt.cpp @@ -110,6 +110,7 @@ void registerTestLoopFusion(); void registerTestCFGLoopInfoPass(); void registerTestLoopMappingPass(); void registerTestLoopUnrollingPass(); +void registerTestLoopZeroTripCheckPass(); void registerTestLowerToLLVM(); void registerTestLowerToNVVM(); void registerTestMakeIsolatedFromAbovePass(); @@ -234,6 +235,7 @@ void registerTestPasses() { mlir::test::registerTestCFGLoopInfoPass(); mlir::test::registerTestLoopMappingPass(); mlir::test::registerTestLoopUnrollingPass(); + mlir::test::registerTestLoopZeroTripCheckPass(); mlir::test::registerTestLowerToLLVM(); mlir::test::registerTestMakeIsolatedFromAbovePass(); mlir::test::registerTestMatchReductionPass(); From 9c2095013188c32936360a0eb44d89f3817a1f68 Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Mon, 5 Feb 2024 22:59:03 +0000 Subject: [PATCH 6/9] Revert "Add tests" This reverts commit d6703ebbeb5ddc358929672b44994a9d05683523. --- mlir/unittests/Interfaces/CMakeLists.txt | 3 - .../Interfaces/LoopLikeInterfaceTest.cpp | 101 ------------------ 2 files changed, 104 deletions(-) delete mode 100644 mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp diff --git a/mlir/unittests/Interfaces/CMakeLists.txt b/mlir/unittests/Interfaces/CMakeLists.txt index cab9503cf295b..d192b2922d6b9 100644 --- a/mlir/unittests/Interfaces/CMakeLists.txt +++ b/mlir/unittests/Interfaces/CMakeLists.txt @@ -3,7 +3,6 @@ add_mlir_unittest(MLIRInterfacesTests DataLayoutInterfacesTest.cpp InferIntRangeInterfaceTest.cpp InferTypeOpInterfaceTest.cpp - LoopLikeInterfaceTest.cpp ) target_link_libraries(MLIRInterfacesTests @@ -13,9 +12,7 @@ target_link_libraries(MLIRInterfacesTests MLIRDataLayoutInterfaces MLIRDLTIDialect MLIRFuncDialect - MLIRIR MLIRInferIntRangeInterface MLIRInferTypeOpInterface - MLIRLoopLikeInterface MLIRParser ) diff --git a/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp b/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp deleted file mode 100644 index b0b7680fed68e..0000000000000 --- a/mlir/unittests/Interfaces/LoopLikeInterfaceTest.cpp +++ /dev/null @@ -1,101 +0,0 @@ -//===- LoopLikeInterfaceTest.cpp - Unit tests for Loop Like Interfaces. ---===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "mlir/Interfaces/LoopLikeInterface.h" -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/Dialect.h" -#include "mlir/IR/DialectImplementation.h" -#include "mlir/IR/OpDefinition.h" -#include "mlir/IR/OpImplementation.h" -#include "mlir/IR/PatternMatch.h" -#include "mlir/Parser/Parser.h" - -#include - -using namespace mlir; - -struct NoZeroTripCheckLoopOp - : public Op { - using Op::Op; - - static ArrayRef getAttributeNames() { return {}; } - - static StringRef getOperationName() { - return "looptest.no_zero_trip_check_loop_op"; - } - - SmallVector getLoopRegions() { return {}; } -}; - -struct ImplZeroTripCheckLoopOp - : public Op { - using Op::Op; - - static ArrayRef getAttributeNames() { return {}; } - - static StringRef getOperationName() { - return "looptest.impl_zero_trip_check_loop_op"; - } - - SmallVector getLoopRegions() { return {}; } - - FailureOr - replaceWithZeroTripCheck(RewriterBase &rewriter) { - return cast(this->getOperation()); - } -}; - -/// A dialect putting all the above together. -struct LoopTestDialect : Dialect { - explicit LoopTestDialect(MLIRContext *ctx) - : Dialect(getDialectNamespace(), ctx, TypeID::get()) { - addOperations(); - } - static StringRef getDialectNamespace() { return "looptest"; } -}; - -TEST(LoopLikeOpInterface, NoReplaceWithZeroTripCheck) { - const char *ir = R"MLIR( - "looptest.no_zero_trip_check_loop_op"() : () -> () - )MLIR"; - - DialectRegistry registry; - registry.insert(); - MLIRContext ctx(registry); - - OwningOpRef module = parseSourceString(ir, &ctx); - LoopLikeOpInterface testOp = - cast(module->getBody()->getOperations().front()); - - IRRewriter rewriter(&ctx); - FailureOr result = - testOp.replaceWithZeroTripCheck(rewriter); - - EXPECT_TRUE(failed(result)); -} - -TEST(LoopLikeOpInterface, ImplReplaceWithZeroTripCheck) { - const char *ir = R"MLIR( - "looptest.impl_zero_trip_check_loop_op"() : () -> () - )MLIR"; - - DialectRegistry registry; - registry.insert(); - MLIRContext ctx(registry); - - OwningOpRef module = parseSourceString(ir, &ctx); - LoopLikeOpInterface testOp = - cast(module->getBody()->getOperations().front()); - - IRRewriter rewriter(&ctx); - FailureOr result = - testOp.replaceWithZeroTripCheck(rewriter); - - EXPECT_TRUE(succeeded(result)); - EXPECT_EQ(*result, testOp); -} From 0e90f3934fa188d3c016776e610be9465dcc40c1 Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Mon, 5 Feb 2024 23:03:06 +0000 Subject: [PATCH 7/9] Add missing mlir file --- .../Dialect/SCF/loop-zero-trip-check.mlir | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 mlir/test/Dialect/SCF/loop-zero-trip-check.mlir diff --git a/mlir/test/Dialect/SCF/loop-zero-trip-check.mlir b/mlir/test/Dialect/SCF/loop-zero-trip-check.mlir new file mode 100644 index 0000000000000..654dad896b56a --- /dev/null +++ b/mlir/test/Dialect/SCF/loop-zero-trip-check.mlir @@ -0,0 +1,21 @@ +// RUN: mlir-opt %s -test-loop-zero-trip-check -split-input-file | FileCheck %s + +func.func @no_replace_scf_while_with_zero_trip_check(%bound : i32) -> i32 { + %cst0 = arith.constant 0 : i32 + %cst5 = arith.constant 5 : i32 + %res:2 = scf.while (%iter = %cst0) : (i32) -> (i32, i32) { + %cond = arith.cmpi slt, %iter, %bound : i32 + %inv = arith.addi %bound, %cst5 : i32 + scf.condition(%cond) %iter, %inv : i32, i32 + } do { + ^bb0(%arg1: i32, %arg2: i32): + %next = arith.addi %arg1, %arg2 : i32 + scf.yield %next : i32 + } + return %res#0 : i32 +} + +// TODO(pzread): Update the test once the replaceZeroTripCheck is implemented. +// CHECK-LABEL: func.func @no_replace_scf_while_with_zero_trip_check +// CHECK-NOT: scf.if +// CHECK: scf.while From b3cf941d43007b035fc53c6087054b12a8e93560 Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Tue, 6 Feb 2024 19:12:52 +0000 Subject: [PATCH 8/9] Improve comments --- .../lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp b/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp index 45f0f312aceea..e908da6b03f11 100644 --- a/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp +++ b/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp @@ -35,7 +35,8 @@ struct TestLoopZeroTripCheck func.walk([&](LoopLikeOpInterface op) { auto result = op.replaceWithZeroTripCheck(rewriter); if (failed(result)) { - // Ignore failures (e.g. not implemented) in tests. + // Ignore not implemented failure in tests. The expected output should + // catch problems (e.g. transformation doesn't happen). } }); } From 3d77beba99ee6451fd0d3d3f670d6dde731c42e0 Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Wed, 7 Feb 2024 18:44:13 +0000 Subject: [PATCH 9/9] Rename to wrapInZeroTripCheck --- .../mlir/Interfaces/LoopLikeInterface.td | 2 +- ...heck.mlir => wrap-in-zero-trip-check.mlir} | 8 ++++---- .../LoopLikeInterface/CMakeLists.txt | 2 +- ...pCheck.cpp => TestWrapInZeroTripCheck.cpp} | 20 +++++++++---------- mlir/tools/mlir-opt/mlir-opt.cpp | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) rename mlir/test/Dialect/SCF/{loop-zero-trip-check.mlir => wrap-in-zero-trip-check.mlir} (59%) rename mlir/test/lib/Interfaces/LoopLikeInterface/{TestLoopZeroTripCheck.cpp => TestWrapInZeroTripCheck.cpp} (63%) diff --git a/mlir/include/mlir/Interfaces/LoopLikeInterface.td b/mlir/include/mlir/Interfaces/LoopLikeInterface.td index 572845f46d320..2a02bdf2b7dbf 100644 --- a/mlir/include/mlir/Interfaces/LoopLikeInterface.td +++ b/mlir/include/mlir/Interfaces/LoopLikeInterface.td @@ -238,7 +238,7 @@ def LoopLikeOpInterface : OpInterface<"LoopLikeOpInterface"> { loop for the zero-trip-check. }], /*retTy=*/"::mlir::FailureOr<::mlir::LoopLikeOpInterface>", - /*methodName=*/"replaceWithZeroTripCheck", + /*methodName=*/"wrapInZeroTripCheck", /*args=*/(ins "::mlir::RewriterBase &":$rewriter), /*methodBody=*/"", /*defaultImplementation=*/[{ diff --git a/mlir/test/Dialect/SCF/loop-zero-trip-check.mlir b/mlir/test/Dialect/SCF/wrap-in-zero-trip-check.mlir similarity index 59% rename from mlir/test/Dialect/SCF/loop-zero-trip-check.mlir rename to mlir/test/Dialect/SCF/wrap-in-zero-trip-check.mlir index 654dad896b56a..112104093e42c 100644 --- a/mlir/test/Dialect/SCF/loop-zero-trip-check.mlir +++ b/mlir/test/Dialect/SCF/wrap-in-zero-trip-check.mlir @@ -1,6 +1,6 @@ -// RUN: mlir-opt %s -test-loop-zero-trip-check -split-input-file | FileCheck %s +// RUN: mlir-opt %s -test-wrap-in-zero-trip-check -split-input-file | FileCheck %s -func.func @no_replace_scf_while_with_zero_trip_check(%bound : i32) -> i32 { +func.func @no_wrap_scf_while_in_zero_trip_check(%bound : i32) -> i32 { %cst0 = arith.constant 0 : i32 %cst5 = arith.constant 5 : i32 %res:2 = scf.while (%iter = %cst0) : (i32) -> (i32, i32) { @@ -15,7 +15,7 @@ func.func @no_replace_scf_while_with_zero_trip_check(%bound : i32) -> i32 { return %res#0 : i32 } -// TODO(pzread): Update the test once the replaceZeroTripCheck is implemented. -// CHECK-LABEL: func.func @no_replace_scf_while_with_zero_trip_check +// TODO(pzread): Update the test once the wrapInZeroTripCheck is implemented. +// CHECK-LABEL: func.func @no_wrap_scf_while_in_zero_trip_check // CHECK-NOT: scf.if // CHECK: scf.while diff --git a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt b/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt index 19a727822dc67..f89cd547b865c 100644 --- a/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt +++ b/mlir/test/lib/Interfaces/LoopLikeInterface/CMakeLists.txt @@ -1,6 +1,6 @@ add_mlir_library(MLIRLoopLikeInterfaceTestPasses TestBlockInLoop.cpp - TestLoopZeroTripCheck.cpp + TestWrapInZeroTripCheck.cpp EXCLUDE_FROM_LIBMLIR diff --git a/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp b/mlir/test/lib/Interfaces/LoopLikeInterface/TestWrapInZeroTripCheck.cpp similarity index 63% rename from mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp rename to mlir/test/lib/Interfaces/LoopLikeInterface/TestWrapInZeroTripCheck.cpp index e908da6b03f11..c12e0ab78ef26 100644 --- a/mlir/test/lib/Interfaces/LoopLikeInterface/TestLoopZeroTripCheck.cpp +++ b/mlir/test/lib/Interfaces/LoopLikeInterface/TestWrapInZeroTripCheck.cpp @@ -1,4 +1,4 @@ -//===- TestLoopZeroTripCheck.cpp.cpp -- Pass to test replaceWithZeroTripC--===// +//===- TestWrapInZeroTripCheck.cpp -- Pass to test wrapInZeroTripCheck ----===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// This file implements the passes to test replaceWithZeroTripCheck of loop ops. +// This file implements the passes to test wrapInZeroTripCheck of loop ops. // //===----------------------------------------------------------------------===// @@ -19,13 +19,13 @@ using namespace mlir; namespace { -struct TestLoopZeroTripCheck - : public PassWrapper> { - MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestLoopZeroTripCheck) +struct TestWrapInZeroTripCheck + : public PassWrapper> { + MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestWrapInZeroTripCheck) - StringRef getArgument() const final { return "test-loop-zero-trip-check"; } + StringRef getArgument() const final { return "test-wrap-in-zero-trip-check"; } StringRef getDescription() const final { - return "test replaceWithZeroTripCheck of loop ops"; + return "test wrapInZeroTripCheck of loop ops"; } void runOnOperation() override { @@ -33,7 +33,7 @@ struct TestLoopZeroTripCheck MLIRContext *context = &getContext(); IRRewriter rewriter(context); func.walk([&](LoopLikeOpInterface op) { - auto result = op.replaceWithZeroTripCheck(rewriter); + auto result = op.wrapInZeroTripCheck(rewriter); if (failed(result)) { // Ignore not implemented failure in tests. The expected output should // catch problems (e.g. transformation doesn't happen). @@ -46,8 +46,8 @@ struct TestLoopZeroTripCheck namespace mlir { namespace test { -void registerTestLoopZeroTripCheckPass() { - PassRegistration(); +void registerTestWrapInZeroTripCheckPass() { + PassRegistration(); } } // namespace test } // namespace mlir diff --git a/mlir/tools/mlir-opt/mlir-opt.cpp b/mlir/tools/mlir-opt/mlir-opt.cpp index 6ac3283bcb9d1..3259411dfa36d 100644 --- a/mlir/tools/mlir-opt/mlir-opt.cpp +++ b/mlir/tools/mlir-opt/mlir-opt.cpp @@ -110,7 +110,6 @@ void registerTestLoopFusion(); void registerTestCFGLoopInfoPass(); void registerTestLoopMappingPass(); void registerTestLoopUnrollingPass(); -void registerTestLoopZeroTripCheckPass(); void registerTestLowerToLLVM(); void registerTestLowerToNVVM(); void registerTestMakeIsolatedFromAbovePass(); @@ -137,6 +136,7 @@ void registerTestTensorTransforms(); void registerTestTopologicalSortAnalysisPass(); void registerTestTransformDialectEraseSchedulePass(); void registerTestTransformDialectInterpreterPass(); +void registerTestWrapInZeroTripCheckPass(); void registerTestWrittenToPass(); void registerTestVectorLowerings(); void registerTestVectorReductionToSPIRVDotProd(); @@ -235,7 +235,6 @@ void registerTestPasses() { mlir::test::registerTestCFGLoopInfoPass(); mlir::test::registerTestLoopMappingPass(); mlir::test::registerTestLoopUnrollingPass(); - mlir::test::registerTestLoopZeroTripCheckPass(); mlir::test::registerTestLowerToLLVM(); mlir::test::registerTestMakeIsolatedFromAbovePass(); mlir::test::registerTestMatchReductionPass(); @@ -263,6 +262,7 @@ void registerTestPasses() { mlir::test::registerTestVectorLowerings(); mlir::test::registerTestVectorReductionToSPIRVDotProd(); mlir::test::registerTestNvgpuLowerings(); + mlir::test::registerTestWrapInZeroTripCheckPass(); mlir::test::registerTestWrittenToPass(); #if MLIR_ENABLE_PDL_IN_PATTERNMATCH mlir::test::registerTestDialectConversionPasses();