diff options
| author | Hongbin Zheng <etherzhhb@gmail.com> | 2016-02-25 17:54:25 +0000 | 
|---|---|---|
| committer | Hongbin Zheng <etherzhhb@gmail.com> | 2016-02-25 17:54:25 +0000 | 
| commit | bc53977a0decc0c25d15faccedd81e39da8320cf (patch) | |
| tree | 3635c57cc4f607e923252260946e641f5635cff4 /llvm/include | |
| parent | 751337faa75179b57a315887f9dc6d8166eb0776 (diff) | |
| download | bcm5719-llvm-bc53977a0decc0c25d15faccedd81e39da8320cf.tar.gz bcm5719-llvm-bc53977a0decc0c25d15faccedd81e39da8320cf.zip | |
Introduce RegionInfoAnalysis, which compute Region Tree in the new PassManager. NFC
Differential Revision: http://reviews.llvm.org/D17571
llvm-svn: 261904
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/Analysis/RegionInfo.h | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/llvm/include/llvm/Analysis/RegionInfo.h b/llvm/include/llvm/Analysis/RegionInfo.h index 4988386fdc8..394a50330c6 100644 --- a/llvm/include/llvm/Analysis/RegionInfo.h +++ b/llvm/include/llvm/Analysis/RegionInfo.h @@ -47,6 +47,11 @@  namespace llvm { +// FIXME: Replace this brittle forward declaration with the include of the new +// PassManager.h when doing so doesn't break the PassManagerBuilder. +template <typename IRUnitT> class AnalysisManager; +class PreservedAnalyses; +  // Class to be specialized for different users of RegionInfo  // (i.e. BasicBlocks or MachineBasicBlocks). This is only to avoid needing to  // pass around an unreasonable number of template parameters. @@ -676,6 +681,22 @@ class RegionInfoBase {    RegionInfoBase(const RegionInfoBase &) = delete;    const RegionInfoBase &operator=(const RegionInfoBase &) = delete; +  RegionInfoBase(RegionInfoBase &&Arg) +    : DT(std::move(Arg.DT)), PDT(std::move(Arg.PDT)), DF(std::move(Arg.DF)), +      TopLevelRegion(std::move(Arg.TopLevelRegion)), +      BBtoRegion(std::move(Arg.BBtoRegion)) { +    Arg.wipe(); +  } +  RegionInfoBase &operator=(RegionInfoBase &&RHS) { +    DT = std::move(RHS.DT); +    PDT = std::move(RHS.PDT); +    DF = std::move(RHS.DF); +    TopLevelRegion = std::move(RHS.TopLevelRegion); +    BBtoRegion = std::move(RHS.BBtoRegion); +    RHS.wipe(); +    return *this; +  } +    DomTreeT *DT;    PostDomTreeT *PDT;    DomFrontierT *DF; @@ -687,6 +708,18 @@ private:    /// Map every BB to the smallest region, that contains BB.    BBtoRegionMap BBtoRegion; +  /// \brief Wipe this region tree's state without releasing any resources. +  /// +  /// This is essentially a post-move helper only. It leaves the object in an +  /// assignable and destroyable state, but otherwise invalid. +  void wipe() { +    DT = nullptr; +    PDT = nullptr; +    DF = nullptr; +    TopLevelRegion = nullptr; +    BBtoRegion.clear(); +  } +    // Check whether the entries of BBtoRegion for the BBs of region    // SR are correct. Triggers an assertion if not. Calls itself recursively for    // subregions. @@ -836,10 +869,19 @@ public:  class RegionInfo : public RegionInfoBase<RegionTraits<Function>> {  public: +  typedef RegionInfoBase<RegionTraits<Function>> Base; +    explicit RegionInfo();    ~RegionInfo() override; +  RegionInfo(RegionInfo &&Arg) +    : Base(std::move(static_cast<Base &>(Arg))) {} +  RegionInfo &operator=(RegionInfo &&RHS) { +    Base::operator=(std::move(static_cast<Base &>(RHS))); +    return *this; +  } +    // updateStatistics - Update statistic about created regions.    void updateStatistics(Region *R) final; @@ -884,6 +926,40 @@ public:    //@}  }; +/// \brief Analysis pass that exposes the \c RegionInfo for a function. +class RegionInfoAnalysis { +  static char PassID; + +public: +  typedef RegionInfo Result; + +  /// \brief Opaque, unique identifier for this analysis pass. +  static void *ID() { return (void *)&PassID; } + +  /// \brief Provide a name for the analysis for debugging and logging. +  static StringRef name() { return "RegionInfoAnalysis"; } + +  RegionInfo run(Function &F, AnalysisManager<Function> *AM); +}; + +/// \brief Printer pass for the \c RegionInfo. +class RegionInfoPrinterPass { +  raw_ostream &OS; + +public: +  explicit RegionInfoPrinterPass(raw_ostream &OS); +  PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM); + +  static StringRef name() { return "RegionInfoPrinterPass"; } +}; + +/// \brief Verifier pass for the \c RegionInfo. +struct RegionInfoVerifierPass { +  PreservedAnalyses run(Function &F, AnalysisManager<Function> *AM); + +  static StringRef name() { return "RegionInfoVerifierPass"; } +}; +  template <>  template <>  inline BasicBlock * | 

