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 | 003754f6563d614de04a2d4734b54434d79b2833 (patch) | |
| tree | 1dc21c7f591ed9c97def37e465aa6e67a81ac382 /llvm/lib/Analysis | |
| parent | 9dfffc6c9fed18d7dc665705e77d026fcc16c92e (diff) | |
| download | bcm5719-llvm-003754f6563d614de04a2d4734b54434d79b2833.tar.gz bcm5719-llvm-003754f6563d614de04a2d4734b54434d79b2833.zip  | |
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.
llvm-svn: 64300
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp | 26 | 
1 files changed, 18 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp b/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp index b8343cf4ce8..0a2f7c53977 100644 --- a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/llvm/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;  }  | 

