[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-06-21 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.24 -> 1.25
---
Log message:

CallGraphSCCPass manager may require other passes.
Use schedulePass() to accomodate these requirement instead of directly
assigning a manager to new CallGraph PassManager.


---
Diffs of the changes:  (+1 -1)

 CallGraphSCCPass.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.24 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.25
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.24 Wed May  2 20:11:53 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Thu Jun 21 17:29:02 2007
@@ -178,7 +178,7 @@
 // [3] Assign manager to manage this new manager. This may create
 // and push new managers into PMS
 Pass *P = dynamic_cast(CGP);
-P->assignPassManager(PMS);
+TPM->schedulePass(P);
 
 // [4] Push new manager into PMS
 PMS.push(CGP);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-04-16 Thread Anton Korobeynikov


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.20 -> 1.21
---
Log message:

Removed tabs everywhere except autogenerated & external files. Add make 
target for tabs checking.


---
Diffs of the changes:  (+11 -12)

 CallGraphSCCPass.cpp |   23 +++
 1 files changed, 11 insertions(+), 12 deletions(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.20 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.21
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.20 Mon Mar  5 14:01:30 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Mon Apr 16 13:10:22 2007
@@ -82,8 +82,7 @@
I != E; ++I) {
 
 // Run all passes on current SCC
-for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
-
+for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
   Pass *P = getContainedPass(Index);
   AnalysisUsage AnUsage;
   P->getAnalysisUsage(AnUsage);
@@ -95,20 +94,20 @@
 
   StartPassTimer(P);
   if (CallGraphSCCPass *CGSP = dynamic_cast(P))
-   Changed |= CGSP->runOnSCC(*I);   // TODO : What if CG is changed ?
+Changed |= CGSP->runOnSCC(*I);   // TODO : What if CG is changed ?
   else {
-   FPPassManager *FPP = dynamic_cast(P);
-   assert (FPP && "Invalid CGPassManager member");
+FPPassManager *FPP = dynamic_cast(P);
+assert (FPP && "Invalid CGPassManager member");
 
-   // Run pass P on all functions current SCC
-   std::vector &SCC = *I;
-   for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
- Function *F = SCC[i]->getFunction();
- if (F) {
+// Run pass P on all functions current SCC
+std::vector &SCC = *I;
+for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
+  Function *F = SCC[i]->getFunction();
+  if (F) {
 dumpPassInfo(P, EXECUTION_MSG, ON_FUNCTION_MSG, F->getName());
 Changed |= FPP->runOnFunction(*F);
   }
-   }
+}
   }
   StopPassTimer(P);
 
@@ -149,7 +148,7 @@
 
 /// Assign pass manager to manage this pass.
 void CallGraphSCCPass::assignPassManager(PMStack &PMS,
-PassManagerType PreferredType) {
+ PassManagerType PreferredType) {
   // Find CGPassManager 
   while (!PMS.empty()) {
 if (PMS.top()->getPassManagerType() > PMT_CallGraphPassManager)



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-03-05 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.19 -> 1.20
---
Log message:

Avoid constructing std::strings unless pass debugging is ON.


---
Diffs of the changes:  (+5 -10)

 CallGraphSCCPass.cpp |   15 +--
 1 files changed, 5 insertions(+), 10 deletions(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.19 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.20
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.19 Tue Feb 27 09:00:39 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Mon Mar  5 14:01:30 2007
@@ -77,9 +77,6 @@
   CallGraph &CG = getAnalysis();
   bool Changed = doInitialization(CG);
 
-  std::string Msg1 = "Executing Pass '";
-  std::string Msg3 = "' Made Modification '";
-
   // Walk SCC
   for (scc_iterator I = scc_begin(&CG), E = scc_end(&CG);
I != E; ++I) {
@@ -91,8 +88,7 @@
   AnalysisUsage AnUsage;
   P->getAnalysisUsage(AnUsage);
 
-  std::string Msg2 = "' on Call Graph ...\n'";
-  dumpPassInfo(P, Msg1, Msg2);
+  dumpPassInfo(P, EXECUTION_MSG, ON_CG_MSG, "");
   dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
 
   initializeAnalysisImpl(P);
@@ -109,21 +105,20 @@
for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
  Function *F = SCC[i]->getFunction();
  if (F) {
-std::string Msg4 = "' on Function '" + F->getName() + "'...\n";
-dumpPassInfo(P, Msg1, Msg4);
-   Changed |= FPP->runOnFunction(*F);
+dumpPassInfo(P, EXECUTION_MSG, ON_FUNCTION_MSG, F->getName());
+Changed |= FPP->runOnFunction(*F);
   }
}
   }
   StopPassTimer(P);
 
   if (Changed)
-   dumpPassInfo(P, Msg3, Msg2);
+dumpPassInfo(P, MODIFICATION_MSG, ON_CG_MSG, "");
   dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
   
   removeNotPreservedAnalysis(P);
   recordAvailableAnalysis(P);
-  removeDeadPasses(P, Msg2);
+  removeDeadPasses(P, "", ON_CG_MSG);
 }
   }
   Changed |= doFinalization(CG);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-02-27 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.18 -> 1.19
---
Log message:

Make getPassManagerType() const.


---
Diffs of the changes:  (+1 -1)

 CallGraphSCCPass.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.18 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.19
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.18 Thu Feb  1 16:38:33 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Tue Feb 27 09:00:39 2007
@@ -66,7 +66,7 @@
 return FP;
   }
 
