xref: /llvm-project/mlir/test/lib/Transforms/TestMakeIsolatedFromAbove.cpp (revision 09dfc5713d7e2342bea4c8447d1ed76c85eb8225)
1da784e77SMahesh Ravishankar //===- TestMakeIsolatedFromAbove.cpp - Test makeIsolatedFromAbove method -===//
2da784e77SMahesh Ravishankar //
3da784e77SMahesh Ravishankar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4da784e77SMahesh Ravishankar // See https://llvm.org/LICENSE.txt for license information.
5da784e77SMahesh Ravishankar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6da784e77SMahesh Ravishankar //
7da784e77SMahesh Ravishankar //===----------------------------------------------------------------------===//
8da784e77SMahesh Ravishankar 
9da784e77SMahesh Ravishankar #include "TestDialect.h"
10e95e94adSJeff Niu #include "TestOps.h"
11da784e77SMahesh Ravishankar #include "mlir/Dialect/Func/IR/FuncOps.h"
12da784e77SMahesh Ravishankar #include "mlir/IR/PatternMatch.h"
13da784e77SMahesh Ravishankar #include "mlir/Pass/Pass.h"
14da784e77SMahesh Ravishankar #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
15da784e77SMahesh Ravishankar #include "mlir/Transforms/RegionUtils.h"
16da784e77SMahesh Ravishankar 
17da784e77SMahesh Ravishankar using namespace mlir;
18da784e77SMahesh Ravishankar 
19da784e77SMahesh Ravishankar /// Helper function to call the `makeRegionIsolatedFromAbove` to convert
20da784e77SMahesh Ravishankar /// `test.one_region_op` to `test.isolated_one_region_op`.
21da784e77SMahesh Ravishankar static LogicalResult
22da784e77SMahesh Ravishankar makeIsolatedFromAboveImpl(RewriterBase &rewriter,
23da784e77SMahesh Ravishankar                           test::OneRegionWithOperandsOp regionOp,
24da784e77SMahesh Ravishankar                           llvm::function_ref<bool(Operation *)> callBack) {
25da784e77SMahesh Ravishankar   Region &region = regionOp.getRegion();
26da784e77SMahesh Ravishankar   SmallVector<Value> capturedValues =
27da784e77SMahesh Ravishankar       makeRegionIsolatedFromAbove(rewriter, region, callBack);
28da784e77SMahesh Ravishankar   SmallVector<Value> operands = regionOp.getOperands();
29da784e77SMahesh Ravishankar   operands.append(capturedValues);
30da784e77SMahesh Ravishankar   auto isolatedRegionOp =
31da784e77SMahesh Ravishankar       rewriter.create<test::IsolatedOneRegionOp>(regionOp.getLoc(), operands);
32da784e77SMahesh Ravishankar   rewriter.inlineRegionBefore(region, isolatedRegionOp.getRegion(),
33da784e77SMahesh Ravishankar                               isolatedRegionOp.getRegion().begin());
34da784e77SMahesh Ravishankar   rewriter.eraseOp(regionOp);
35da784e77SMahesh Ravishankar   return success();
36da784e77SMahesh Ravishankar }
37da784e77SMahesh Ravishankar 
38da784e77SMahesh Ravishankar namespace {
39da784e77SMahesh Ravishankar 
40da784e77SMahesh Ravishankar /// Simple test for making region isolated from above without cloning any
41da784e77SMahesh Ravishankar /// operations.
42da784e77SMahesh Ravishankar struct SimpleMakeIsolatedFromAbove
43da784e77SMahesh Ravishankar     : OpRewritePattern<test::OneRegionWithOperandsOp> {
44da784e77SMahesh Ravishankar   using OpRewritePattern::OpRewritePattern;
45da784e77SMahesh Ravishankar 
46da784e77SMahesh Ravishankar   LogicalResult matchAndRewrite(test::OneRegionWithOperandsOp regionOp,
47da784e77SMahesh Ravishankar                                 PatternRewriter &rewriter) const override {
48da784e77SMahesh Ravishankar     return makeIsolatedFromAboveImpl(rewriter, regionOp,
49da784e77SMahesh Ravishankar                                      [](Operation *) { return false; });
50da784e77SMahesh Ravishankar   }
51da784e77SMahesh Ravishankar };
52da784e77SMahesh Ravishankar 
53da784e77SMahesh Ravishankar /// Test for making region isolated from above while clong operations
54da784e77SMahesh Ravishankar /// with no operands.
55da784e77SMahesh Ravishankar struct MakeIsolatedFromAboveAndCloneOpsWithNoOperands
56da784e77SMahesh Ravishankar     : OpRewritePattern<test::OneRegionWithOperandsOp> {
57da784e77SMahesh Ravishankar   using OpRewritePattern::OpRewritePattern;
58da784e77SMahesh Ravishankar 
59da784e77SMahesh Ravishankar   LogicalResult matchAndRewrite(test::OneRegionWithOperandsOp regionOp,
60da784e77SMahesh Ravishankar                                 PatternRewriter &rewriter) const override {
61da784e77SMahesh Ravishankar     return makeIsolatedFromAboveImpl(rewriter, regionOp, [](Operation *op) {
62da784e77SMahesh Ravishankar       return op->getNumOperands() == 0;
63da784e77SMahesh Ravishankar     });
64da784e77SMahesh Ravishankar   }
65da784e77SMahesh Ravishankar };
66da784e77SMahesh Ravishankar 
67da784e77SMahesh Ravishankar /// Test for making region isolated from above while clong operations
68da784e77SMahesh Ravishankar /// with no operands.
69da784e77SMahesh Ravishankar struct MakeIsolatedFromAboveAndCloneOpsWithOperands
70da784e77SMahesh Ravishankar     : OpRewritePattern<test::OneRegionWithOperandsOp> {
71da784e77SMahesh Ravishankar   using OpRewritePattern::OpRewritePattern;
72da784e77SMahesh Ravishankar 
73da784e77SMahesh Ravishankar   LogicalResult matchAndRewrite(test::OneRegionWithOperandsOp regionOp,
74da784e77SMahesh Ravishankar                                 PatternRewriter &rewriter) const override {
75da784e77SMahesh Ravishankar     return makeIsolatedFromAboveImpl(rewriter, regionOp,
76da784e77SMahesh Ravishankar                                      [](Operation *op) { return true; });
77da784e77SMahesh Ravishankar   }
78da784e77SMahesh Ravishankar };
79da784e77SMahesh Ravishankar 
80da784e77SMahesh Ravishankar /// Test pass for testing the `makeIsolatedFromAbove` function.
81da784e77SMahesh Ravishankar struct TestMakeIsolatedFromAbovePass
82da784e77SMahesh Ravishankar     : public PassWrapper<TestMakeIsolatedFromAbovePass,
83da784e77SMahesh Ravishankar                          OperationPass<func::FuncOp>> {
84da784e77SMahesh Ravishankar 
85da784e77SMahesh Ravishankar   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestMakeIsolatedFromAbovePass)
86da784e77SMahesh Ravishankar 
87da784e77SMahesh Ravishankar   TestMakeIsolatedFromAbovePass() = default;
88da784e77SMahesh Ravishankar   TestMakeIsolatedFromAbovePass(const TestMakeIsolatedFromAbovePass &pass)
89da784e77SMahesh Ravishankar       : PassWrapper(pass) {}
90da784e77SMahesh Ravishankar 
91da784e77SMahesh Ravishankar   StringRef getArgument() const final {
92da784e77SMahesh Ravishankar     return "test-make-isolated-from-above";
93da784e77SMahesh Ravishankar   }
94da784e77SMahesh Ravishankar 
95da784e77SMahesh Ravishankar   StringRef getDescription() const final {
96da784e77SMahesh Ravishankar     return "Test making a region isolated from above";
97da784e77SMahesh Ravishankar   }
98da784e77SMahesh Ravishankar 
99da784e77SMahesh Ravishankar   Option<bool> simple{
100da784e77SMahesh Ravishankar       *this, "simple",
101da784e77SMahesh Ravishankar       llvm::cl::desc("Test simple case with no cloning of operations"),
102da784e77SMahesh Ravishankar       llvm::cl::init(false)};
103da784e77SMahesh Ravishankar 
104da784e77SMahesh Ravishankar   Option<bool> cloneOpsWithNoOperands{
105da784e77SMahesh Ravishankar       *this, "clone-ops-with-no-operands",
106da784e77SMahesh Ravishankar       llvm::cl::desc("Test case with cloning of operations with no operands"),
107da784e77SMahesh Ravishankar       llvm::cl::init(false)};
108da784e77SMahesh Ravishankar 
109da784e77SMahesh Ravishankar   Option<bool> cloneOpsWithOperands{
110da784e77SMahesh Ravishankar       *this, "clone-ops-with-operands",
111da784e77SMahesh Ravishankar       llvm::cl::desc("Test case with cloning of operations with no operands"),
112da784e77SMahesh Ravishankar       llvm::cl::init(false)};
113da784e77SMahesh Ravishankar 
114da784e77SMahesh Ravishankar   void runOnOperation() override;
115da784e77SMahesh Ravishankar };
116da784e77SMahesh Ravishankar 
117da784e77SMahesh Ravishankar } // namespace
118da784e77SMahesh Ravishankar 
119da784e77SMahesh Ravishankar void TestMakeIsolatedFromAbovePass::runOnOperation() {
120da784e77SMahesh Ravishankar   MLIRContext *context = &getContext();
121da784e77SMahesh Ravishankar   func::FuncOp funcOp = getOperation();
122da784e77SMahesh Ravishankar 
123da784e77SMahesh Ravishankar   if (simple) {
124da784e77SMahesh Ravishankar     RewritePatternSet patterns(context);
125da784e77SMahesh Ravishankar     patterns.insert<SimpleMakeIsolatedFromAbove>(context);
126*09dfc571SJacques Pienaar     if (failed(applyPatternsGreedily(funcOp, std::move(patterns)))) {
127da784e77SMahesh Ravishankar       return signalPassFailure();
128da784e77SMahesh Ravishankar     }
129da784e77SMahesh Ravishankar     return;
130da784e77SMahesh Ravishankar   }
131da784e77SMahesh Ravishankar 
132da784e77SMahesh Ravishankar   if (cloneOpsWithNoOperands) {
133da784e77SMahesh Ravishankar     RewritePatternSet patterns(context);
134da784e77SMahesh Ravishankar     patterns.insert<MakeIsolatedFromAboveAndCloneOpsWithNoOperands>(context);
135*09dfc571SJacques Pienaar     if (failed(applyPatternsGreedily(funcOp, std::move(patterns)))) {
136da784e77SMahesh Ravishankar       return signalPassFailure();
137da784e77SMahesh Ravishankar     }
138da784e77SMahesh Ravishankar     return;
139da784e77SMahesh Ravishankar   }
140da784e77SMahesh Ravishankar 
141da784e77SMahesh Ravishankar   if (cloneOpsWithOperands) {
142da784e77SMahesh Ravishankar     RewritePatternSet patterns(context);
143da784e77SMahesh Ravishankar     patterns.insert<MakeIsolatedFromAboveAndCloneOpsWithOperands>(context);
144*09dfc571SJacques Pienaar     if (failed(applyPatternsGreedily(funcOp, std::move(patterns)))) {
145da784e77SMahesh Ravishankar       return signalPassFailure();
146da784e77SMahesh Ravishankar     }
147da784e77SMahesh Ravishankar     return;
148da784e77SMahesh Ravishankar   }
149da784e77SMahesh Ravishankar }
150da784e77SMahesh Ravishankar 
151da784e77SMahesh Ravishankar namespace mlir {
152da784e77SMahesh Ravishankar namespace test {
153da784e77SMahesh Ravishankar void registerTestMakeIsolatedFromAbovePass() {
154da784e77SMahesh Ravishankar   PassRegistration<TestMakeIsolatedFromAbovePass>();
155da784e77SMahesh Ravishankar }
156da784e77SMahesh Ravishankar } // namespace test
157da784e77SMahesh Ravishankar } // namespace mlir
158