LoopPass.cpp revision 1a957d563fe894c797e0eba00bf069fbe7ecba77
1//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by Devang Patel and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements LoopPass and LPPassManager. All loop optimization
11// and transformation passes are derived from LoopPass. LPPassManager is
12// responsible for managing LoopPasses.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/Analysis/LoopPass.h"
17#include "llvm/Analysis/ScalarEvolutionExpander.h"
18using namespace llvm;
19
20//===----------------------------------------------------------------------===//
21// LPPassManager
22//
23
24char LPPassManager::ID = 0;
25/// LPPassManager manages FPPassManagers and CalLGraphSCCPasses.
26
27LPPassManager::LPPassManager(int Depth)
28  : FunctionPass((intptr_t)&ID), PMDataManager(Depth) {
29  skipThisLoop = false;
30  redoThisLoop = false;
31  LI = NULL;
32  CurrentLoop = NULL;
33}
34
35/// Delete loop from the loop queue and loop hierarcy (LoopInfo).
36void LPPassManager::deleteLoopFromQueue(Loop *L) {
37
38  if (Loop *ParentLoop = L->getParentLoop()) { // Not a top-level loop.
39    // Reparent all of the blocks in this loop.  Since BBLoop had a parent,
40    // they are now all in it.
41    for (Loop::block_iterator I = L->block_begin(), E = L->block_end();
42         I != E; ++I)
43      if (LI->getLoopFor(*I) == L)    // Don't change blocks in subloops.
44        LI->changeLoopFor(*I, ParentLoop);
45
46    // Remove the loop from its parent loop.
47    for (Loop::iterator I = ParentLoop->begin(), E = ParentLoop->end();;
48         ++I) {
49      assert(I != E && "Couldn't find loop");
50      if (*I == L) {
51        ParentLoop->removeChildLoop(I);
52        break;
53      }
54    }
55
56    // Move all subloops into the parent loop.
57    while (L->begin() != L->end())
58      ParentLoop->addChildLoop(L->removeChildLoop(L->end()-1));
59  } else {
60    // Reparent all of the blocks in this loop.  Since BBLoop had no parent,
61    // they no longer in a loop at all.
62
63    for (unsigned i = 0; i != L->getBlocks().size(); ++i) {
64      // Don't change blocks in subloops.
65      if (LI->getLoopFor(L->getBlocks()[i]) == L) {
66        LI->removeBlock(L->getBlocks()[i]);
67        --i;
68      }
69    }
70
71    // Remove the loop from the top-level LoopInfo object.
72    for (LoopInfo::iterator I = LI->begin(), E = LI->end();; ++I) {
73      assert(I != E && "Couldn't find loop");
74      if (*I == L) {
75        LI->removeLoop(I);
76        break;
77      }
78    }
79
80    // Move all of the subloops to the top-level.
81    while (L->begin() != L->end())
82      LI->addTopLevelLoop(L->removeChildLoop(L->end()-1));
83  }
84
85  delete L;
86
87  // If L is current loop then skip rest of the passes and let
88  // runOnFunction remove L from LQ. Otherwise, remove L from LQ now
89  // and continue applying other passes on CurrentLoop.
90  if (CurrentLoop == L) {
91    skipThisLoop = true;
92    return;
93  }
94
95  for (std::deque<Loop *>::iterator I = LQ.begin(),
96         E = LQ.end(); I != E; ++I) {
97    if (*I == L) {
98      LQ.erase(I);
99      break;
100    }
101  }
102}
103
104// Inset loop into loop nest (LoopInfo) and loop queue (LQ).
105void LPPassManager::insertLoop(Loop *L, Loop *ParentLoop) {
106
107  assert (CurrentLoop != L && "Cannot insert CurrentLoop");
108
109  // Insert into loop nest
110  if (ParentLoop)
111    ParentLoop->addChildLoop(L);
112  else
113    LI->addTopLevelLoop(L);
114
115  // Insert L into loop queue
116  if (L == CurrentLoop)
117    redoLoop(L);
118  else if (!ParentLoop)
119    // This is top level loop.
120    LQ.push_front(L);
121  else {
122    // Insert L after ParentLoop
123    for (std::deque<Loop *>::iterator I = LQ.begin(),
124           E = LQ.end(); I != E; ++I) {
125      if (*I == ParentLoop) {
126        // deque does not support insert after.
127        ++I;
128        LQ.insert(I, 1, L);
129        break;
130      }
131    }
132  }
133}
134
135// Reoptimize this loop. LPPassManager will re-insert this loop into the
136// queue. This allows LoopPass to change loop nest for the loop. This
137// utility may send LPPassManager into infinite loops so use caution.
138void LPPassManager::redoLoop(Loop *L) {
139  assert (CurrentLoop == L && "Can redo only CurrentLoop");
140  redoThisLoop = true;
141}
142
143// Recurse through all subloops and all loops  into LQ.
144static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
145  LQ.push_back(L);
146  for (Loop::iterator I = L->begin(), E = L->end(); I != E; ++I)
147    addLoopIntoQueue(*I, LQ);
148}
149
150/// Pass Manager itself does not invalidate any analysis info.
151void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {
152  // LPPassManager needs LoopInfo. In the long term LoopInfo class will
153  // become part of LPPassManager.
154  Info.addRequired<LoopInfo>();
155  // Used by IndVar doInitialization.
156  Info.addRequired<ScalarEvolution>();
157  Info.setPreservesAll();
158}
159
160/// verifyLoopInfo - Verify loop nest.
161void LPPassManager::verifyLoopInfo() {
162  assert (LI && "Loop Info is missing");
163
164  for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I) {
165    Loop *L = *I;
166    assert (L->getHeader() && "Loop header is missing");
167    assert (L->getLoopPreheader() && "Loop preheader is missing");
168    assert (L->getLoopLatch() && "Loop latch is missing");
169  }
170}
171
172/// run - Execute all of the passes scheduled for execution.  Keep track of
173/// whether any of the passes modifies the function, and if so, return true.
174bool LPPassManager::runOnFunction(Function &F) {
175  LI = &getAnalysis<LoopInfo>();
176  bool Changed = false;
177
178  // Populate Loop Queue
179  for (LoopInfo::iterator I = LI->begin(), E = LI->end(); I != E; ++I)
180    addLoopIntoQueue(*I, LQ);
181
182  // Initialization
183  for (std::deque<Loop *>::const_iterator I = LQ.begin(), E = LQ.end();
184       I != E; ++I) {
185    Loop *L = *I;
186    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
187      Pass *P = getContainedPass(Index);
188      LoopPass *LP = dynamic_cast<LoopPass *>(P);
189      if (LP)
190        Changed |= LP->doInitialization(L, *this);
191    }
192  }
193
194  // Walk Loops
195  while (!LQ.empty()) {
196
197    CurrentLoop  = LQ.back();
198    skipThisLoop = false;
199    redoThisLoop = false;
200
201    // Run all passes on current SCC
202    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
203
204      Pass *P = getContainedPass(Index);
205      AnalysisUsage AnUsage;
206      P->getAnalysisUsage(AnUsage);
207
208      dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG, "");
209      dumpAnalysisSetInfo("Required", P, AnUsage.getRequiredSet());
210
211      initializeAnalysisImpl(P);
212
213      StartPassTimer(P);
214      LoopPass *LP = dynamic_cast<LoopPass *>(P);
215      assert (LP && "Invalid LPPassManager member");
216      LP->runOnLoop(CurrentLoop, *this);
217      verifyLoopInfo();
218      StopPassTimer(P);
219
220      if (Changed)
221        dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG, "");
222      dumpAnalysisSetInfo("Preserved", P, AnUsage.getPreservedSet());
223
224      removeNotPreservedAnalysis(P);
225      recordAvailableAnalysis(P);
226      removeDeadPasses(P, "", ON_LOOP_MSG);
227
228      if (skipThisLoop)
229        // Do not run other passes on this loop.
230        break;
231    }
232
233    // Pop the loop from queue after running all passes.
234    LQ.pop_back();
235
236    if (redoThisLoop)
237      LQ.push_back(CurrentLoop);
238  }
239
240  // Finalization
241  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
242    Pass *P = getContainedPass(Index);
243    LoopPass *LP = dynamic_cast <LoopPass *>(P);
244    if (LP)
245      Changed |= LP->doFinalization();
246  }
247
248  return Changed;
249}
250
251
252//===----------------------------------------------------------------------===//
253// LoopPass
254
255// Check if this pass is suitable for the current LPPassManager, if
256// available. This pass P is not suitable for a LPPassManager if P
257// is not preserving higher level analysis info used by other
258// LPPassManager passes. In such case, pop LPPassManager from the
259// stack. This will force assignPassManager() to create new
260// LPPassManger as expected.
261void LoopPass::preparePassManager(PMStack &PMS) {
262
263  // Find LPPassManager
264  while (!PMS.empty()) {
265    if (PMS.top()->getPassManagerType() > PMT_LoopPassManager)
266      PMS.pop();
267    else;
268    break;
269  }
270
271  LPPassManager *LPPM = dynamic_cast<LPPassManager *>(PMS.top());
272
273  // If this pass is destroying high level information that is used
274  // by other passes that are managed by LPM then do not insert
275  // this pass in current LPM. Use new LPPassManager.
276  if (LPPM && !LPPM->preserveHigherLevelAnalysis(this))
277    PMS.pop();
278}
279
280/// Assign pass manager to manage this pass.
281void LoopPass::assignPassManager(PMStack &PMS,
282                                 PassManagerType PreferredType) {
283  // Find LPPassManager
284  while (!PMS.empty()) {
285    if (PMS.top()->getPassManagerType() > PMT_LoopPassManager)
286      PMS.pop();
287    else;
288    break;
289  }
290
291  LPPassManager *LPPM = dynamic_cast<LPPassManager *>(PMS.top());
292
293  // Create new Loop Pass Manager if it does not exist.
294  if (!LPPM) {
295
296    assert (!PMS.empty() && "Unable to create Loop Pass Manager");
297    PMDataManager *PMD = PMS.top();
298
299    // [1] Create new Call Graph Pass Manager
300    LPPM = new LPPassManager(PMD->getDepth() + 1);
301    LPPM->populateInheritedAnalysis(PMS);
302
303    // [2] Set up new manager's top level manager
304    PMTopLevelManager *TPM = PMD->getTopLevelManager();
305    TPM->addIndirectPassManager(LPPM);
306
307    // [3] Assign manager to manage this new manager. This may create
308    // and push new managers into PMS
309    Pass *P = dynamic_cast<Pass *>(LPPM);
310    TPM->schedulePass(P);
311
312    // [4] Push new manager into PMS
313    PMS.push(LPPM);
314  }
315
316  LPPM->add(this);
317}
318