summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/ADT/ilist.h6
-rw-r--r--llvm/include/llvm/Analysis/IVUsers.h56
-rw-r--r--llvm/include/llvm/InitializePasses.h2
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&);
OpenPOWER on IntegriCloud