-  virtual PassManagerType getPassManagerType() { 
+  virtual PassManagerType getPassManagerType() const { 
 return PMT_CallGraphPassManager; 
   }
 };



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-02-01 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.17 -> 1.18
---
Log message:

Dump function names when debug-pass=Executions is used.


---
Diffs of the changes:  (+5 -1)

 CallGraphSCCPass.cpp |6 +-
 1 files changed, 5 insertions(+), 1 deletion(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.17 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.18
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.17 Thu Feb  1 16:09:37 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Thu Feb  1 16:38:33 2007
@@ -19,6 +19,7 @@
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/PassManagers.h"
+#include "llvm/Function.h"
 using namespace llvm;
 
 
//===--===//
@@ -107,8 +108,11 @@
std::vector &SCC = *I;
for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
  Function *F = SCC[i]->getFunction();
- if (F) 
+ if (F) {
+std::string Msg4 = "' on Function '" + F->getName() + "'...\n";
+dumpPassInfo(P, Msg1, Msg4);
Changed |= FPP->runOnFunction(*F);
+  }
}
   }
   StopPassTimer(P);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-02-01 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.16 -> 1.17
---
Log message:

Pretty print pass manager


---
Diffs of the changes:  (+4 -0)

 CallGraphSCCPass.cpp |4 
 1 files changed, 4 insertions(+)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.16 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.17
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.16 Mon Jan 29 17:29:54 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Thu Feb  1 16:09:37 2007
@@ -45,6 +45,10 @@
 Info.setPreservesAll();
   }
 
+  virtual const char *getPassName() const {
+return "CallGraph Pass Manager";
+  }
+
   // Print passes managed by this manager
   void dumpPassStructure(unsigned Offset) {
 llvm::cerr << std::string(Offset*2, ' ') << "Call Graph SCC Pass 
Manager\n";



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-29 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.15 -> 1.16
---
Log message:

Use StartPassTimer() and StopPassManager()


---
Diffs of the changes:  (+2 -3)

 CallGraphSCCPass.cpp |5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.15 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.16
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.15 Mon Jan 29 14:08:03 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Mon Jan 29 17:29:54 2007
@@ -92,8 +92,7 @@
 
   initializeAnalysisImpl(P);
 
-  TimingInfo *TheTimeInfo = llvm::getTheTimeInfo();
-  if (TheTimeInfo)  TheTimeInfo->passStarted(P);
+  StartPassTimer(P);
   if (CallGraphSCCPass *CGSP = dynamic_cast(P))
Changed |= CGSP->runOnSCC(*I);   // TODO : What if CG is changed ?
   else {
@@ -108,7 +107,7 @@
Changed |= FPP->runOnFunction(*F);
}
   }
-  if (TheTimeInfo) TheTimeInfo->passEnded(P);
+  StopPassTimer(P);
 
   if (Changed)
dumpPassInfo(P, Msg3, Msg2);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-29 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.14 -> 1.15
---
Log message:

Measure timings.


---
Diffs of the changes:  (+3 -2)

 CallGraphSCCPass.cpp |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.14 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.15
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.14 Thu Jan 25 19:08:18 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Mon Jan 29 14:08:03 2007
@@ -92,7 +92,8 @@
 
   initializeAnalysisImpl(P);
 
