From 58e0ef1e90c3f6dbae213612b44e56f7d6d65ea7 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Thu, 19 Jul 2007 18:02:32 +0000 Subject: [PATCH] Verify loop info. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40062 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/LoopInfo.h | 3 +++ include/llvm/Analysis/LoopPass.h | 4 ---- include/llvm/Pass.h | 2 +- include/llvm/PassManagers.h | 3 +++ lib/Analysis/IPA/CallGraphSCCPass.cpp | 3 ++- lib/Analysis/LoopInfo.cpp | 13 ++++++++++++- lib/Analysis/LoopPass.cpp | 16 ++-------------- lib/Transforms/Utils/LoopSimplify.cpp | 10 ++++++++++ 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 b332fd1f97c..07fa2f3a380 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 08c2bcbbf8c..33135156ad3 100644 --- a/include/llvm/Analysis/LoopPass.h +++ b/include/llvm/Analysis/LoopPass.h @@ -115,10 +115,6 @@ public: // utility may send LPPassManager into infinite loops so use caution. void redoLoop(Loop *L); -private: - /// verifyLoopInfo - Verify loop nest. - void verifyLoopInfo(); - private: std::deque LQ; bool skipThisLoop; diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index 3a28f913303..f11c1aa9742 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 da056477fcd..d7f3375dfe4 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 97a40089c3f..786b720db7a 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 d58f90df1e4..8f9b43fa864 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::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 f14a9baf98a..dc3e86844eb 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(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 0a5de2b43ed..4d59e818e91 100644 --- a/lib/Transforms/Utils/LoopSimplify.cpp +++ b/lib/Transforms/Utils/LoopSimplify.cpp @@ -74,6 +74,16 @@ namespace { AU.addPreserved(); AU.addPreservedID(BreakCriticalEdgesID); // No critical edges added. } + + /// verifyAnalysis() - Verify loop nest. + void verifyAnalysis() const { +#ifndef NDEBUG + LoopInfo *NLI = &getAnalysis(); + 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 8d780e98d02..bf43bb1f894 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 &PreservedSet = AnUsage.getPreservedSet(); // Verify preserved analysis - for (std::map::iterator I = AvailableAnalysis.begin(), - E = AvailableAnalysis.end(); I != E; ++I) { - Pass *AP = I->second; - AP->verifyAnalysis(); + for (std::vector::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 &PreservedSet = AnUsage.getPreservedSet(); for (std::map::iterator I = AvailableAnalysis.begin(), E = AvailableAnalysis.end(); I != E; ) { std::map::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); -- 2.34.1