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 ®ion = 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