xref: /llvm-project/mlir/test/lib/Analysis/DataFlow/TestLivenessAnalysis.cpp (revision db791b278a414fb6df1acc1799adcf11d8fb9169)
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 Srivastava void registerTestLivenessAnalysisPass() {
68*de826ea3SSrishti Srivastava   PassRegistration<TestLivenessAnalysisPass>();
69*de826ea3SSrishti Srivastava }
70*de826ea3SSrishti Srivastava } // end namespace test
71*de826ea3SSrishti Srivastava } // end namespace mlir
72