diff options
-rw-r--r-- | include/llvm/Analysis/LoopInfo.h | 3 | ||||
-rw-r--r-- | include/llvm/Analysis/LoopPass.h | 4 | ||||
-rw-r--r-- | include/llvm/Pass.h | 2 | ||||
-rw-r--r-- | include/llvm/PassManagers.h | 3 | ||||
-rw-r--r-- | lib/Analysis/IPA/CallGraphSCCPass.cpp | 3 | ||||
-rw-r--r-- | lib/Analysis/LoopInfo.cpp | 13 | ||||
-rw-r--r-- | lib/Analysis/LoopPass.cpp | 16 | ||||
-rw-r--r-- | lib/Transforms/Utils/LoopSimplify.cpp | 10 | ||||
-rw-r--r-- | lib/VMCore/PassManager.cpp | 25 |
9 files changed, 51 insertions, 28 deletions
diff --git a/include/llvm/Analysis/LoopInfo.h b/include/llvm/Analysis/LoopInfo.h index b332fd1..07fa2f3 100644 --- a/include/llvm/Analysis/LoopInfo.h +++ b/include/llvm/Analysis/LoopInfo.h @@ -217,6 +217,9 @@ public: /// the mapping in the LoopInfo class. void removeBlockFromLoop(BasicBlock *BB); + /// verifyLoop - Verify loop structure + void verifyLoop() const; + void print(std::ostream &O, unsigned Depth = 0) const; void print(std::ostream *O, unsigned Depth = 0) const { if (O) print(*O, Depth); diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h index 08c2bcb..3313515 100644 --- a/include/llvm/Analysis/LoopPass.h +++ b/include/llvm/Analysis/LoopPass.h @@ -116,10 +116,6 @@ public: void redoLoop(Loop *L); private: - /// verifyLoopInfo - Verify loop nest. - void verifyLoopInfo(); - -private: std::deque<Loop *> LQ; bool skipThisLoop; bool redoThisLoop; diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index 3a28f91..f11c1aa 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -163,7 +163,7 @@ public: /// verifyAnalysis() - This member can be implemented by a analysis pass to /// check state of analysis information. - virtual void verifyAnalysis() {} + virtual void verifyAnalysis() const {} // dumpPassStructure - Implement the -debug-passes=PassStructure option virtual void dumpPassStructure(unsigned Offset = 0); diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index da05647..d7f3375 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -211,6 +211,9 @@ public: /// Augment AvailableAnalysis by adding analysis made available by pass P. void recordAvailableAnalysis(Pass *P); + /// verifyPreservedAnalysis -- Verify analysis presreved by pass P. + void verifyPreservedAnalysis(Pass *P); + /// Remove Analysis that is not preserved by the pass void removeNotPreservedAnalysis(Pass *P); diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index 97a4008..786b720 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -117,7 +117,8 @@ bool CGPassManager::runOnModule(Module &M) { if (Changed) dumpPassInfo(P, MODIFICATION_MSG, ON_CG_MSG, ""); dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet()); - + + verifyPreservedAnalysis(P); removeNotPreservedAnalysis(P); recordAvailableAnalysis(P); removeDeadPasses(P, "", ON_CG_MSG); diff --git a/lib/Analysis/LoopInfo.cpp b/lib/Analysis/LoopInfo.cpp index d58f90d..8f9b43f 100644 --- a/lib/Analysis/LoopInfo.cpp +++ b/lib/Analysis/LoopInfo.cpp @@ -81,6 +81,18 @@ void Loop::print(std::ostream &OS, unsigned Depth) const { (*I)->print(OS, Depth+2); } +/// verifyLoop - Verify loop structure +void Loop::verifyLoop() const { +#ifndef NDEBUG + assert (getHeader() && "Loop header is missing"); + assert (getLoopPreheader() && "Loop preheader is missing"); + assert (getLoopLatch() && "Loop latch is missing"); + for (std::vector<Loop*>::const_iterator I = SubLoops.begin(), E = SubLoops.end(); + I != E; ++I) + (*I)->verifyLoop(); +#endif +} + void Loop::dump() const { print(cerr); } @@ -104,7 +116,6 @@ void LoopInfo::releaseMemory() { TopLevelLoops.clear(); } - void LoopInfo::Calculate(DominatorTree &DT) { BasicBlock *RootNode = DT.getRootNode()->getBlock(); diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index f14a9ba..dc3e868 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -157,18 +157,6 @@ void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const { Info.setPreservesAll(); } -/// verifyLoopInfo - Verify loop nest. -void LPPassManager::verifyLoopInfo() { - assert (LI && "Loop Info is missing"); - - for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) { - Loop *L = *I; - assert (L->getHeader() && "Loop header is missing"); - assert (L->getLoopPreheader() && "Loop preheader is missing"); - assert (L->getLoopLatch() && "Loop latch is missing"); - } -} - /// run - Execute all of the passes scheduled for execution. Keep track of /// whether any of the passes modifies the function, and if so, return true. bool LPPassManager::runOnFunction(Function &F) { @@ -214,13 +202,13 @@ bool LPPassManager::runOnFunction(Function &F) { LoopPass *LP = dynamic_cast<LoopPass *>(P); assert (LP && "Invalid LPPassManager member"); LP->runOnLoop(CurrentLoop, *this); - verifyLoopInfo(); StopPassTimer(P); if (Changed) dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG, ""); dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet()); - + + verifyPreservedAnalysis(LP); removeNotPreservedAnalysis(P); recordAvailableAnalysis(P); removeDeadPasses(P, "", ON_LOOP_MSG); diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp index 0a5de2b..4d59e81 100644 --- a/lib/Transforms/Utils/LoopSimplify.cpp +++ b/lib/Transforms/Utils/LoopSimplify.cpp @@ -74,6 +74,16 @@ namespace { AU.addPreserved<DominanceFrontier>(); AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added. } + + /// verifyAnalysis() - Verify loop nest. + void verifyAnalysis() const { +#ifndef NDEBUG + LoopInfo *NLI = &getAnalysis<LoopInfo>(); + for (LoopInfo::iterator I = NLI->begin(), E = NLI->end(); I != E; ++I) + (*I)->verifyLoop(); +#endif + } + private: bool ProcessLoop(Loop *L); BasicBlock *SplitBlockPredecessors(BasicBlock *BB, const char *Suffix, diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 8d780e9..bf43bb1 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -594,22 +594,30 @@ bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) { return true; } -/// Remove Analyss not preserved by Pass P -void PMDataManager::removeNotPreservedAnalysis(Pass *P) { +/// verifyPreservedAnalysis -- Verify analysis presreved by pass P. +void PMDataManager::verifyPreservedAnalysis(Pass *P) { AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); // Verify preserved analysis - for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(), - E = AvailableAnalysis.end(); I != E; ++I) { - Pass *AP = I->second; - AP->verifyAnalysis(); + for (std::vector<AnalysisID>::const_iterator I = PreservedSet.begin(), + E = PreservedSet.end(); I != E; ++I) { + AnalysisID AID = *I; + Pass *AP = findAnalysisPass(AID, true); + if (AP) + AP->verifyAnalysis(); } - +} + +/// Remove Analyss not preserved by Pass P +void PMDataManager::removeNotPreservedAnalysis(Pass *P) { + AnalysisUsage AnUsage; + P->getAnalysisUsage(AnUsage); if (AnUsage.getPreservesAll()) return; + const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(), E = AvailableAnalysis.end(); I != E; ) { std::map<AnalysisID, Pass*>::iterator Info = I++; @@ -954,6 +962,7 @@ BBPassManager::runOnFunction(Function &F) { dumpPassInfo(BP, MODIFICATION_MSG, ON_BASICBLOCK_MSG, (*I).getName()); dumpAnalysisSetInfo("Preserved", BP, AnUsage.getPreservedSet()); + verifyPreservedAnalysis(BP); removeNotPreservedAnalysis(BP); recordAvailableAnalysis(BP); removeDeadPasses(BP, (*I).getName(), ON_BASICBLOCK_MSG); @@ -1151,6 +1160,7 @@ bool FPPassManager::runOnFunction(Function &F) { dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName()); dumpAnalysisSetInfo("Preserved", FP, AnUsage.getPreservedSet()); + verifyPreservedAnalysis(FP); removeNotPreservedAnalysis(FP); recordAvailableAnalysis(FP); removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG); @@ -1220,6 +1230,7 @@ MPPassManager::runOnModule(Module &M) { M.getModuleIdentifier()); dumpAnalysisSetInfo("Preserved", MP, AnUsage.getPreservedSet()); + verifyPreservedAnalysis(MP); removeNotPreservedAnalysis(MP); recordAvailableAnalysis(MP); removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG); |