//===- llvm/Analysis/DDGPrinter.h -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // // This file defines the DOT printer for the Data-Dependence Graph (DDG). // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_DDGPRINTER_H #define LLVM_ANALYSIS_DDGPRINTER_H #include "llvm/Analysis/DDG.h" #include "llvm/Pass.h" #include "llvm/Support/DOTGraphTraits.h" namespace llvm { //===--------------------------------------------------------------------===// // Implementation of DDG DOT Printer for a loop. //===--------------------------------------------------------------------===// class DDGDotPrinterPass : public PassInfoMixin { public: PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U); }; //===--------------------------------------------------------------------===// // Specialization of DOTGraphTraits. //===--------------------------------------------------------------------===// template <> struct DOTGraphTraits : public DefaultDOTGraphTraits { DOTGraphTraits(bool IsSimple = false) : DefaultDOTGraphTraits(IsSimple) {} /// Generate a title for the graph in DOT format std::string getGraphName(const DataDependenceGraph *G) { assert(G && "expected a valid pointer to the graph."); return "DDG for '" + std::string(G->getName()) + "'"; } /// Print a DDG node either in concise form (-ddg-dot-only) or /// verbose mode (-ddg-dot). std::string getNodeLabel(const DDGNode *Node, const DataDependenceGraph *Graph); /// Print attributes of an edge in the DDG graph. If the edge /// is a MemoryDependence edge, then detailed dependence info /// available from DependenceAnalysis is displayed. std::string getEdgeAttributes(const DDGNode *Node, GraphTraits::ChildIteratorType I, const DataDependenceGraph *G); /// Do not print nodes that are part of a pi-block separately. They /// will be printed when their containing pi-block is being printed. bool isNodeHidden(const DDGNode *Node, const DataDependenceGraph *G); private: /// Print a DDG node in concise form. static std::string getSimpleNodeLabel(const DDGNode *Node, const DataDependenceGraph *G); /// Print a DDG node with more information including containing instructions /// and detailed information about the dependence edges. static std::string getVerboseNodeLabel(const DDGNode *Node, const DataDependenceGraph *G); /// Print a DDG edge in concise form. static std::string getSimpleEdgeAttributes(const DDGNode *Src, const DDGEdge *Edge, const DataDependenceGraph *G); /// Print a DDG edge with more information including detailed information /// about the dependence edges. static std::string getVerboseEdgeAttributes(const DDGNode *Src, const DDGEdge *Edge, const DataDependenceGraph *G); }; using DDGDotGraphTraits = DOTGraphTraits; } // namespace llvm #endif // LLVM_ANALYSIS_DDGPRINTER_H