1 //===- llvm/Analysis/DDGPrinter.h -------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 //===----------------------------------------------------------------------===// 10 // 11 // This file defines the DOT printer for the Data-Dependence Graph (DDG). 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_ANALYSIS_DDGPRINTER_H 16 #define LLVM_ANALYSIS_DDGPRINTER_H 17 18 #include "llvm/Analysis/DDG.h" 19 #include "llvm/Support/DOTGraphTraits.h" 20 21 namespace llvm { 22 class LPMUpdater; 23 class Loop; 24 25 //===--------------------------------------------------------------------===// 26 // Implementation of DDG DOT Printer for a loop. 27 //===--------------------------------------------------------------------===// 28 class DDGDotPrinterPass : public PassInfoMixin<DDGDotPrinterPass> { 29 public: 30 PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, 31 LoopStandardAnalysisResults &AR, LPMUpdater &U); 32 }; 33 34 //===--------------------------------------------------------------------===// 35 // Specialization of DOTGraphTraits. 36 //===--------------------------------------------------------------------===// 37 template <> 38 struct DOTGraphTraits<const DataDependenceGraph *> 39 : public DefaultDOTGraphTraits { 40 41 DOTGraphTraits(bool IsSimple = false) : DefaultDOTGraphTraits(IsSimple) {} 42 43 /// Generate a title for the graph in DOT format 44 std::string getGraphName(const DataDependenceGraph *G) { 45 assert(G && "expected a valid pointer to the graph."); 46 return "DDG for '" + std::string(G->getName()) + "'"; 47 } 48 49 /// Print a DDG node either in concise form (-ddg-dot-only) or 50 /// verbose mode (-ddg-dot). 51 std::string getNodeLabel(const DDGNode *Node, 52 const DataDependenceGraph *Graph); 53 54 /// Print attributes of an edge in the DDG graph. If the edge 55 /// is a MemoryDependence edge, then detailed dependence info 56 /// available from DependenceAnalysis is displayed. 57 std::string 58 getEdgeAttributes(const DDGNode *Node, 59 GraphTraits<const DDGNode *>::ChildIteratorType I, 60 const DataDependenceGraph *G); 61 62 /// Do not print nodes that are part of a pi-block separately. They 63 /// will be printed when their containing pi-block is being printed. 64 bool isNodeHidden(const DDGNode *Node, const DataDependenceGraph *G); 65 66 private: 67 /// Print a DDG node in concise form. 68 static std::string getSimpleNodeLabel(const DDGNode *Node, 69 const DataDependenceGraph *G); 70 71 /// Print a DDG node with more information including containing instructions 72 /// and detailed information about the dependence edges. 73 static std::string getVerboseNodeLabel(const DDGNode *Node, 74 const DataDependenceGraph *G); 75 76 /// Print a DDG edge in concise form. 77 static std::string getSimpleEdgeAttributes(const DDGNode *Src, 78 const DDGEdge *Edge, 79 const DataDependenceGraph *G); 80 81 /// Print a DDG edge with more information including detailed information 82 /// about the dependence edges. 83 static std::string getVerboseEdgeAttributes(const DDGNode *Src, 84 const DDGEdge *Edge, 85 const DataDependenceGraph *G); 86 }; 87 88 using DDGDotGraphTraits = DOTGraphTraits<const DataDependenceGraph *>; 89 90 } // namespace llvm 91 92 #endif // LLVM_ANALYSIS_DDGPRINTER_H 93