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öckvoid registerRegionTestPasses() { PassRegistration<TakeBodyPass>(); } 45*850b2c6bSMarkus Böck } // namespace mlir 46