127df7158SSergei Grechanik //===- TestPrintInvalid.cpp - Test printing invalid ops -------------------===// 227df7158SSergei Grechanik // 327df7158SSergei Grechanik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 427df7158SSergei Grechanik // See https://llvm.org/LICENSE.txt for license information. 527df7158SSergei Grechanik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 627df7158SSergei Grechanik // 727df7158SSergei Grechanik //===----------------------------------------------------------------------===// 827df7158SSergei Grechanik // 927df7158SSergei Grechanik // This pass creates and prints to the standard output an invalid operation and 1027df7158SSergei Grechanik // a valid operation. 1127df7158SSergei Grechanik // 1227df7158SSergei Grechanik //===----------------------------------------------------------------------===// 1327df7158SSergei Grechanik 1427df7158SSergei Grechanik #include "mlir/Dialect/Func/IR/FuncOps.h" 1536d3efeaSRiver Riddle #include "mlir/IR/BuiltinOps.h" 1627df7158SSergei Grechanik #include "mlir/Pass/Pass.h" 1727df7158SSergei Grechanik #include "llvm/Support/raw_ostream.h" 1827df7158SSergei Grechanik 1927df7158SSergei Grechanik using namespace mlir; 2027df7158SSergei Grechanik 2127df7158SSergei Grechanik namespace { 2227df7158SSergei Grechanik struct TestPrintInvalidPass 2327df7158SSergei Grechanik : public PassWrapper<TestPrintInvalidPass, OperationPass<ModuleOp>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonefe362e90111::TestPrintInvalidPass245e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestPrintInvalidPass) 255e50dd04SRiver Riddle 2627df7158SSergei Grechanik StringRef getArgument() const final { return "test-print-invalid"; } getDescription__anonefe362e90111::TestPrintInvalidPass2727df7158SSergei Grechanik StringRef getDescription() const final { 2827df7158SSergei Grechanik return "Test printing invalid ops."; 2927df7158SSergei Grechanik } getDependentDialects__anonefe362e90111::TestPrintInvalidPass3003ed3951SBenjamin Kramer void getDependentDialects(DialectRegistry ®istry) const override { 3127df7158SSergei Grechanik registry.insert<func::FuncDialect>(); 3227df7158SSergei Grechanik } 3327df7158SSergei Grechanik runOnOperation__anonefe362e90111::TestPrintInvalidPass3427df7158SSergei Grechanik void runOnOperation() override { 3527df7158SSergei Grechanik Location loc = getOperation().getLoc(); 36f8d5c73cSRiver Riddle OpBuilder builder(getOperation().getBodyRegion()); 37*58ceae95SRiver Riddle auto funcOp = builder.create<func::FuncOp>( 3827df7158SSergei Grechanik loc, "test", FunctionType::get(getOperation().getContext(), {}, {})); 3927df7158SSergei Grechanik funcOp.addEntryBlock(); 4027df7158SSergei Grechanik // The created function is invalid because there is no return op. 4127df7158SSergei Grechanik llvm::outs() << "Invalid operation:\n" << funcOp << "\n"; 4227df7158SSergei Grechanik builder.setInsertionPointToEnd(&funcOp.getBody().front()); 4327df7158SSergei Grechanik builder.create<func::ReturnOp>(loc); 4427df7158SSergei Grechanik // Now this function is valid. 4527df7158SSergei Grechanik llvm::outs() << "Valid operation:\n" << funcOp << "\n"; 4627df7158SSergei Grechanik funcOp.erase(); 4727df7158SSergei Grechanik } 4827df7158SSergei Grechanik }; 4927df7158SSergei Grechanik } // namespace 5027df7158SSergei Grechanik 5127df7158SSergei Grechanik namespace mlir { registerTestPrintInvalidPass()5227df7158SSergei Grechanikvoid registerTestPrintInvalidPass() { 5327df7158SSergei Grechanik PassRegistration<TestPrintInvalidPass>{}; 5427df7158SSergei Grechanik } 5527df7158SSergei Grechanik } // namespace mlir 56