summaryrefslogtreecommitdiff
path: root/lib/Analysis/IPA
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2009-02-11 09:58:43 +0000
committerDuncan Sands <baldrick@free.fr>2009-02-11 09:58:43 +0000
commitaf068750a71780a2f1780f056af0c21208a408dd (patch)
tree735993ef611609d5c7a8b3b3315a5dcded979129 /lib/Analysis/IPA
parent46dec953194a2b3c308ec94c19961aa822b9d402 (diff)
downloadllvm-af068750a71780a2f1780f056af0c21208a408dd.tar.gz
llvm-af068750a71780a2f1780f056af0c21208a408dd.tar.bz2
llvm-af068750a71780a2f1780f056af0c21208a408dd.tar.xz
Make sure the SCC pass manager initializes any contained
function pass managers. Without this, simplify-libcalls would add nocapture attributes when run on its own, but not when run as part of -std-compile-opts or similar. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64300 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/IPA')
-rw-r--r--lib/Analysis/IPA/CallGraphSCCPass.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp
index b8343cf4ce..0a2f7c5397 100644
--- a/lib/Analysis/IPA/CallGraphSCCPass.cpp
+++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp
@@ -40,8 +40,8 @@ public:
/// whether any of the passes modifies the module, and if so, return true.
bool runOnModule(Module &M);
- bool doInitialization(CallGraph &CG);
- bool doFinalization(CallGraph &CG);
+ bool doInitialization(CallGraph &CG, Module &M);
+ bool doFinalization(CallGraph &CG, Module &M);
/// Pass Manager itself does not invalidate any analysis info.
void getAnalysisUsage(AnalysisUsage &Info) const {
@@ -82,7 +82,7 @@ char CGPassManager::ID = 0;
/// whether any of the passes modifies the module, and if so, return true.
bool CGPassManager::runOnModule(Module &M) {
CallGraph &CG = getAnalysis<CallGraph>();
- bool Changed = doInitialization(CG);
+ bool Changed = doInitialization(CG, M);
// Walk SCC
for (scc_iterator<CallGraph*> I = scc_begin(&CG), E = scc_end(&CG);
@@ -126,28 +126,38 @@ bool CGPassManager::runOnModule(Module &M) {
removeDeadPasses(P, "", ON_CG_MSG);
}
}
- Changed |= doFinalization(CG);
+ Changed |= doFinalization(CG, M);
return Changed;
}
/// Initialize CG
-bool CGPassManager::doInitialization(CallGraph &CG) {
+bool CGPassManager::doInitialization(CallGraph &CG, Module &M) {
bool Changed = false;
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Pass *P = getContainedPass(Index);
- if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P))
+ if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P)) {
Changed |= CGSP->doInitialization(CG);
+ } else {
+ FPPassManager *FP = dynamic_cast<FPPassManager *>(P);
+ assert (FP && "Invalid CGPassManager member");
+ Changed |= FP->doInitialization(M);
+ }
}
return Changed;
}
/// Finalize CG
-bool CGPassManager::doFinalization(CallGraph &CG) {
+bool CGPassManager::doFinalization(CallGraph &CG, Module &M) {
bool Changed = false;
for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
Pass *P = getContainedPass(Index);
- if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P))
+ if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P)) {
Changed |= CGSP->doFinalization(CG);
+ } else {
+ FPPassManager *FP = dynamic_cast<FPPassManager *>(P);
+ assert (FP && "Invalid CGPassManager member");
+ Changed |= FP->doFinalization(M);
+ }
}
return Changed;
}