diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/ADT/ilist.h | 6 | ||||
-rw-r--r-- | llvm/include/llvm/Analysis/IVUsers.h | 56 | ||||
-rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 |
3 files changed, 52 insertions, 12 deletions
diff --git a/llvm/include/llvm/ADT/ilist.h b/llvm/include/llvm/ADT/ilist.h index f4dde441bf8..8e4d45dfef2 100644 --- a/llvm/include/llvm/ADT/ilist.h +++ b/llvm/include/llvm/ADT/ilist.h @@ -422,6 +422,10 @@ public: return iterator(New); } + iterator insert(iterator where, const NodeTy &New) { + return this->insert(where, new NodeTy(New)); + } + iterator insertAfter(iterator where, NodeTy *New) { if (empty()) return insert(begin(), New); @@ -668,7 +672,7 @@ struct ilist : public iplist<NodeTy> { typedef typename iplist<NodeTy>::iterator iterator; ilist() {} - ilist(const ilist &right) { + ilist(const ilist &right) : iplist<NodeTy>() { insert(this->begin(), right.begin(), right.end()); } explicit ilist(size_type count) { diff --git a/llvm/include/llvm/Analysis/IVUsers.h b/llvm/include/llvm/Analysis/IVUsers.h index 37d01490dac..e68a77526b9 100644 --- a/llvm/include/llvm/Analysis/IVUsers.h +++ b/llvm/include/llvm/Analysis/IVUsers.h @@ -117,7 +117,7 @@ private: mutable ilist_node<IVStrideUse> Sentinel; }; -class IVUsers : public LoopPass { +class IVUsers { friend class IVStrideUse; Loop *L; AssumptionCache *AC; @@ -133,15 +133,9 @@ class IVUsers : public LoopPass { // Ephemeral values used by @llvm.assume in this function. SmallPtrSet<const Value *, 32> EphValues; - void getAnalysisUsage(AnalysisUsage &AU) const override; - - bool runOnLoop(Loop *L, LPPassManager &LPM) override; - - void releaseMemory() override; - public: - static char ID; // Pass ID, replacement for typeid - IVUsers(); + IVUsers(Loop *L, AssumptionCache *AC, LoopInfo *LI, DominatorTree *DT, + ScalarEvolution *SE); Loop *getLoop() const { return L; } @@ -173,16 +167,58 @@ public: return Processed.count(Inst); } - void print(raw_ostream &OS, const Module* = nullptr) const override; + void releaseMemory(); + + void print(raw_ostream &OS, const Module * = nullptr) const; /// dump - This method is used for debugging. void dump() const; + protected: bool AddUsersImpl(Instruction *I, SmallPtrSetImpl<Loop*> &SimpleLoopNests); }; Pass *createIVUsersPass(); +class IVUsersWrapperPass : public LoopPass { + std::unique_ptr<IVUsers> IU; + +public: + static char ID; + + IVUsersWrapperPass(); + + IVUsers &getIU() { return *IU; } + const IVUsers &getIU() const { return *IU; } + + void getAnalysisUsage(AnalysisUsage &AU) const override; + + bool runOnLoop(Loop *L, LPPassManager &LPM) override; + + void releaseMemory() override; + + void print(raw_ostream &OS, const Module * = nullptr) const override; +}; + +/// Analysis pass that exposes the \c IVUsers for a loop. +class IVUsersAnalysis : public AnalysisInfoMixin<IVUsersAnalysis> { + friend AnalysisInfoMixin<IVUsersAnalysis>; + static char PassID; + +public: + typedef IVUsers Result; + + IVUsers run(Loop &L, AnalysisManager<Loop> &AM); +}; + +/// Printer pass for the \c IVUsers for a loop. +class IVUsersPrinterPass : public PassInfoMixin<IVUsersPrinterPass> { + raw_ostream &OS; + +public: + explicit IVUsersPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(Loop &L, AnalysisManager<Loop> &AM); +}; } #endif diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 20eaa89362d..f8ec8586d73 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -143,7 +143,7 @@ void initializeGuardWideningLegacyPassPass(PassRegistry&); void initializeIPCPPass(PassRegistry&); void initializeIPSCCPLegacyPassPass(PassRegistry &); void initializeIRTranslatorPass(PassRegistry &); -void initializeIVUsersPass(PassRegistry&); +void initializeIVUsersWrapperPassPass(PassRegistry&); void initializeIfConverterPass(PassRegistry&); void initializeImplicitNullChecksPass(PassRegistry&); void initializeIndVarSimplifyLegacyPassPass(PassRegistry&); |