//
// The LLVM Compiler Infrastructure
//
-// This file was developed by Devang Patel and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/LoopPass.h"
-#include "llvm/Analysis/ScalarEvolutionExpander.h"
using namespace llvm;
//===----------------------------------------------------------------------===//
/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses.
LPPassManager::LPPassManager(int Depth)
- : FunctionPass((intptr_t)&ID), PMDataManager(Depth) {
+ : FunctionPass(&ID), PMDataManager(Depth) {
skipThisLoop = false;
redoThisLoop = false;
LI = NULL;
CurrentLoop = NULL;
}
-/// Delete loop from the loop queue and loop hierarcy (LoopInfo).
+/// Delete loop from the loop queue and loop hierarchy (LoopInfo).
void LPPassManager::deleteLoopFromQueue(Loop *L) {
if (Loop *ParentLoop = L->getParentLoop()) { // Not a top-level loop.
}
// Move all subloops into the parent loop.
- while (L->begin() != L->end())
+ while (!L->empty())
ParentLoop->addChildLoop(L->removeChildLoop(L->end()-1));
} else {
// Reparent all of the blocks in this loop. Since BBLoop had no parent,
}
// Move all of the subloops to the top-level.
- while (L->begin() != L->end())
+ while (!L->empty())
LI->addTopLevelLoop(L->removeChildLoop(L->end()-1));
}
redoThisLoop = true;
}
+/// cloneBasicBlockSimpleAnalysis - Invoke cloneBasicBlockAnalysis hook for
+/// all loop passes.
+void LPPassManager::cloneBasicBlockSimpleAnalysis(BasicBlock *From,
+ BasicBlock *To, Loop *L) {
+ for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
+ Pass *P = getContainedPass(Index);
+ LoopPass *LP = dynamic_cast<LoopPass *>(P);
+ LP->cloneBasicBlockAnalysis(From, To, L);
+ }
+}
+
+/// deleteSimpleAnalysisValue - Invoke deleteAnalysisValue hook for all passes.
+void LPPassManager::deleteSimpleAnalysisValue(Value *V, Loop *L) {
+ if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
+ for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;
+ ++BI) {
+ Instruction &I = *BI;
+ deleteSimpleAnalysisValue(&I, L);
+ }
+ }
+ for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
+ Pass *P = getContainedPass(Index);
+ LoopPass *LP = dynamic_cast<LoopPass *>(P);
+ LP->deleteAnalysisValue(V, L);
+ }
+}
+
+
// Recurse through all subloops and all loops into LQ.
static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
LQ.push_back(L);
// LPPassManager needs LoopInfo. In the long term LoopInfo class will
// become part of LPPassManager.
Info.addRequired<LoopInfo>();
- // Used by IndVar doInitialization.
- Info.addRequired<ScalarEvolution>();
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) {
LI = &getAnalysis<LoopInfo>();
bool Changed = false;
+ // Collect inherited analysis from Module level pass manager.
+ populateInheritedAnalysis(TPM->activeStack);
+
// Populate Loop Queue
for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
addLoopIntoQueue(*I, LQ);
// Run all passes on current SCC
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
-
Pass *P = getContainedPass(Index);
- AnalysisUsage AnUsage;
- P->getAnalysisUsage(AnUsage);
dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG, "");
- dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
+ dumpRequiredSet(P);
initializeAnalysisImpl(P);
- StartPassTimer(P);
LoopPass *LP = dynamic_cast<LoopPass *>(P);
- assert (LP && "Invalid LPPassManager member");
- LP->runOnLoop(CurrentLoop, *this);
- verifyLoopInfo();
- StopPassTimer(P);
+ {
+ PassManagerPrettyStackEntry X(LP, *CurrentLoop->getHeader());
+ StartPassTimer(P);
+ assert(LP && "Invalid LPPassManager member");
+ Changed |= LP->runOnLoop(CurrentLoop, *this);
+ StopPassTimer(P);
+ }
if (Changed)
dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG, "");
- dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
-
+ dumpPreservedSet(P);
+
+ verifyPreservedAnalysis(LP);
removeNotPreservedAnalysis(P);
recordAvailableAnalysis(P);
removeDeadPasses(P, "", ON_LOOP_MSG);
+ // If dominator information is available then verify the info if requested.
+ verifyDomInfo(*LP, F);
+
if (skipThisLoop)
// Do not run other passes on this loop.
break;
return Changed;
}
+/// Print passes managed by this manager
+void LPPassManager::dumpPassStructure(unsigned Offset) {
+ llvm::cerr << std::string(Offset*2, ' ') << "Loop Pass Manager\n";
+ for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
+ Pass *P = getContainedPass(Index);
+ P->dumpPassStructure(Offset + 1);
+ dumpLastUses(P, Offset+1);
+ }
+}
+
//===----------------------------------------------------------------------===//
// LoopPass
void LoopPass::preparePassManager(PMStack &PMS) {
// Find LPPassManager
- while (!PMS.empty()) {
- if (PMS.top()->getPassManagerType() > PMT_LoopPassManager)
- PMS.pop();
- else;
- break;
- }
+ while (!PMS.empty() &&
+ PMS.top()->getPassManagerType() > PMT_LoopPassManager)
+ PMS.pop();
LPPassManager *LPPM = dynamic_cast<LPPassManager *>(PMS.top());
void LoopPass::assignPassManager(PMStack &PMS,
PassManagerType PreferredType) {
// Find LPPassManager
- while (!PMS.empty()) {
- if (PMS.top()->getPassManagerType() > PMT_LoopPassManager)
- PMS.pop();
- else;
- break;
- }
+ while (!PMS.empty() &&
+ PMS.top()->getPassManagerType() > PMT_LoopPassManager)
+ PMS.pop();
LPPassManager *LPPM = dynamic_cast<LPPassManager *>(PMS.top());