diff options
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 * |

