xref: /llvm-project/mlir/test/lib/IR/TestRegions.cpp (revision 850b2c6b3c73a48cce05c163c49fcea89491a5e1)
1*850b2c6bSMarkus Böck //===- TestRegions.cpp - Pass to test Region's methods --------------------===//
2*850b2c6bSMarkus Böck //
3*850b2c6bSMarkus Böck // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*850b2c6bSMarkus Böck // See https://llvm.org/LICENSE.txt for license information.
5*850b2c6bSMarkus Böck // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*850b2c6bSMarkus Böck //
7*850b2c6bSMarkus Böck //===----------------------------------------------------------------------===//
8*850b2c6bSMarkus Böck 
9*850b2c6bSMarkus Böck #include "TestDialect.h"
10*850b2c6bSMarkus Böck #include "mlir/Dialect/Func/IR/FuncOps.h"
11*850b2c6bSMarkus Böck #include "mlir/IR/BuiltinOps.h"
12*850b2c6bSMarkus Böck #include "mlir/Pass/Pass.h"
13*850b2c6bSMarkus Böck 
14*850b2c6bSMarkus Böck using namespace mlir;
15*850b2c6bSMarkus Böck 
16*850b2c6bSMarkus Böck namespace {
17*850b2c6bSMarkus Böck /// This is a test pass that tests Region's takeBody method by making the first
18*850b2c6bSMarkus Böck /// function take the body of the second.
19*850b2c6bSMarkus Böck struct TakeBodyPass
20*850b2c6bSMarkus Böck     : public PassWrapper<TakeBodyPass, OperationPass<ModuleOp>> {
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonbad05fcc0111::TakeBodyPass21*850b2c6bSMarkus Böck   MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TakeBodyPass)
22*850b2c6bSMarkus Böck 
23*850b2c6bSMarkus Böck   StringRef getArgument() const final { return "test-take-body"; }
getDescription__anonbad05fcc0111::TakeBodyPass24*850b2c6bSMarkus Böck   StringRef getDescription() const final { return "Test Region's takeBody"; }
25*850b2c6bSMarkus Böck 
runOnOperation__anonbad05fcc0111::TakeBodyPass26*850b2c6bSMarkus Böck   void runOnOperation() override {
27*850b2c6bSMarkus Böck     auto module = getOperation();
28*850b2c6bSMarkus Böck 
29*850b2c6bSMarkus Böck     SmallVector<func::FuncOp> functions =
30*850b2c6bSMarkus Böck         llvm::to_vector(module.getOps<func::FuncOp>());
31*850b2c6bSMarkus Böck     if (functions.size() != 2) {
32*850b2c6bSMarkus Böck       module.emitError("Expected only two functions in test");
33*850b2c6bSMarkus Böck       signalPassFailure();
34*850b2c6bSMarkus Böck       return;
35*850b2c6bSMarkus Böck     }
36*850b2c6bSMarkus Böck 
37*850b2c6bSMarkus Böck     functions[0].getBody().takeBody(functions[1].getBody());
38*850b2c6bSMarkus Böck   }
39*850b2c6bSMarkus Böck };
40*850b2c6bSMarkus Böck 
41*850b2c6bSMarkus Böck } // namespace
42*850b2c6bSMarkus Böck 
43*850b2c6bSMarkus Böck namespace mlir {
registerRegionTestPasses()44*850b2c6bSMarkus Böck void registerRegionTestPasses() { PassRegistration<TakeBodyPass>(); }
45*850b2c6bSMarkus Böck } // namespace mlir
46