-  //if (TheTimeInfo) TheTimeInfo->passStarted(P);
+  TimingInfo *TheTimeInfo = llvm::getTheTimeInfo();
+  if (TheTimeInfo)  TheTimeInfo->passStarted(P);
   if (CallGraphSCCPass *CGSP = dynamic_cast(P))
Changed |= CGSP->runOnSCC(*I);   // TODO : What if CG is changed ?
   else {
@@ -107,7 +108,7 @@
Changed |= FPP->runOnFunction(*F);
}
   }
-  //if (TheTimeInfo) TheTimeInfo->passEnded(MP);
+  if (TheTimeInfo) TheTimeInfo->passEnded(P);
 
   if (Changed)
dumpPassInfo(P, Msg3, Msg2);



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-25 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.13 -> 1.14
---
Log message:

Remove dead code. 
CallGraphSCCPass does not need to implement runOnModule().
It supports runOnSCC().


---
Diffs of the changes:  (+0 -9)

 CallGraphSCCPass.cpp |9 -
 1 files changed, 9 deletions(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.13 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.14
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.13 Tue Jan 23 15:55:17 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Thu Jan 25 19:08:18 2007
@@ -189,12 +189,3 @@
   AU.addRequired();
   AU.addPreserved();
 }
-
-bool CallGraphSCCPass::runOnModule(Module &M) {
-  CallGraph &CG = getAnalysis();
-  bool Changed = doInitialization(CG);
-  for (scc_iterator I = scc_begin(&CG), E = scc_end(&CG);
-   I != E; ++I)
-Changed = runOnSCC(*I);
-  return Changed | doFinalization(CG);
-}



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-23 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.12 -> 1.13
---
Log message:

Fix typo.


---
Diffs of the changes:  (+1 -1)

 CallGraphSCCPass.cpp |2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.12 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.13
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.12 Tue Jan 23 15:52:35 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Tue Jan 23 15:55:17 2007
@@ -144,7 +144,7 @@
   return Changed;
 }
 
-/// Assign pass manager to manager this pass
+/// Assign pass manager to manage this pass.
 void CallGraphSCCPass::assignPassManager(PMStack &PMS,
 PassManagerType PreferredType) {
   // Find CGPassManager 



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-23 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.11 -> 1.12
---
Log message:

Add CallGraphSCCPass::assignPassManager().
This enables CalLGraphPassManager.


---
Diffs of the changes:  (+38 -0)

 CallGraphSCCPass.cpp |   38 ++
 1 files changed, 38 insertions(+)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.11 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.12
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.11 Wed Jan 17 15:45:01 2007
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Tue Jan 23 15:52:35 2007
@@ -144,6 +144,44 @@
   return Changed;
 }
 
+/// Assign pass manager to manager this pass
+void CallGraphSCCPass::assignPassManager(PMStack &PMS,
+PassManagerType PreferredType) {
+  // Find CGPassManager 
+  while (!PMS.empty()) {
+if (PMS.top()->getPassManagerType() > PMT_CallGraphPassManager)
+  PMS.pop();
+else;
+break;
+  }
+
+  CGPassManager *CGP = dynamic_cast(PMS.top());
+
+  // Create new Call Graph SCC Pass Manager if it does not exist. 
+  if (!CGP) {
+
+assert (!PMS.empty() && "Unable to create Call Graph Pass Manager");
+PMDataManager *PMD = PMS.top();
+
+// [1] Create new Call Graph Pass Manager
+CGP = new CGPassManager(PMD->getDepth() + 1);
+
+// [2] Set up new manager's top level manager
+PMTopLevelManager *TPM = PMD->getTopLevelManager();
+TPM->addIndirectPassManager(CGP);
+
+// [3] Assign manager to manage this new manager. This may create
+// and push new managers into PMS
+Pass *P = dynamic_cast(CGP);
+P->assignPassManager(PMS);
+
+// [4] Push new manager into PMS
+PMS.push(CGP);
+  }
+
+  CGP->add(this);
+}
+
 /// getAnalysisUsage - For this class, we declare that we require and preserve
 /// the call graph.  If the derived class implements this method, it should
 /// always explicitly call the implementation here.



___
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[llvm-commits] CVS: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp

2007-01-17 Thread Devang Patel


Changes in directory llvm/lib/Analysis/IPA:

CallGraphSCCPass.cpp updated: 1.10 -> 1.11
---
Log message:

Add CGPassManager.


---
Diffs of the changes:  (+124 -0)

 CallGraphSCCPass.cpp |  124 +++
 1 files changed, 124 insertions(+)


