diff options
author | Duncan Sands <baldrick@free.fr> | 2009-02-11 09:58:43 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2009-02-11 09:58:43 +0000 |
commit | 91e6474bf205a02f0621c3bdb3da67e9967e56c7 (patch) | |
tree | 735993ef611609d5c7a8b3b3315a5dcded979129 /lib/Analysis/IPA | |
parent | 8746cb6dbdf6d776e81337112e76a0f7fcf080cb (diff) | |
download | external_llvm-91e6474bf205a02f0621c3bdb3da67e9967e56c7.zip external_llvm-91e6474bf205a02f0621c3bdb3da67e9967e56c7.tar.gz external_llvm-91e6474bf205a02f0621c3bdb3da67e9967e56c7.tar.bz2 |
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.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index b8343cf..0a2f7c5 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; } |