mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
70 lines
2.1 KiB
C++
70 lines
2.1 KiB
C++
|
//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
|
||
|
//
|
||
|
// 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 implements LoopPass and LPPassManager. All loop optimization
|
||
|
// and transformation passes are derived from LoopPass. LPPassManager is
|
||
|
// responsible for managing LoopPasses.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "llvm/Analysis/LoopPass.h"
|
||
|
using namespace llvm;
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// LPPassManager
|
||
|
//
|
||
|
/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses.
|
||
|
|
||
|
/// 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) {
|
||
|
LoopInfo &LI = getAnalysis<LoopInfo>();
|
||
|
bool Changed = false;
|
||
|
|
||
|
std::string Msg1 = "Executing Pass '";
|
||
|
std::string Msg3 = "' Made Modification '";
|
||
|
|
||
|
// Walk Loops
|
||
|
for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) {
|
||
|
|
||
|
Loop *L = *I;
|
||
|
// Run all passes on current SCC
|
||
|
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
|
||
|
|
||
|
Pass *P = getContainedPass(Index);
|
||
|
AnalysisUsage AnUsage;
|
||
|
P->getAnalysisUsage(AnUsage);
|
||
|
|
||
|
std::string Msg2 = "' on Loop ...\n'";
|
||
|
dumpPassInfo(P, Msg1, Msg2);
|
||
|
dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
|
||
|
|
||
|
initializeAnalysisImpl(P);
|
||
|
|
||
|
StartPassTimer(P);
|
||
|
LoopPass *LP = dynamic_cast<LoopPass *>(P);
|
||
|
assert (LP && "Invalid LPPassManager member");
|
||
|
LP->runOnLoop(*L, *this);
|
||
|
StopPassTimer(P);
|
||
|
|
||
|
if (Changed)
|
||
|
dumpPassInfo(P, Msg3, Msg2);
|
||
|
dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
|
||
|
|
||
|
removeNotPreservedAnalysis(P);
|
||
|
recordAvailableAnalysis(P);
|
||
|
removeDeadPasses(P, Msg2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Changed;
|
||
|
}
|
||
|
|
||
|
|