Index: llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp
diff -u llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.10 
llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.11
--- llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp:1.10 Thu Apr 21 16:08:44 2005
+++ llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp  Wed Jan 17 15:45:01 2007
@@ -18,8 +18,132 @@
 #include "llvm/CallGraphSCCPass.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/ADT/SCCIterator.h"
+#include "llvm/PassManagers.h"
 using namespace llvm;
 
+//===--===//
+// CGPassManager
+//
+/// CGPassManager manages FPPassManagers and CalLGraphSCCPasses.
+
+class CGPassManager : public ModulePass, public PMDataManager {
+
+public:
+  CGPassManager(int Depth) : PMDataManager(Depth) { }
+
+  /// run - Execute all of the passes scheduled for execution.  Keep track of
+  /// 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);
+
+  /// Pass Manager itself does not invalidate any analysis info.
+  void getAnalysisUsage(AnalysisUsage &Info) const {
+// CGPassManager walks SCC and it needs CallGraph.
+Info.addRequired();
+Info.setPreservesAll();
+  }
+
+  // Print passes managed by this manager
+  void dumpPassStructure(unsigned Offset) {
+llvm::cerr << std::string(Offset*2, ' ') << "Call Graph SCC Pass 
Manager\n";
+for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
+  Pass *P = getContainedPass(Index);
+  P->dumpPassStructure(Offset + 1);
+  dumpLastUses(P, Offset+1);
+}
+  }
+
+  Pass *getContainedPass(unsigned N) {
+assert ( N < PassVector.size() && "Pass number out of range!");
+Pass *FP = static_cast(PassVector[N]);
+return FP;
+  }
+
+  virtual PassManagerType getPassManagerType() { 
+return PMT_CallGraphPassManager; 
+  }
+};
+
+/// run - Execute all of the passes scheduled for execution.  Keep track of
+/// whether any of the passes modifies the module, and if so, return true.
+bool CGPassManager::runOnModule(Module &M) {
+  CallGraph &CG = getAnalysis();
+  bool Changed = doInitialization(CG);
+
+  std::string Msg1 = "Executing Pass '";
+  std::string Msg3 = "' Made Modification '";
+
+  // Walk SCC
+  for (scc_iterator I = scc_begin(&CG), E = scc_end(&CG);
+   I != E; ++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 Call Graph ...\n'";
+  dumpPassInfo(P, Msg1, Msg2);
+  dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
+
+  initializeAnalysisImpl(P);
+
+  //if (TheTimeInfo) TheTimeInfo->passStarted(P);
+  if (CallGraphSCCPass *CGSP = dynamic_cast(P))
+   Changed |= CGSP->runOnSCC(*I);   // TODO : What if CG is changed ?
+  else {
+   FPPassManager *FPP = dynamic_cast(P);
+   assert (FPP && "Invalid CGPassManager member");
+
+   // Run pass P on all functions current SCC
+   std::vector &SCC = *I;
+   for (unsigned i = 0, e = SCC.size(); i != e; ++i) {
+ Function *F = SCC[i]->getFunction();
+ if (F) 
+   Changed |= FPP->runOnFunction(*F);
+   }
+  }
+  //if (TheTimeInfo) TheTimeInfo->passEnded(MP);
+
+  if (Changed)
+   dumpPassInfo(P, Msg3, Msg2);
+  dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
+  
+  removeNotPreservedAnalysis(P);
+  recordAvailableAnalysis(P);
+  removeDeadPasses(P, Msg2);
+}
+  }
+  Changed |= doFinalization(CG);
+  return Changed;
+}
+
+/// Initialize CG
+bool CGPassManager::doInitialization(CallGraph &CG) {
+  bool Changed = false;
+  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
+Pass *P = getContainedPass(Index);
+if (CallGraphSCCPass *CGSP = dynamic_cast(P)) 
+  Changed |= CGSP->doInitialization(CG);
+  }
+  return Changed;
+}
+
+/// Finalize CG
+bool CGPassManager::doFinalization(CallGraph &CG) {
+  bool Changed = false;
+  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
+Pass *P = getContainedPass(Index);
+if (CallGraphSCCPass *CGSP = dynamic_cast(P)) 
+  Changed |= CGSP->doFinalization(CG);
+  }
+  return Changed;
+}
+
 /// getAnalysisUsage - For this class, we declare that we require and preserve
 /// the call graph.  If the derived class implements this method, it should
 /// always explicitly call the implementation here.



_