163d1dc66SMehdi Amini //===- TestPrintDefUse.cpp - Passes to illustrate the IR def-use chains ---===// 263d1dc66SMehdi Amini // 363d1dc66SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 463d1dc66SMehdi Amini // See https://llvm.org/LICENSE.txt for license information. 563d1dc66SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 663d1dc66SMehdi Amini // 763d1dc66SMehdi Amini //===----------------------------------------------------------------------===// 863d1dc66SMehdi Amini 965fcddffSRiver Riddle #include "mlir/IR/BuiltinOps.h" 1063d1dc66SMehdi Amini #include "mlir/Pass/Pass.h" 1163d1dc66SMehdi Amini 1263d1dc66SMehdi Amini using namespace mlir; 1363d1dc66SMehdi Amini 1463d1dc66SMehdi Amini namespace { 1563d1dc66SMehdi Amini /// This pass illustrates the IR def-use chains through printing. 1663d1dc66SMehdi Amini struct TestPrintDefUsePass 1763d1dc66SMehdi Amini : public PassWrapper<TestPrintDefUsePass, OperationPass<>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anonc8d6829e0111::TestPrintDefUsePass185e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestPrintDefUsePass) 195e50dd04SRiver Riddle 20b5e22e6dSMehdi Amini StringRef getArgument() const final { return "test-print-defuse"; } getDescription__anonc8d6829e0111::TestPrintDefUsePass21b5e22e6dSMehdi Amini StringRef getDescription() const final { return "Test various printing."; } runOnOperation__anonc8d6829e0111::TestPrintDefUsePass2263d1dc66SMehdi Amini void runOnOperation() override { 2363d1dc66SMehdi Amini // Recursively traverse the IR nested under the current operation and print 2463d1dc66SMehdi Amini // every single operation and their operands and users. 2563d1dc66SMehdi Amini getOperation()->walk([](Operation *op) { 2663d1dc66SMehdi Amini llvm::outs() << "Visiting op '" << op->getName() << "' with " 2763d1dc66SMehdi Amini << op->getNumOperands() << " operands:\n"; 2863d1dc66SMehdi Amini 2963d1dc66SMehdi Amini // Print information about the producer of each of the operands. 3063d1dc66SMehdi Amini for (Value operand : op->getOperands()) { 3163d1dc66SMehdi Amini if (Operation *producer = operand.getDefiningOp()) { 3263d1dc66SMehdi Amini llvm::outs() << " - Operand produced by operation '" 3363d1dc66SMehdi Amini << producer->getName() << "'\n"; 3463d1dc66SMehdi Amini } else { 3563d1dc66SMehdi Amini // If there is no defining op, the Value is necessarily a Block 3663d1dc66SMehdi Amini // argument. 37*5550c821STres Popp auto blockArg = cast<BlockArgument>(operand); 3863d1dc66SMehdi Amini llvm::outs() << " - Operand produced by Block argument, number " 3963d1dc66SMehdi Amini << blockArg.getArgNumber() << "\n"; 4063d1dc66SMehdi Amini } 4163d1dc66SMehdi Amini } 4263d1dc66SMehdi Amini 4363d1dc66SMehdi Amini // Print information about the user of each of the result. 4463d1dc66SMehdi Amini llvm::outs() << "Has " << op->getNumResults() << " results:\n"; 4589de9cc8SMehdi Amini for (const auto &indexedResult : llvm::enumerate(op->getResults())) { 4663d1dc66SMehdi Amini Value result = indexedResult.value(); 4763d1dc66SMehdi Amini llvm::outs() << " - Result " << indexedResult.index(); 4863d1dc66SMehdi Amini if (result.use_empty()) { 4963d1dc66SMehdi Amini llvm::outs() << " has no uses\n"; 5063d1dc66SMehdi Amini continue; 5163d1dc66SMehdi Amini } 5263d1dc66SMehdi Amini if (result.hasOneUse()) { 5363d1dc66SMehdi Amini llvm::outs() << " has a single use: "; 5463d1dc66SMehdi Amini } else { 5563d1dc66SMehdi Amini llvm::outs() << " has " 5663d1dc66SMehdi Amini << std::distance(result.getUses().begin(), 5763d1dc66SMehdi Amini result.getUses().end()) 5863d1dc66SMehdi Amini << " uses:\n"; 5963d1dc66SMehdi Amini } 6063d1dc66SMehdi Amini for (Operation *userOp : result.getUsers()) { 6163d1dc66SMehdi Amini llvm::outs() << " - " << userOp->getName() << "\n"; 6263d1dc66SMehdi Amini } 6363d1dc66SMehdi Amini } 6463d1dc66SMehdi Amini }); 6563d1dc66SMehdi Amini } 6663d1dc66SMehdi Amini }; 67be0a7e9fSMehdi Amini } // namespace 6863d1dc66SMehdi Amini 6963d1dc66SMehdi Amini namespace mlir { registerTestPrintDefUsePass()70b5e22e6dSMehdi Aminivoid registerTestPrintDefUsePass() { PassRegistration<TestPrintDefUsePass>(); } 7163d1dc66SMehdi Amini } // namespace mlir 72