xref: /llvm-project/mlir/test/lib/IR/TestPrintInvalid.cpp (revision 58ceae9561fbae75fa175244db4e0e4bfe7416fd)
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 &registry) 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 Grechanik void registerTestPrintInvalidPass() {
5327df7158SSergei Grechanik   PassRegistration<TestPrintInvalidPass>{};
5427df7158SSergei Grechanik }
5527df7158SSergei Grechanik } // namespace mlir
56