PassManager.cpp revision b30803bc17a5be655b7c4ef356e75ae5524b0931
155fd43f90913676682487f89f27c756adb827f66Devang Patel//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
255fd43f90913676682487f89f27c756adb827f66Devang Patel//
355fd43f90913676682487f89f27c756adb827f66Devang Patel//                     The LLVM Compiler Infrastructure
455fd43f90913676682487f89f27c756adb827f66Devang Patel//
555fd43f90913676682487f89f27c756adb827f66Devang Patel// This file was developed by the LLVM research group and is distributed under
655fd43f90913676682487f89f27c756adb827f66Devang Patel// the University of Illinois Open Source License. See LICENSE.TXT for details.
755fd43f90913676682487f89f27c756adb827f66Devang Patel//
855fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===//
955fd43f90913676682487f89f27c756adb827f66Devang Patel//
1055fd43f90913676682487f89f27c756adb827f66Devang Patel// This file implements the LLVM Pass Manager infrastructure.
1155fd43f90913676682487f89f27c756adb827f66Devang Patel//
1255fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===//
1355fd43f90913676682487f89f27c756adb827f66Devang Patel
1455fd43f90913676682487f89f27c756adb827f66Devang Patel
1555fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/PassManager.h"
1655fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Function.h"
1755fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h"
1855fd43f90913676682487f89f27c756adb827f66Devang Patel
1955fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm;
2055fd43f90913676682487f89f27c756adb827f66Devang Patel
2155fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation
2255fd43f90913676682487f89f27c756adb827f66Devang Patel
2355fd43f90913676682487f89f27c756adb827f66Devang Patel/// Add pass P into PassVector and return TRUE. If this pass is not
2455fd43f90913676682487f89f27c756adb827f66Devang Patel/// manageable by this manager then return FALSE.
2555fd43f90913676682487f89f27c756adb827f66Devang Patelbool
2655fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::addPass (Pass *P) {
2755fd43f90913676682487f89f27c756adb827f66Devang Patel
2855fd43f90913676682487f89f27c756adb827f66Devang Patel  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
2955fd43f90913676682487f89f27c756adb827f66Devang Patel  if (!BP)
3055fd43f90913676682487f89f27c756adb827f66Devang Patel    return false;
3155fd43f90913676682487f89f27c756adb827f66Devang Patel
3255fd43f90913676682487f89f27c756adb827f66Devang Patel  // TODO: Check if it suitable to manage P using this BasicBlockPassManager
3355fd43f90913676682487f89f27c756adb827f66Devang Patel  // or we need another instance of BasicBlockPassManager
3455fd43f90913676682487f89f27c756adb827f66Devang Patel
3555fd43f90913676682487f89f27c756adb827f66Devang Patel  // Add pass
3655fd43f90913676682487f89f27c756adb827f66Devang Patel  PassVector.push_back(BP);
3755fd43f90913676682487f89f27c756adb827f66Devang Patel  return true;
3855fd43f90913676682487f89f27c756adb827f66Devang Patel}
3955fd43f90913676682487f89f27c756adb827f66Devang Patel
4055fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking
4155fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method.  Keep track of whether any of the passes modifies
4255fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true.
4355fd43f90913676682487f89f27c756adb827f66Devang Patelbool
4455fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) {
4555fd43f90913676682487f89f27c756adb827f66Devang Patel
4655fd43f90913676682487f89f27c756adb827f66Devang Patel  bool Changed = false;
4755fd43f90913676682487f89f27c756adb827f66Devang Patel  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
4855fd43f90913676682487f89f27c756adb827f66Devang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
4955fd43f90913676682487f89f27c756adb827f66Devang Patel           e = PassVector.end(); itr != e; ++itr) {
5055fd43f90913676682487f89f27c756adb827f66Devang Patel      Pass *P = *itr;
5155fd43f90913676682487f89f27c756adb827f66Devang Patel      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
5255fd43f90913676682487f89f27c756adb827f66Devang Patel      Changed |= BP->runOnBasicBlock(*I);
5355fd43f90913676682487f89f27c756adb827f66Devang Patel    }
5455fd43f90913676682487f89f27c756adb827f66Devang Patel  return Changed;
5555fd43f90913676682487f89f27c756adb827f66Devang Patel}
5655fd43f90913676682487f89f27c756adb827f66Devang Patel
57448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation
58448d27cd795dc273249f123444509403f4fa4facDevang Patel
59448d27cd795dc273249f123444509403f4fa4facDevang Patel///////////////////////////////////////////////////////////////////////////////
60448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager
61448d27cd795dc273249f123444509403f4fa4facDevang Patel
62448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then
63448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic
64448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P.
65448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
66448d27cd795dc273249f123444509403f4fa4facDevang PatelFunctionPassManager_New::addPass (Pass *P) {
67448d27cd795dc273249f123444509403f4fa4facDevang Patel
68448d27cd795dc273249f123444509403f4fa4facDevang Patel  // If P is a BasicBlockPass then use BasicBlockPassManager_New.
69448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) {
70448d27cd795dc273249f123444509403f4fa4facDevang Patel
71448d27cd795dc273249f123444509403f4fa4facDevang Patel    if (!activeBBPassManager
72448d27cd795dc273249f123444509403f4fa4facDevang Patel        || !activeBBPassManager->addPass(BP)) {
73448d27cd795dc273249f123444509403f4fa4facDevang Patel
74448d27cd795dc273249f123444509403f4fa4facDevang Patel      activeBBPassManager = new BasicBlockPassManager_New();
75448d27cd795dc273249f123444509403f4fa4facDevang Patel
76448d27cd795dc273249f123444509403f4fa4facDevang Patel      PassVector.push_back(activeBBPassManager);
77448d27cd795dc273249f123444509403f4fa4facDevang Patel      assert (!activeBBPassManager->addPass(BP) &&
78448d27cd795dc273249f123444509403f4fa4facDevang Patel              "Unable to add Pass");
79448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
80448d27cd795dc273249f123444509403f4fa4facDevang Patel    return true;
81448d27cd795dc273249f123444509403f4fa4facDevang Patel  }
82448d27cd795dc273249f123444509403f4fa4facDevang Patel
83448d27cd795dc273249f123444509403f4fa4facDevang Patel  FunctionPass *FP = dynamic_cast<FunctionPass *>(P);
84448d27cd795dc273249f123444509403f4fa4facDevang Patel  if (!FP)
85448d27cd795dc273249f123444509403f4fa4facDevang Patel    return false;
86448d27cd795dc273249f123444509403f4fa4facDevang Patel
87448d27cd795dc273249f123444509403f4fa4facDevang Patel  // TODO: Check if it suitable to manage P using this FunctionPassManager
8892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // or we need another instance of FunctionPassManager
89448d27cd795dc273249f123444509403f4fa4facDevang Patel
90448d27cd795dc273249f123444509403f4fa4facDevang Patel  PassVector.push_back(FP);
91448d27cd795dc273249f123444509403f4fa4facDevang Patel  activeBBPassManager = NULL;
92448d27cd795dc273249f123444509403f4fa4facDevang Patel  return true;
93448d27cd795dc273249f123444509403f4fa4facDevang Patel}
94448d27cd795dc273249f123444509403f4fa4facDevang Patel
95448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking
96448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method.  Keep track of whether any of the passes modifies
97448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true.
98448d27cd795dc273249f123444509403f4fa4facDevang Patelbool
99448d27cd795dc273249f123444509403f4fa4facDevang PatelFunctionPassManager_New::runOnModule(Module &M) {
100448d27cd795dc273249f123444509403f4fa4facDevang Patel
101448d27cd795dc273249f123444509403f4fa4facDevang Patel  bool Changed = false;
102448d27cd795dc273249f123444509403f4fa4facDevang Patel  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
103448d27cd795dc273249f123444509403f4fa4facDevang Patel    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
104448d27cd795dc273249f123444509403f4fa4facDevang Patel           e = PassVector.end(); itr != e; ++itr) {
105448d27cd795dc273249f123444509403f4fa4facDevang Patel      Pass *P = *itr;
106448d27cd795dc273249f123444509403f4fa4facDevang Patel      FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
107448d27cd795dc273249f123444509403f4fa4facDevang Patel      Changed |= FP->runOnFunction(*I);
108448d27cd795dc273249f123444509403f4fa4facDevang Patel    }
109448d27cd795dc273249f123444509403f4fa4facDevang Patel  return Changed;
110448d27cd795dc273249f123444509403f4fa4facDevang Patel}
111448d27cd795dc273249f123444509403f4fa4facDevang Patel
112448d27cd795dc273249f123444509403f4fa4facDevang Patel
11392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation
11492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
11592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass
11692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// then use FunctionPassManager_New to manage it. Return FALSE if P
11792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager.
11892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
11992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::addPass (Pass *P) {
12092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
12192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // If P is FunctionPass then use function pass maanager.
12292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) {
12392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
12492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    activeFunctionPassManager = NULL;
12592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
12692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    if (!activeFunctionPassManager
12792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel        || !activeFunctionPassManager->addPass(P)) {
12892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
12992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel      activeFunctionPassManager = new FunctionPassManager_New();
13092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
13192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel      PassVector.push_back(activeFunctionPassManager);
13292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel      assert (!activeFunctionPassManager->addPass(FP) &&
13392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel              "Unable to add Pass");
13492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    }
13592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return true;
13692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
13792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
13892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  ModulePass *MP = dynamic_cast<ModulePass *>(P);
13992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  if (!MP)
14092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    return false;
14192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
14292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // TODO: Check if it suitable to manage P using this ModulePassManager
14392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  // or we need another instance of ModulePassManager
14492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
14592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  PassVector.push_back(MP);
14692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  activeFunctionPassManager = NULL;
14792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return true;
14892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
14992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
15092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
15192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking
15292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method.  Keep track of whether any of the passes modifies
15392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true.
15492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool
15592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) {
15692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  bool Changed = false;
15792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  for (std::vector<Pass *>::iterator itr = PassVector.begin(),
15892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel         e = PassVector.end(); itr != e; ++itr) {
15992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Pass *P = *itr;
16092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    ModulePass *MP = dynamic_cast<ModulePass*>(P);
16192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel    Changed |= MP->runOnModule(M);
16292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  }
16392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel  return Changed;
16492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel}
16592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel
166b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their
167b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue.
168b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
169b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::schedulePasses() {
170b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
171b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
172b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
173b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run.
174b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid
175b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::add(Pass *P) {
176b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  /* TODO */
177b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
178b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
179b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation
180b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to
181b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it.
182b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
183b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::addPass (Pass *P) {
184b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
185b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  if (!activeManager) {
186b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    activeManager = new ModulePassManager_New();
187b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    PassManagers.push_back(activeManager);
188b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
189b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
190b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return activeManager->addPass(P);
191b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
192b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
193b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution.  Keep track of
194b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true.
195b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool
196b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::run(Module &M) {
197b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel
198b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  schedulePasses();
199b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  bool Changed = false;
200b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
201b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel         e = PassManagers.end(); itr != e; ++itr) {
202b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    ModulePassManager_New *pm = *itr;
203b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel    Changed |= pm->runOnModule(M);
204b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  }
205b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel  return Changed;
206b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel}
207