1*de826ea3SSrishti Srivastava //===- TestLivenessAnalysis.cpp - Test liveness analysis ------------------===// 2*de826ea3SSrishti Srivastava // 3*de826ea3SSrishti Srivastava // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*de826ea3SSrishti Srivastava // See https://llvm.org/LICENSE.txt for license information. 5*de826ea3SSrishti Srivastava // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*de826ea3SSrishti Srivastava // 7*de826ea3SSrishti Srivastava //===----------------------------------------------------------------------===// 8*de826ea3SSrishti Srivastava 9*de826ea3SSrishti Srivastava #include <llvm/ADT/STLExtras.h> 10*de826ea3SSrishti Srivastava #include <llvm/Support/raw_ostream.h> 11*de826ea3SSrishti Srivastava #include <mlir/Analysis/DataFlow/LivenessAnalysis.h> 12*de826ea3SSrishti Srivastava 13*de826ea3SSrishti Srivastava #include <cassert> 14*de826ea3SSrishti Srivastava #include <mlir/Analysis/DataFlowFramework.h> 15*de826ea3SSrishti Srivastava #include <mlir/IR/BuiltinAttributes.h> 16*de826ea3SSrishti Srivastava #include <mlir/IR/Operation.h> 17*de826ea3SSrishti Srivastava #include <mlir/IR/SymbolTable.h> 18*de826ea3SSrishti Srivastava #include <mlir/Pass/Pass.h> 19*de826ea3SSrishti Srivastava #include <mlir/Pass/PassRegistry.h> 20*de826ea3SSrishti Srivastava #include <mlir/Support/LLVM.h> 21*de826ea3SSrishti Srivastava #include <mlir/Support/TypeID.h> 22*de826ea3SSrishti Srivastava 23*de826ea3SSrishti Srivastava using namespace mlir; 24*de826ea3SSrishti Srivastava using namespace mlir::dataflow; 25*de826ea3SSrishti Srivastava 26*de826ea3SSrishti Srivastava namespace { 27*de826ea3SSrishti Srivastava 28*de826ea3SSrishti Srivastava struct TestLivenessAnalysisPass 29*de826ea3SSrishti Srivastava : public PassWrapper<TestLivenessAnalysisPass, OperationPass<>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anon230f108c0111::TestLivenessAnalysisPass30*de826ea3SSrishti Srivastava MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestLivenessAnalysisPass) 31*de826ea3SSrishti Srivastava 32*de826ea3SSrishti Srivastava StringRef getArgument() const override { return "test-liveness-analysis"; } 33*de826ea3SSrishti Srivastava runOnOperation__anon230f108c0111::TestLivenessAnalysisPass34*de826ea3SSrishti Srivastava void runOnOperation() override { 35*de826ea3SSrishti Srivastava auto &livenessAnalysis = getAnalysis<RunLivenessAnalysis>(); 36*de826ea3SSrishti Srivastava 37*de826ea3SSrishti Srivastava Operation *op = getOperation(); 38*de826ea3SSrishti Srivastava 39*de826ea3SSrishti Srivastava raw_ostream &os = llvm::outs(); 40*de826ea3SSrishti Srivastava 41*de826ea3SSrishti Srivastava op->walk([&](Operation *op) { 42*de826ea3SSrishti Srivastava auto tag = op->getAttrOfType<StringAttr>("tag"); 43*de826ea3SSrishti Srivastava if (!tag) 44*de826ea3SSrishti Srivastava return; 45*de826ea3SSrishti Srivastava os << "test_tag: " << tag.getValue() << ":\n"; 46*de826ea3SSrishti Srivastava for (auto [index, operand] : llvm::enumerate(op->getOperands())) { 47*de826ea3SSrishti Srivastava const Liveness *liveness = livenessAnalysis.getLiveness(operand); 48*de826ea3SSrishti Srivastava assert(liveness && "expected a sparse lattice"); 49*de826ea3SSrishti Srivastava os << " operand #" << index << ": "; 50*de826ea3SSrishti Srivastava liveness->print(os); 51*de826ea3SSrishti Srivastava os << "\n"; 52*de826ea3SSrishti Srivastava } 53*de826ea3SSrishti Srivastava for (auto [index, operand] : llvm::enumerate(op->getResults())) { 54*de826ea3SSrishti Srivastava const Liveness *liveness = livenessAnalysis.getLiveness(operand); 55*de826ea3SSrishti Srivastava assert(liveness && "expected a sparse lattice"); 56*de826ea3SSrishti Srivastava os << " result #" << index << ": "; 57*de826ea3SSrishti Srivastava liveness->print(os); 58*de826ea3SSrishti Srivastava os << "\n"; 59*de826ea3SSrishti Srivastava } 60*de826ea3SSrishti Srivastava }); 61*de826ea3SSrishti Srivastava } 62*de826ea3SSrishti Srivastava }; 63*de826ea3SSrishti Srivastava } // end anonymous namespace 64*de826ea3SSrishti Srivastava 65*de826ea3SSrishti Srivastava namespace mlir { 66*de826ea3SSrishti Srivastava namespace test { registerTestLivenessAnalysisPass()67*de826ea3SSrishti Srivastavavoid registerTestLivenessAnalysisPass() { 68*de826ea3SSrishti Srivastava PassRegistration<TestLivenessAnalysisPass>(); 69*de826ea3SSrishti Srivastava } 70*de826ea3SSrishti Srivastava } // end namespace test 71*de826ea3SSrishti Srivastava } // end namespace mlir 72