//===- llvm/Analysis/DDG.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 Data-Dependence Graph (DDG). // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_DDG_H #define LLVM_ANALYSIS_DDG_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DirectedGraph.h" #include "llvm/Analysis/DependenceAnalysis.h" #include "llvm/Analysis/DependenceGraphBuilder.h" #include "llvm/Analysis/LoopAnalysisManager.h" namespace llvm { class Function; class Loop; class LoopInfo; class DDGNode; class DDGEdge; DDGNodeBase; DDGEdgeBase; DDGBase; class LPMUpdater; /// Data Dependence Graph Node /// The graph can represent the following types of nodes: /// 1. Single instruction node containing just one instruction. /// 2. Multiple instruction node where two or more instructions from /// the same basic block are merged into one node. /// 3. Pi-block node which is a group of other DDG nodes that are part of a /// strongly-connected component of the graph. /// A pi-block node contains more than one single or multiple instruction /// nodes. The root node cannot be part of a pi-block. /// 4. Root node is a special node that connects to all components such that /// there is always a path from it to any node in the graph. class DDGNode : public DDGNodeBase { … }; /// Subclass of DDGNode representing the root node of the graph. /// There should only be one such node in a given graph. class RootDDGNode : public DDGNode { … }; /// Subclass of DDGNode representing single or multi-instruction nodes. class SimpleDDGNode : public DDGNode { … }; /// Subclass of DDGNode representing a pi-block. A pi-block represents a group /// of DDG nodes that are part of a strongly-connected component of the graph. /// Replacing all the SCCs with pi-blocks results in an acyclic representation /// of the DDG. For example if we have: /// {a -> b}, {b -> c, d}, {c -> a} /// the cycle a -> b -> c -> a is abstracted into a pi-block "p" as follows: /// {p -> d} with "p" containing: {a -> b}, {b -> c}, {c -> a} class PiBlockDDGNode : public DDGNode { … }; /// Data Dependency Graph Edge. /// An edge in the DDG can represent a def-use relationship or /// a memory dependence based on the result of DependenceAnalysis. /// A rooted edge connects the root node to one of the components /// of the graph. class DDGEdge : public DDGEdgeBase { … }; /// Encapsulate some common data and functionality needed for different /// variations of data dependence graphs. template <typename NodeType> class DependenceGraphInfo { … }; DDGInfo; /// Data Dependency Graph class DataDependenceGraph : public DDGBase, public DDGInfo { … }; /// Concrete implementation of a pure data dependence graph builder. This class /// provides custom implementation for the pure-virtual functions used in the /// generic dependence graph build algorithm. /// /// For information about time complexity of the build algorithm see the /// comments near the declaration of AbstractDependenceGraphBuilder. class DDGBuilder : public AbstractDependenceGraphBuilder<DataDependenceGraph> { … }; raw_ostream &operator<<(raw_ostream &OS, const DDGNode &N); raw_ostream &operator<<(raw_ostream &OS, const DDGNode::NodeKind K); raw_ostream &operator<<(raw_ostream &OS, const DDGEdge &E); raw_ostream &operator<<(raw_ostream &OS, const DDGEdge::EdgeKind K); raw_ostream &operator<<(raw_ostream &OS, const DataDependenceGraph &G); //===--------------------------------------------------------------------===// // DDG Analysis Passes //===--------------------------------------------------------------------===// /// Analysis pass that builds the DDG for a loop. class DDGAnalysis : public AnalysisInfoMixin<DDGAnalysis> { … }; /// Textual printer pass for the DDG of a loop. class DDGAnalysisPrinterPass : public PassInfoMixin<DDGAnalysisPrinterPass> { … }; //===--------------------------------------------------------------------===// // DependenceGraphInfo Implementation //===--------------------------------------------------------------------===// template <typename NodeType> bool DependenceGraphInfo<NodeType>::getDependencies( const NodeType &Src, const NodeType &Dst, DependenceList &Deps) const { … } template <typename NodeType> std::string DependenceGraphInfo<NodeType>::getDependenceString(const NodeType &Src, const NodeType &Dst) const { … } //===--------------------------------------------------------------------===// // GraphTraits specializations for the DDG //===--------------------------------------------------------------------===// /// non-const versions of the grapth trait specializations for DDG template <> struct GraphTraits<DDGNode *> { … }; template <> struct GraphTraits<DataDependenceGraph *> : public GraphTraits<DDGNode *> { … }; /// const versions of the grapth trait specializations for DDG template <> struct GraphTraits<const DDGNode *> { … }; template <> struct GraphTraits<const DataDependenceGraph *> : public GraphTraits<const DDGNode *> { … }; } // namespace llvm #endif // LLVM_ANALYSIS_DDG_H