Home | History | Annotate | Line # | Download | only in Analysis
      1 //===- RegionInfo.h - SESE region analysis ----------------------*- 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 // Calculate a program structure tree built out of single entry single exit
     10 // regions.
     11 // The basic ideas are taken from "The Program Structure Tree - Richard Johnson,
     12 // David Pearson, Keshav Pingali - 1994", however enriched with ideas from "The
     13 // Refined Process Structure Tree - Jussi Vanhatalo, Hagen Voelyer, Jana
     14 // Koehler - 2009".
     15 // The algorithm to calculate these data structures however is completely
     16 // different, as it takes advantage of existing information already available
     17 // in (Post)dominace tree and dominance frontier passes. This leads to a simpler
     18 // and in practice hopefully better performing algorithm. The runtime of the
     19 // algorithms described in the papers above are both linear in graph size,
     20 // O(V+E), whereas this algorithm is not, as the dominance frontier information
     21 // itself is not, but in practice runtime seems to be in the order of magnitude
     22 // of dominance tree calculation.
     23 //
     24 // WARNING: LLVM is generally very concerned about compile time such that
     25 //          the use of additional analysis passes in the default
     26 //          optimization sequence is avoided as much as possible.
     27 //          Specifically, if you do not need the RegionInfo, but dominance
     28 //          information could be sufficient please base your work only on
     29 //          the dominator tree. Most passes maintain it, such that using
     30 //          it has often near zero cost. In contrast RegionInfo is by
     31 //          default not available, is not maintained by existing
     32 //          transformations and there is no intention to do so.
     33 //
     34 //===----------------------------------------------------------------------===//
     35 
     36 #ifndef LLVM_ANALYSIS_REGIONINFO_H
     37 #define LLVM_ANALYSIS_REGIONINFO_H
     38 
     39 #include "llvm/ADT/DenseMap.h"
     40 #include "llvm/ADT/DepthFirstIterator.h"
     41 #include "llvm/ADT/GraphTraits.h"
     42 #include "llvm/ADT/PointerIntPair.h"
     43 #include "llvm/ADT/iterator_range.h"
     44 #include "llvm/Config/llvm-config.h"
     45 #include "llvm/IR/BasicBlock.h"
     46 #include "llvm/IR/Dominators.h"
     47 #include "llvm/IR/PassManager.h"
     48 #include "llvm/Pass.h"
     49 #include "llvm/Support/raw_ostream.h"
     50 #include <algorithm>
     51 #include <cassert>
     52 #include <map>
     53 #include <memory>
     54 #include <set>
     55 #include <string>
     56 #include <type_traits>
     57 #include <vector>
     58 
     59 namespace llvm {
     60 
     61 class DominanceFrontier;
     62 class Loop;
     63 class LoopInfo;
     64 class PostDominatorTree;
     65 class Region;
     66 template <class RegionTr> class RegionBase;
     67 class RegionInfo;
     68 template <class RegionTr> class RegionInfoBase;
     69 class RegionNode;
     70 
     71 // Class to be specialized for different users of RegionInfo
     72 // (i.e. BasicBlocks or MachineBasicBlocks). This is only to avoid needing to
     73 // pass around an unreasonable number of template parameters.
     74 template <class FuncT_>
     75 struct RegionTraits {
     76   // FuncT
     77   // BlockT
     78   // RegionT
     79   // RegionNodeT
     80   // RegionInfoT
     81   using BrokenT = typename FuncT_::UnknownRegionTypeError;
     82 };
     83 
     84 template <>
     85 struct RegionTraits<Function> {
     86   using FuncT = Function;
     87   using BlockT = BasicBlock;
     88   using RegionT = Region;
     89   using RegionNodeT = RegionNode;
     90   using RegionInfoT = RegionInfo;
     91   using DomTreeT = DominatorTree;
     92   using DomTreeNodeT = DomTreeNode;
     93   using DomFrontierT = DominanceFrontier;
     94   using PostDomTreeT = PostDominatorTree;
     95   using InstT = Instruction;
     96   using LoopT = Loop;
     97   using LoopInfoT = LoopInfo;
     98 
     99   static unsigned getNumSuccessors(BasicBlock *BB) {
    100     return BB->getTerminator()->getNumSuccessors();
    101   }
    102 };
    103 
    104 /// Marker class to iterate over the elements of a Region in flat mode.
    105 ///
    106 /// The class is used to either iterate in Flat mode or by not using it to not
    107 /// iterate in Flat mode.  During a Flat mode iteration all Regions are entered
    108 /// and the iteration returns every BasicBlock.  If the Flat mode is not
    109 /// selected for SubRegions just one RegionNode containing the subregion is
    110 /// returned.
    111 template <class GraphType>
    112 class FlatIt {};
    113 
    114 /// A RegionNode represents a subregion or a BasicBlock that is part of a
    115 /// Region.
    116 template <class Tr>
    117 class RegionNodeBase {
    118   friend class RegionBase<Tr>;
    119 
    120 public:
    121   using BlockT = typename Tr::BlockT;
    122   using RegionT = typename Tr::RegionT;
    123 
    124 private:
    125   /// This is the entry basic block that starts this region node.  If this is a
    126   /// BasicBlock RegionNode, then entry is just the basic block, that this
    127   /// RegionNode represents.  Otherwise it is the entry of this (Sub)RegionNode.
    128   ///
    129   /// In the BBtoRegionNode map of the parent of this node, BB will always map
    130   /// to this node no matter which kind of node this one is.
    131   ///
    132   /// The node can hold either a Region or a BasicBlock.
    133   /// Use one bit to save, if this RegionNode is a subregion or BasicBlock
    134   /// RegionNode.
    135   PointerIntPair<BlockT *, 1, bool> entry;
    136 
    137   /// The parent Region of this RegionNode.
    138   /// @see getParent()
    139   RegionT *parent;
    140 
    141 protected:
    142   /// Create a RegionNode.
    143   ///
    144   /// @param Parent      The parent of this RegionNode.
    145   /// @param Entry       The entry BasicBlock of the RegionNode.  If this
    146   ///                    RegionNode represents a BasicBlock, this is the
    147   ///                    BasicBlock itself.  If it represents a subregion, this
    148   ///                    is the entry BasicBlock of the subregion.
    149   /// @param isSubRegion If this RegionNode represents a SubRegion.
    150   inline RegionNodeBase(RegionT *Parent, BlockT *Entry,
    151                         bool isSubRegion = false)
    152       : entry(Entry, isSubRegion), parent(Parent) {}
    153 
    154 public:
    155   RegionNodeBase(const RegionNodeBase &) = delete;
    156   RegionNodeBase &operator=(const RegionNodeBase &) = delete;
    157 
    158   /// Get the parent Region of this RegionNode.
    159   ///
    160   /// The parent Region is the Region this RegionNode belongs to. If for
    161   /// example a BasicBlock is element of two Regions, there exist two
    162   /// RegionNodes for this BasicBlock. Each with the getParent() function
    163   /// pointing to the Region this RegionNode belongs to.
    164   ///
    165   /// @return Get the parent Region of this RegionNode.
    166   inline RegionT *getParent() const { return parent; }
    167 
    168   /// Get the entry BasicBlock of this RegionNode.
    169   ///
    170   /// If this RegionNode represents a BasicBlock this is just the BasicBlock
    171   /// itself, otherwise we return the entry BasicBlock of the Subregion
    172   ///
    173   /// @return The entry BasicBlock of this RegionNode.
    174   inline BlockT *getEntry() const { return entry.getPointer(); }
    175 
    176   /// Get the content of this RegionNode.
    177   ///
    178   /// This can be either a BasicBlock or a subregion. Before calling getNodeAs()
    179   /// check the type of the content with the isSubRegion() function call.
    180   ///
    181   /// @return The content of this RegionNode.
    182   template <class T> inline T *getNodeAs() const;
    183 
    184   /// Is this RegionNode a subregion?
    185   ///
    186   /// @return True if it contains a subregion. False if it contains a
    187   ///         BasicBlock.
    188   inline bool isSubRegion() const { return entry.getInt(); }
    189 };
    190 
    191 //===----------------------------------------------------------------------===//
    192 /// A single entry single exit Region.
    193 ///
    194 /// A Region is a connected subgraph of a control flow graph that has exactly
    195 /// two connections to the remaining graph. It can be used to analyze or
    196 /// optimize parts of the control flow graph.
    197 ///
    198 /// A <em> simple Region </em> is connected to the remaining graph by just two
    199 /// edges. One edge entering the Region and another one leaving the Region.
    200 ///
    201 /// An <em> extended Region </em> (or just Region) is a subgraph that can be
    202 /// transform into a simple Region. The transformation is done by adding
    203 /// BasicBlocks that merge several entry or exit edges so that after the merge
    204 /// just one entry and one exit edge exists.
    205 ///
    206 /// The \e Entry of a Region is the first BasicBlock that is passed after
    207 /// entering the Region. It is an element of the Region. The entry BasicBlock
    208 /// dominates all BasicBlocks in the Region.
    209 ///
    210 /// The \e Exit of a Region is the first BasicBlock that is passed after
    211 /// leaving the Region. It is not an element of the Region. The exit BasicBlock,
    212 /// postdominates all BasicBlocks in the Region.
    213 ///
    214 /// A <em> canonical Region </em> cannot be constructed by combining smaller
    215 /// Regions.
    216 ///
    217 /// Region A is the \e parent of Region B, if B is completely contained in A.
    218 ///
    219 /// Two canonical Regions either do not intersect at all or one is
    220 /// the parent of the other.
    221 ///
    222 /// The <em> Program Structure Tree</em> is a graph (V, E) where V is the set of
    223 /// Regions in the control flow graph and E is the \e parent relation of these
    224 /// Regions.
    225 ///
    226 /// Example:
    227 ///
    228 /// \verbatim
    229 /// A simple control flow graph, that contains two regions.
    230 ///
    231 ///        1
    232 ///       / |
    233 ///      2   |
    234 ///     / \   3
    235 ///    4   5  |
    236 ///    |   |  |
    237 ///    6   7  8
    238 ///     \  | /
    239 ///      \ |/       Region A: 1 -> 9 {1,2,3,4,5,6,7,8}
    240 ///        9        Region B: 2 -> 9 {2,4,5,6,7}
    241 /// \endverbatim
    242 ///
    243 /// You can obtain more examples by either calling
    244 ///
    245 /// <tt> "opt -regions -analyze anyprogram.ll" </tt>
    246 /// or
    247 /// <tt> "opt -view-regions-only anyprogram.ll" </tt>
    248 ///
    249 /// on any LLVM file you are interested in.
    250 ///
    251 /// The first call returns a textual representation of the program structure
    252 /// tree, the second one creates a graphical representation using graphviz.
    253 template <class Tr>
    254 class RegionBase : public RegionNodeBase<Tr> {
    255   friend class RegionInfoBase<Tr>;
    256 
    257   using FuncT = typename Tr::FuncT;
    258   using BlockT = typename Tr::BlockT;
    259   using RegionInfoT = typename Tr::RegionInfoT;
    260   using RegionT = typename Tr::RegionT;
    261   using RegionNodeT = typename Tr::RegionNodeT;
    262   using DomTreeT = typename Tr::DomTreeT;
    263   using LoopT = typename Tr::LoopT;
    264   using LoopInfoT = typename Tr::LoopInfoT;
    265   using InstT = typename Tr::InstT;
    266 
    267   using BlockTraits = GraphTraits<BlockT *>;
    268   using InvBlockTraits = GraphTraits<Inverse<BlockT *>>;
    269   using SuccIterTy = typename BlockTraits::ChildIteratorType;
    270   using PredIterTy = typename InvBlockTraits::ChildIteratorType;
    271 
    272   // Information necessary to manage this Region.
    273   RegionInfoT *RI;
    274   DomTreeT *DT;
    275 
    276   // The exit BasicBlock of this region.
    277   // (The entry BasicBlock is part of RegionNode)
    278   BlockT *exit;
    279 
    280   using RegionSet = std::vector<std::unique_ptr<RegionT>>;
    281 
    282   // The subregions of this region.
    283   RegionSet children;
    284 
    285   using BBNodeMapT = std::map<BlockT *, std::unique_ptr<RegionNodeT>>;
    286 
    287   // Save the BasicBlock RegionNodes that are element of this Region.
    288   mutable BBNodeMapT BBNodeMap;
    289 
    290   /// Check if a BB is in this Region. This check also works
    291   /// if the region is incorrectly built. (EXPENSIVE!)
    292   void verifyBBInRegion(BlockT *BB) const;
    293 
    294   /// Walk over all the BBs of the region starting from BB and
    295   /// verify that all reachable basic blocks are elements of the region.
    296   /// (EXPENSIVE!)
    297   void verifyWalk(BlockT *BB, std::set<BlockT *> *visitedBB) const;
    298 
    299   /// Verify if the region and its children are valid regions (EXPENSIVE!)
    300   void verifyRegionNest() const;
    301 
    302 public:
    303   /// Create a new region.
    304   ///
    305   /// @param Entry  The entry basic block of the region.
    306   /// @param Exit   The exit basic block of the region.
    307   /// @param RI     The region info object that is managing this region.
    308   /// @param DT     The dominator tree of the current function.
    309   /// @param Parent The surrounding region or NULL if this is a top level
    310   ///               region.
    311   RegionBase(BlockT *Entry, BlockT *Exit, RegionInfoT *RI, DomTreeT *DT,
    312              RegionT *Parent = nullptr);
    313 
    314   RegionBase(const RegionBase &) = delete;
    315   RegionBase &operator=(const RegionBase &) = delete;
    316 
    317   /// Delete the Region and all its subregions.
    318   ~RegionBase();
    319 
    320   /// Get the entry BasicBlock of the Region.
    321   /// @return The entry BasicBlock of the region.
    322   BlockT *getEntry() const {
    323     return RegionNodeBase<Tr>::getEntry();
    324   }
    325 
    326   /// Replace the entry basic block of the region with the new basic
    327   ///        block.
    328   ///
    329   /// @param BB  The new entry basic block of the region.
    330   void replaceEntry(BlockT *BB);
    331 
    332   /// Replace the exit basic block of the region with the new basic
    333   ///        block.
    334   ///
    335   /// @param BB  The new exit basic block of the region.
    336   void replaceExit(BlockT *BB);
    337 
    338   /// Recursively replace the entry basic block of the region.
    339   ///
    340   /// This function replaces the entry basic block with a new basic block. It
    341   /// also updates all child regions that have the same entry basic block as
    342   /// this region.
    343   ///
    344   /// @param NewEntry The new entry basic block.
    345   void replaceEntryRecursive(BlockT *NewEntry);
    346 
    347   /// Recursively replace the exit basic block of the region.
    348   ///
    349   /// This function replaces the exit basic block with a new basic block. It
    350   /// also updates all child regions that have the same exit basic block as
    351   /// this region.
    352   ///
    353   /// @param NewExit The new exit basic block.
    354   void replaceExitRecursive(BlockT *NewExit);
    355 
    356   /// Get the exit BasicBlock of the Region.
    357   /// @return The exit BasicBlock of the Region, NULL if this is the TopLevel
    358   ///         Region.
    359   BlockT *getExit() const { return exit; }
    360 
    361   /// Get the parent of the Region.
    362   /// @return The parent of the Region or NULL if this is a top level
    363   ///         Region.
    364   RegionT *getParent() const {
    365     return RegionNodeBase<Tr>::getParent();
    366   }
    367 
    368   /// Get the RegionNode representing the current Region.
    369   /// @return The RegionNode representing the current Region.
    370   RegionNodeT *getNode() const {
    371     return const_cast<RegionNodeT *>(
    372         reinterpret_cast<const RegionNodeT *>(this));
    373   }
    374 
    375   /// Get the nesting level of this Region.
    376   ///
    377   /// An toplevel Region has depth 0.
    378   ///
    379   /// @return The depth of the region.
    380   unsigned getDepth() const;
    381 
    382   /// Check if a Region is the TopLevel region.
    383   ///
    384   /// The toplevel region represents the whole function.
    385   bool isTopLevelRegion() const { return exit == nullptr; }
    386 
    387   /// Return a new (non-canonical) region, that is obtained by joining
    388   ///        this region with its predecessors.
    389   ///
    390   /// @return A region also starting at getEntry(), but reaching to the next
    391   ///         basic block that forms with getEntry() a (non-canonical) region.
    392   ///         NULL if such a basic block does not exist.
    393   RegionT *getExpandedRegion() const;
    394 
    395   /// Return the first block of this region's single entry edge,
    396   ///        if existing.
    397   ///
    398   /// @return The BasicBlock starting this region's single entry edge,
    399   ///         else NULL.
    400   BlockT *getEnteringBlock() const;
    401 
    402   /// Return the first block of this region's single exit edge,
    403   ///        if existing.
    404   ///
    405   /// @return The BasicBlock starting this region's single exit edge,
    406   ///         else NULL.
    407   BlockT *getExitingBlock() const;
    408 
    409   /// Collect all blocks of this region's single exit edge, if existing.
    410   ///
    411   /// @return True if this region contains all the predecessors of the exit.
    412   bool getExitingBlocks(SmallVectorImpl<BlockT *> &Exitings) const;
    413 
    414   /// Is this a simple region?
    415   ///
    416   /// A region is simple if it has exactly one exit and one entry edge.
    417   ///
    418   /// @return True if the Region is simple.
    419   bool isSimple() const;
    420 
    421   /// Returns the name of the Region.
    422   /// @return The Name of the Region.
    423   std::string getNameStr() const;
    424 
    425   /// Return the RegionInfo object, that belongs to this Region.
    426   RegionInfoT *getRegionInfo() const { return RI; }
    427 
    428   /// PrintStyle - Print region in difference ways.
    429   enum PrintStyle { PrintNone, PrintBB, PrintRN };
    430 
    431   /// Print the region.
    432   ///
    433   /// @param OS The output stream the Region is printed to.
    434   /// @param printTree Print also the tree of subregions.
    435   /// @param level The indentation level used for printing.
    436   void print(raw_ostream &OS, bool printTree = true, unsigned level = 0,
    437              PrintStyle Style = PrintNone) const;
    438 
    439 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
    440   /// Print the region to stderr.
    441   void dump() const;
    442 #endif
    443 
    444   /// Check if the region contains a BasicBlock.
    445   ///
    446   /// @param BB The BasicBlock that might be contained in this Region.
    447   /// @return True if the block is contained in the region otherwise false.
    448   bool contains(const BlockT *BB) const;
    449 
    450   /// Check if the region contains another region.
    451   ///
    452   /// @param SubRegion The region that might be contained in this Region.
    453   /// @return True if SubRegion is contained in the region otherwise false.
    454   bool contains(const RegionT *SubRegion) const {
    455     // Toplevel Region.
    456     if (!getExit())
    457       return true;
    458 
    459     return contains(SubRegion->getEntry()) &&
    460            (contains(SubRegion->getExit()) ||
    461             SubRegion->getExit() == getExit());
    462   }
    463 
    464   /// Check if the region contains an Instruction.
    465   ///
    466   /// @param Inst The Instruction that might be contained in this region.
    467   /// @return True if the Instruction is contained in the region otherwise
    468   /// false.
    469   bool contains(const InstT *Inst) const { return contains(Inst->getParent()); }
    470 
    471   /// Check if the region contains a loop.
    472   ///
    473   /// @param L The loop that might be contained in this region.
    474   /// @return True if the loop is contained in the region otherwise false.
    475   ///         In case a NULL pointer is passed to this function the result
    476   ///         is false, except for the region that describes the whole function.
    477   ///         In that case true is returned.
    478   bool contains(const LoopT *L) const;
    479 
    480   /// Get the outermost loop in the region that contains a loop.
    481   ///
    482   /// Find for a Loop L the outermost loop OuterL that is a parent loop of L
    483   /// and is itself contained in the region.
    484   ///
    485   /// @param L The loop the lookup is started.
    486   /// @return The outermost loop in the region, NULL if such a loop does not
    487   ///         exist or if the region describes the whole function.
    488   LoopT *outermostLoopInRegion(LoopT *L) const;
    489 
    490   /// Get the outermost loop in the region that contains a basic block.
    491   ///
    492   /// Find for a basic block BB the outermost loop L that contains BB and is
    493   /// itself contained in the region.
    494   ///
    495   /// @param LI A pointer to a LoopInfo analysis.
    496   /// @param BB The basic block surrounded by the loop.
    497   /// @return The outermost loop in the region, NULL if such a loop does not
    498   ///         exist or if the region describes the whole function.
    499   LoopT *outermostLoopInRegion(LoopInfoT *LI, BlockT *BB) const;
    500 
    501   /// Get the subregion that starts at a BasicBlock
    502   ///
    503   /// @param BB The BasicBlock the subregion should start.
    504   /// @return The Subregion if available, otherwise NULL.
    505   RegionT *getSubRegionNode(BlockT *BB) const;
    506 
    507   /// Get the RegionNode for a BasicBlock
    508   ///
    509   /// @param BB The BasicBlock at which the RegionNode should start.
    510   /// @return If available, the RegionNode that represents the subregion
    511   ///         starting at BB. If no subregion starts at BB, the RegionNode
    512   ///         representing BB.
    513   RegionNodeT *getNode(BlockT *BB) const;
    514 
    515   /// Get the BasicBlock RegionNode for a BasicBlock
    516   ///
    517   /// @param BB The BasicBlock for which the RegionNode is requested.
    518   /// @return The RegionNode representing the BB.
    519   RegionNodeT *getBBNode(BlockT *BB) const;
    520 
    521   /// Add a new subregion to this Region.
    522   ///
    523   /// @param SubRegion The new subregion that will be added.
    524   /// @param moveChildren Move the children of this region, that are also
    525   ///                     contained in SubRegion into SubRegion.
    526   void addSubRegion(RegionT *SubRegion, bool moveChildren = false);
    527 
    528   /// Remove a subregion from this Region.
    529   ///
    530   /// The subregion is not deleted, as it will probably be inserted into another
    531   /// region.
    532   /// @param SubRegion The SubRegion that will be removed.
    533   RegionT *removeSubRegion(RegionT *SubRegion);
    534 
    535   /// Move all direct child nodes of this Region to another Region.
    536   ///
    537   /// @param To The Region the child nodes will be transferred to.
    538   void transferChildrenTo(RegionT *To);
    539 
    540   /// Verify if the region is a correct region.
    541   ///
    542   /// Check if this is a correctly build Region. This is an expensive check, as
    543   /// the complete CFG of the Region will be walked.
    544   void verifyRegion() const;
    545 
    546   /// Clear the cache for BB RegionNodes.
    547   ///
    548   /// After calling this function the BasicBlock RegionNodes will be stored at
    549   /// different memory locations. RegionNodes obtained before this function is
    550   /// called are therefore not comparable to RegionNodes abtained afterwords.
    551   void clearNodeCache();
    552 
    553   /// @name Subregion Iterators
    554   ///
    555   /// These iterators iterator over all subregions of this Region.
    556   //@{
    557   using iterator = typename RegionSet::iterator;
    558   using const_iterator = typename RegionSet::const_iterator;
    559 
    560   iterator begin() { return children.begin(); }
    561   iterator end() { return children.end(); }
    562 
    563   const_iterator begin() const { return children.begin(); }
    564   const_iterator end() const { return children.end(); }
    565   //@}
    566 
    567   /// @name BasicBlock Iterators
    568   ///
    569   /// These iterators iterate over all BasicBlocks that are contained in this
    570   /// Region. The iterator also iterates over BasicBlocks that are elements of
    571   /// a subregion of this Region. It is therefore called a flat iterator.
    572   //@{
    573   template <bool IsConst>
    574   class block_iterator_wrapper
    575       : public df_iterator<
    576             std::conditional_t<IsConst, const BlockT, BlockT> *> {
    577     using super =
    578         df_iterator<std::conditional_t<IsConst, const BlockT, BlockT> *>;
    579 
    580   public:
    581     using Self = block_iterator_wrapper<IsConst>;
    582     using value_type = typename super::value_type;
    583 
    584     // Construct the begin iterator.
    585     block_iterator_wrapper(value_type Entry, value_type Exit)
    586         : super(df_begin(Entry)) {
    587       // Mark the exit of the region as visited, so that the children of the
    588       // exit and the exit itself, i.e. the block outside the region will never
    589       // be visited.
    590       super::Visited.insert(Exit);
    591     }
    592 
    593     // Construct the end iterator.
    594     block_iterator_wrapper() : super(df_end<value_type>((BlockT *)nullptr)) {}
    595 
    596     /*implicit*/ block_iterator_wrapper(super I) : super(I) {}
    597 
    598     // FIXME: Even a const_iterator returns a non-const BasicBlock pointer.
    599     //        This was introduced for backwards compatibility, but should
    600     //        be removed as soon as all users are fixed.
    601     BlockT *operator*() const {
    602       return const_cast<BlockT *>(super::operator*());
    603     }
    604   };
    605 
    606   using block_iterator = block_iterator_wrapper<false>;
    607   using const_block_iterator = block_iterator_wrapper<true>;
    608 
    609   block_iterator block_begin() { return block_iterator(getEntry(), getExit()); }
    610 
    611   block_iterator block_end() { return block_iterator(); }
    612 
    613   const_block_iterator block_begin() const {
    614     return const_block_iterator(getEntry(), getExit());
    615   }
    616   const_block_iterator block_end() const { return const_block_iterator(); }
    617 
    618   using block_range = iterator_range<block_iterator>;
    619   using const_block_range = iterator_range<const_block_iterator>;
    620 
    621   /// Returns a range view of the basic blocks in the region.
    622   inline block_range blocks() {
    623     return block_range(block_begin(), block_end());
    624   }
    625 
    626   /// Returns a range view of the basic blocks in the region.
    627   ///
    628   /// This is the 'const' version of the range view.
    629   inline const_block_range blocks() const {
    630     return const_block_range(block_begin(), block_end());
    631   }
    632   //@}
    633 
    634   /// @name Element Iterators
    635   ///
    636   /// These iterators iterate over all BasicBlock and subregion RegionNodes that
    637   /// are direct children of this Region. It does not iterate over any
    638   /// RegionNodes that are also element of a subregion of this Region.
    639   //@{
    640   using element_iterator =
    641       df_iterator<RegionNodeT *, df_iterator_default_set<RegionNodeT *>, false,
    642                   GraphTraits<RegionNodeT *>>;
    643 
    644   using const_element_iterator =
    645       df_iterator<const RegionNodeT *,
    646                   df_iterator_default_set<const RegionNodeT *>, false,
    647                   GraphTraits<const RegionNodeT *>>;
    648 
    649   element_iterator element_begin();
    650   element_iterator element_end();
    651   iterator_range<element_iterator> elements() {
    652     return make_range(element_begin(), element_end());
    653   }
    654 
    655   const_element_iterator element_begin() const;
    656   const_element_iterator element_end() const;
    657   iterator_range<const_element_iterator> elements() const {
    658     return make_range(element_begin(), element_end());
    659   }
    660   //@}
    661 };
    662 
    663 /// Print a RegionNode.
    664 template <class Tr>
    665 inline raw_ostream &operator<<(raw_ostream &OS, const RegionNodeBase<Tr> &Node);
    666 
    667 //===----------------------------------------------------------------------===//
    668 /// Analysis that detects all canonical Regions.
    669 ///
    670 /// The RegionInfo pass detects all canonical regions in a function. The Regions
    671 /// are connected using the parent relation. This builds a Program Structure
    672 /// Tree.
    673 template <class Tr>
    674 class RegionInfoBase {
    675   friend class RegionInfo;
    676   friend class MachineRegionInfo;
    677 
    678   using BlockT = typename Tr::BlockT;
    679   using FuncT = typename Tr::FuncT;
    680   using RegionT = typename Tr::RegionT;
    681   using RegionInfoT = typename Tr::RegionInfoT;
    682   using DomTreeT = typename Tr::DomTreeT;
    683   using DomTreeNodeT = typename Tr::DomTreeNodeT;
    684   using PostDomTreeT = typename Tr::PostDomTreeT;
    685   using DomFrontierT = typename Tr::DomFrontierT;
    686   using BlockTraits = GraphTraits<BlockT *>;
    687   using InvBlockTraits = GraphTraits<Inverse<BlockT *>>;
    688   using SuccIterTy = typename BlockTraits::ChildIteratorType;
    689   using PredIterTy = typename InvBlockTraits::ChildIteratorType;
    690 
    691   using BBtoBBMap = DenseMap<BlockT *, BlockT *>;
    692   using BBtoRegionMap = DenseMap<BlockT *, RegionT *>;
    693 
    694   RegionInfoBase();
    695 
    696   RegionInfoBase(RegionInfoBase &&Arg)
    697     : DT(std::move(Arg.DT)), PDT(std::move(Arg.PDT)), DF(std::move(Arg.DF)),
    698       TopLevelRegion(std::move(Arg.TopLevelRegion)),
    699       BBtoRegion(std::move(Arg.BBtoRegion)) {
    700     Arg.wipe();
    701   }
    702 
    703   RegionInfoBase &operator=(RegionInfoBase &&RHS) {
    704     DT = std::move(RHS.DT);
    705     PDT = std::move(RHS.PDT);
    706     DF = std::move(RHS.DF);
    707     TopLevelRegion = std::move(RHS.TopLevelRegion);
    708     BBtoRegion = std::move(RHS.BBtoRegion);
    709     RHS.wipe();
    710     return *this;
    711   }
    712 
    713   virtual ~RegionInfoBase();
    714 
    715   DomTreeT *DT;
    716   PostDomTreeT *PDT;
    717   DomFrontierT *DF;
    718 
    719   /// The top level region.
    720   RegionT *TopLevelRegion = nullptr;
    721 
    722   /// Map every BB to the smallest region, that contains BB.
    723   BBtoRegionMap BBtoRegion;
    724 
    725 protected:
    726   /// Update refences to a RegionInfoT held by the RegionT managed here
    727   ///
    728   /// This is a post-move helper. Regions hold references to the owning
    729   /// RegionInfo object. After a move these need to be fixed.
    730   template<typename TheRegionT>
    731   void updateRegionTree(RegionInfoT &RI, TheRegionT *R) {
    732     if (!R)
    733       return;
    734     R->RI = &RI;
    735     for (auto &SubR : *R)
    736       updateRegionTree(RI, SubR.get());
    737   }
    738 
    739 private:
    740   /// Wipe this region tree's state without releasing any resources.
    741   ///
    742   /// This is essentially a post-move helper only. It leaves the object in an
    743   /// assignable and destroyable state, but otherwise invalid.
    744   void wipe() {
    745     DT = nullptr;
    746     PDT = nullptr;
    747     DF = nullptr;
    748     TopLevelRegion = nullptr;
    749     BBtoRegion.clear();
    750   }
    751 
    752   // Check whether the entries of BBtoRegion for the BBs of region
    753   // SR are correct. Triggers an assertion if not. Calls itself recursively for
    754   // subregions.
    755   void verifyBBMap(const RegionT *SR) const;
    756 
    757   // Returns true if BB is in the dominance frontier of
    758   // entry, because it was inherited from exit. In the other case there is an
    759   // edge going from entry to BB without passing exit.
    760   bool isCommonDomFrontier(BlockT *BB, BlockT *entry, BlockT *exit) const;
    761 
    762   // Check if entry and exit surround a valid region, based on
    763   // dominance tree and dominance frontier.
    764   bool isRegion(BlockT *entry, BlockT *exit) const;
    765 
    766   // Saves a shortcut pointing from entry to exit.
    767   // This function may extend this shortcut if possible.
    768   void insertShortCut(BlockT *entry, BlockT *exit, BBtoBBMap *ShortCut) const;
    769 
    770   // Returns the next BB that postdominates N, while skipping
    771   // all post dominators that cannot finish a canonical region.
    772   DomTreeNodeT *getNextPostDom(DomTreeNodeT *N, BBtoBBMap *ShortCut) const;
    773 
    774   // A region is trivial, if it contains only one BB.
    775   bool isTrivialRegion(BlockT *entry, BlockT *exit) const;
    776 
    777   // Creates a single entry single exit region.
    778   RegionT *createRegion(BlockT *entry, BlockT *exit);
    779 
    780   // Detect all regions starting with bb 'entry'.
    781   void findRegionsWithEntry(BlockT *entry, BBtoBBMap *ShortCut);
    782 
    783   // Detects regions in F.
    784   void scanForRegions(FuncT &F, BBtoBBMap *ShortCut);
    785 
    786   // Get the top most parent with the same entry block.
    787   RegionT *getTopMostParent(RegionT *region);
    788 
    789   // Build the region hierarchy after all region detected.
    790   void buildRegionsTree(DomTreeNodeT *N, RegionT *region);
    791 
    792   // Update statistic about created regions.
    793   virtual void updateStatistics(RegionT *R) = 0;
    794 
    795   // Detect all regions in function and build the region tree.
    796   void calculate(FuncT &F);
    797 
    798 public:
    799   RegionInfoBase(const RegionInfoBase &) = delete;
    800   RegionInfoBase &operator=(const RegionInfoBase &) = delete;
    801 
    802   static bool VerifyRegionInfo;
    803   static typename RegionT::PrintStyle printStyle;
    804 
    805   void print(raw_ostream &OS) const;
    806 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
    807   void dump() const;
    808 #endif
    809 
    810   void releaseMemory();
    811 
    812   /// Get the smallest region that contains a BasicBlock.
    813   ///
    814   /// @param BB The basic block.
    815   /// @return The smallest region, that contains BB or NULL, if there is no
    816   /// region containing BB.
    817   RegionT *getRegionFor(BlockT *BB) const;
    818 
    819   ///  Set the smallest region that surrounds a basic block.
    820   ///
    821   /// @param BB The basic block surrounded by a region.
    822   /// @param R The smallest region that surrounds BB.
    823   void setRegionFor(BlockT *BB, RegionT *R);
    824 
    825   /// A shortcut for getRegionFor().
    826   ///
    827   /// @param BB The basic block.
    828   /// @return The smallest region, that contains BB or NULL, if there is no
    829   /// region containing BB.
    830   RegionT *operator[](BlockT *BB) const;
    831 
    832   /// Return the exit of the maximal refined region, that starts at a
    833   /// BasicBlock.
    834   ///
    835   /// @param BB The BasicBlock the refined region starts.
    836   BlockT *getMaxRegionExit(BlockT *BB) const;
    837 
    838   /// Find the smallest region that contains two regions.
    839   ///
    840   /// @param A The first region.
    841   /// @param B The second region.
    842   /// @return The smallest region containing A and B.
    843   RegionT *getCommonRegion(RegionT *A, RegionT *B) const;
    844 
    845   /// Find the smallest region that contains two basic blocks.
    846   ///
    847   /// @param A The first basic block.
    848   /// @param B The second basic block.
    849   /// @return The smallest region that contains A and B.
    850   RegionT *getCommonRegion(BlockT *A, BlockT *B) const {
    851     return getCommonRegion(getRegionFor(A), getRegionFor(B));
    852   }
    853 
    854   /// Find the smallest region that contains a set of regions.
    855   ///
    856   /// @param Regions A vector of regions.
    857   /// @return The smallest region that contains all regions in Regions.
    858   RegionT *getCommonRegion(SmallVectorImpl<RegionT *> &Regions) const;
    859 
    860   /// Find the smallest region that contains a set of basic blocks.
    861   ///
    862   /// @param BBs A vector of basic blocks.
    863   /// @return The smallest region that contains all basic blocks in BBS.
    864   RegionT *getCommonRegion(SmallVectorImpl<BlockT *> &BBs) const;
    865 
    866   RegionT *getTopLevelRegion() const { return TopLevelRegion; }
    867 
    868   /// Clear the Node Cache for all Regions.
    869   ///
    870   /// @see Region::clearNodeCache()
    871   void clearNodeCache() {
    872     if (TopLevelRegion)
    873       TopLevelRegion->clearNodeCache();
    874   }
    875 
    876   void verifyAnalysis() const;
    877 };
    878 
    879 class RegionNode : public RegionNodeBase<RegionTraits<Function>> {
    880 public:
    881   inline RegionNode(Region *Parent, BasicBlock *Entry, bool isSubRegion = false)
    882       : RegionNodeBase<RegionTraits<Function>>(Parent, Entry, isSubRegion) {}
    883 
    884   bool operator==(const Region &RN) const {
    885     return this == reinterpret_cast<const RegionNode *>(&RN);
    886   }
    887 };
    888 
    889 class Region : public RegionBase<RegionTraits<Function>> {
    890 public:
    891   Region(BasicBlock *Entry, BasicBlock *Exit, RegionInfo *RI, DominatorTree *DT,
    892          Region *Parent = nullptr);
    893   ~Region();
    894 
    895   bool operator==(const RegionNode &RN) const {
    896     return &RN == reinterpret_cast<const RegionNode *>(this);
    897   }
    898 };
    899 
    900 class RegionInfo : public RegionInfoBase<RegionTraits<Function>> {
    901 public:
    902   using Base = RegionInfoBase<RegionTraits<Function>>;
    903 
    904   explicit RegionInfo();
    905 
    906   RegionInfo(RegionInfo &&Arg) : Base(std::move(static_cast<Base &>(Arg))) {
    907     updateRegionTree(*this, TopLevelRegion);
    908   }
    909 
    910   RegionInfo &operator=(RegionInfo &&RHS) {
    911     Base::operator=(std::move(static_cast<Base &>(RHS)));
    912     updateRegionTree(*this, TopLevelRegion);
    913     return *this;
    914   }
    915 
    916   ~RegionInfo() override;
    917 
    918   /// Handle invalidation explicitly.
    919   bool invalidate(Function &F, const PreservedAnalyses &PA,
    920                   FunctionAnalysisManager::Invalidator &);
    921 
    922   // updateStatistics - Update statistic about created regions.
    923   void updateStatistics(Region *R) final;
    924 
    925   void recalculate(Function &F, DominatorTree *DT, PostDominatorTree *PDT,
    926                    DominanceFrontier *DF);
    927 
    928 #ifndef NDEBUG
    929   /// Opens a viewer to show the GraphViz visualization of the regions.
    930   ///
    931   /// Useful during debugging as an alternative to dump().
    932   void view();
    933 
    934   /// Opens a viewer to show the GraphViz visualization of this region
    935   /// without instructions in the BasicBlocks.
    936   ///
    937   /// Useful during debugging as an alternative to dump().
    938   void viewOnly();
    939 #endif
    940 };
    941 
    942 class RegionInfoPass : public FunctionPass {
    943   RegionInfo RI;
    944 
    945 public:
    946   static char ID;
    947 
    948   explicit RegionInfoPass();
    949   ~RegionInfoPass() override;
    950 
    951   RegionInfo &getRegionInfo() { return RI; }
    952 
    953   const RegionInfo &getRegionInfo() const { return RI; }
    954 
    955   /// @name FunctionPass interface
    956   //@{
    957   bool runOnFunction(Function &F) override;
    958   void releaseMemory() override;
    959   void verifyAnalysis() const override;
    960   void getAnalysisUsage(AnalysisUsage &AU) const override;
    961   void print(raw_ostream &OS, const Module *) const override;
    962   void dump() const;
    963   //@}
    964 };
    965 
    966 /// Analysis pass that exposes the \c RegionInfo for a function.
    967 class RegionInfoAnalysis : public AnalysisInfoMixin<RegionInfoAnalysis> {
    968   friend AnalysisInfoMixin<RegionInfoAnalysis>;
    969 
    970   static AnalysisKey Key;
    971 
    972 public:
    973   using Result = RegionInfo;
    974 
    975   RegionInfo run(Function &F, FunctionAnalysisManager &AM);
    976 };
    977 
    978 /// Printer pass for the \c RegionInfo.
    979 class RegionInfoPrinterPass : public PassInfoMixin<RegionInfoPrinterPass> {
    980   raw_ostream &OS;
    981 
    982 public:
    983   explicit RegionInfoPrinterPass(raw_ostream &OS);
    984 
    985   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
    986 };
    987 
    988 /// Verifier pass for the \c RegionInfo.
    989 struct RegionInfoVerifierPass : PassInfoMixin<RegionInfoVerifierPass> {
    990   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
    991 };
    992 
    993 template <>
    994 template <>
    995 inline BasicBlock *
    996 RegionNodeBase<RegionTraits<Function>>::getNodeAs<BasicBlock>() const {
    997   assert(!isSubRegion() && "This is not a BasicBlock RegionNode!");
    998   return getEntry();
    999 }
   1000 
   1001 template <>
   1002 template <>
   1003 inline Region *
   1004 RegionNodeBase<RegionTraits<Function>>::getNodeAs<Region>() const {
   1005   assert(isSubRegion() && "This is not a subregion RegionNode!");
   1006   auto Unconst = const_cast<RegionNodeBase<RegionTraits<Function>> *>(this);
   1007   return reinterpret_cast<Region *>(Unconst);
   1008 }
   1009 
   1010 template <class Tr>
   1011 inline raw_ostream &operator<<(raw_ostream &OS,
   1012                                const RegionNodeBase<Tr> &Node) {
   1013   using BlockT = typename Tr::BlockT;
   1014   using RegionT = typename Tr::RegionT;
   1015 
   1016   if (Node.isSubRegion())
   1017     return OS << Node.template getNodeAs<RegionT>()->getNameStr();
   1018   else
   1019     return OS << Node.template getNodeAs<BlockT>()->getName();
   1020 }
   1021 
   1022 extern template class RegionBase<RegionTraits<Function>>;
   1023 extern template class RegionNodeBase<RegionTraits<Function>>;
   1024 extern template class RegionInfoBase<RegionTraits<Function>>;
   1025 
   1026 } // end namespace llvm
   1027 
   1028 #endif // LLVM_ANALYSIS_REGIONINFO_H
   1029