LoopPass.cpp revision 4c5e43da7792f75567b693105cc53e3f1992ad98
1//===- LoopPass.cpp - Loop Pass and Loop Pass Manager ---------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// 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/IR/IRPrintingPasses.h"
18#include "llvm/IR/LLVMContext.h"
19#include "llvm/Support/Debug.h"
20#include "llvm/Support/Timer.h"
21#include "llvm/Support/raw_ostream.h"
22using namespace llvm;
23
24#define DEBUG_TYPE "loop-pass-manager"
25
26namespace {
27
28/// PrintLoopPass - Print a Function corresponding to a Loop.
29///
30class PrintLoopPass : public LoopPass {
31private:
32  std::string Banner;
33  raw_ostream &Out;       // raw_ostream to print on.
34
35public:
36  static char ID;
37  PrintLoopPass(const std::string &B, raw_ostream &o)
38      : LoopPass(ID), Banner(B), Out(o) {}
39
40  void getAnalysisUsage(AnalysisUsage &AU) const override {
41    AU.setPreservesAll();
42  }
43
44  bool runOnLoop(Loop *L, LPPassManager &) override {
45    Out << Banner;
46    for (Loop::block_iterator b = L->block_begin(), be = L->block_end();
47         b != be;
48         ++b) {
49      if (*b)
50        (*b)->print(Out);
51      else
52        Out << "Printing <null> block";
53    }
54    return false;
55  }
56};
57
58char PrintLoopPass::ID = 0;
59}
60
61//===----------------------------------------------------------------------===//
62// LPPassManager
63//
64
65char LPPassManager::ID = 0;
66
67LPPassManager::LPPassManager()
68  : FunctionPass(ID), PMDataManager() {
69  skipThisLoop = false;
70  redoThisLoop = false;
71  LI = nullptr;
72  CurrentLoop = nullptr;
73}
74
75/// Delete loop from the loop queue and loop hierarchy (LoopInfo).
76void LPPassManager::deleteLoopFromQueue(Loop *L) {
77
78  LI->updateUnloop(L);
79
80  // Notify passes that the loop is being deleted.
81  deleteSimpleAnalysisLoop(L);
82
83  // If L is current loop then skip rest of the passes and let
84  // runOnFunction remove L from LQ. Otherwise, remove L from LQ now
85  // and continue applying other passes on CurrentLoop.
86  if (CurrentLoop == L)
87    skipThisLoop = true;
88
89  delete L;
90
91  if (skipThisLoop)
92    return;
93
94  for (std::deque<Loop *>::iterator I = LQ.begin(),
95         E = LQ.end(); I != E; ++I) {
96    if (*I == L) {
97      LQ.erase(I);
98      break;
99    }
100  }
101}
102
103// Inset loop into loop nest (LoopInfo) and loop queue (LQ).
104void LPPassManager::insertLoop(Loop *L, Loop *ParentLoop) {
105
106  assert (CurrentLoop != L && "Cannot insert CurrentLoop");
107
108  // Insert into loop nest
109  if (ParentLoop)
110    ParentLoop->addChildLoop(L);
111  else
112    LI->addTopLevelLoop(L);
113
114  insertLoopIntoQueue(L);
115}
116
117void LPPassManager::insertLoopIntoQueue(Loop *L) {
118  // Insert L into loop queue
119  if (L == CurrentLoop)
120    redoLoop(L);
121  else if (!L->getParentLoop())
122    // This is top level loop.
123    LQ.push_front(L);
124  else {
125    // Insert L after the parent loop.
126    for (std::deque<Loop *>::iterator I = LQ.begin(),
127           E = LQ.end(); I != E; ++I) {
128      if (*I == L->getParentLoop()) {
129        // deque does not support insert after.
130        ++I;
131        LQ.insert(I, 1, L);
132        break;
133      }
134    }
135  }
136}
137
138// Reoptimize this loop. LPPassManager will re-insert this loop into the
139// queue. This allows LoopPass to change loop nest for the loop. This
140// utility may send LPPassManager into infinite loops so use caution.
141void LPPassManager::redoLoop(Loop *L) {
142  assert (CurrentLoop == L && "Can redo only CurrentLoop");
143  redoThisLoop = true;
144}
145
146/// cloneBasicBlockSimpleAnalysis - Invoke cloneBasicBlockAnalysis hook for
147/// all loop passes.
148void LPPassManager::cloneBasicBlockSimpleAnalysis(BasicBlock *From,
149                                                  BasicBlock *To, Loop *L) {
150  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
151    LoopPass *LP = getContainedPass(Index);
152    LP->cloneBasicBlockAnalysis(From, To, L);
153  }
154}
155
156/// deleteSimpleAnalysisValue - Invoke deleteAnalysisValue hook for all passes.
157void LPPassManager::deleteSimpleAnalysisValue(Value *V, Loop *L) {
158  if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
159    for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;
160         ++BI) {
161      Instruction &I = *BI;
162      deleteSimpleAnalysisValue(&I, L);
163    }
164  }
165  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
166    LoopPass *LP = getContainedPass(Index);
167    LP->deleteAnalysisValue(V, L);
168  }
169}
170
171/// Invoke deleteAnalysisLoop hook for all passes.
172void LPPassManager::deleteSimpleAnalysisLoop(Loop *L) {
173  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
174    LoopPass *LP = getContainedPass(Index);
175    LP->deleteAnalysisLoop(L);
176  }
177}
178
179
180// Recurse through all subloops and all loops  into LQ.
181static void addLoopIntoQueue(Loop *L, std::deque<Loop *> &LQ) {
182  LQ.push_back(L);
183  for (Loop::reverse_iterator I = L->rbegin(), E = L->rend(); I != E; ++I)
184    addLoopIntoQueue(*I, LQ);
185}
186
187/// Pass Manager itself does not invalidate any analysis info.
188void LPPassManager::getAnalysisUsage(AnalysisUsage &Info) const {
189  // LPPassManager needs LoopInfo. In the long term LoopInfo class will
190  // become part of LPPassManager.
191  Info.addRequired<LoopInfoWrapperPass>();
192  Info.setPreservesAll();
193}
194
195/// run - Execute all of the passes scheduled for execution.  Keep track of
196/// whether any of the passes modifies the function, and if so, return true.
197bool LPPassManager::runOnFunction(Function &F) {
198  auto &LIWP = getAnalysis<LoopInfoWrapperPass>();
199  LI = &LIWP.getLoopInfo();
200  bool Changed = false;
201
202  // Collect inherited analysis from Module level pass manager.
203  populateInheritedAnalysis(TPM->activeStack);
204
205  // Populate the loop queue in reverse program order. There is no clear need to
206  // process sibling loops in either forward or reverse order. There may be some
207  // advantage in deleting uses in a later loop before optimizing the
208  // definitions in an earlier loop. If we find a clear reason to process in
209  // forward order, then a forward variant of LoopPassManager should be created.
210  //
211  // Note that LoopInfo::iterator visits loops in reverse program
212  // order. Here, reverse_iterator gives us a forward order, and the LoopQueue
213  // reverses the order a third time by popping from the back.
214  for (LoopInfo::reverse_iterator I = LI->rbegin(), E = LI->rend(); I != E; ++I)
215    addLoopIntoQueue(*I, LQ);
216
217  if (LQ.empty()) // No loops, skip calling finalizers
218    return false;
219
220  // Initialization
221  for (std::deque<Loop *>::const_iterator I = LQ.begin(), E = LQ.end();
222       I != E; ++I) {
223    Loop *L = *I;
224    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
225      LoopPass *P = getContainedPass(Index);
226      Changed |= P->doInitialization(L, *this);
227    }
228  }
229
230  // Walk Loops
231  while (!LQ.empty()) {
232
233    CurrentLoop  = LQ.back();
234    skipThisLoop = false;
235    redoThisLoop = false;
236
237    // Run all passes on the current Loop.
238    for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
239      LoopPass *P = getContainedPass(Index);
240
241      dumpPassInfo(P, EXECUTION_MSG, ON_LOOP_MSG,
242                   CurrentLoop->getHeader()->getName());
243      dumpRequiredSet(P);
244
245      initializeAnalysisImpl(P);
246
247      {
248        PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader());
249        TimeRegion PassTimer(getPassTimer(P));
250
251        Changed |= P->runOnLoop(CurrentLoop, *this);
252      }
253
254      if (Changed)
255        dumpPassInfo(P, MODIFICATION_MSG, ON_LOOP_MSG,
256                     skipThisLoop ? "<deleted>" :
257                                    CurrentLoop->getHeader()->getName());
258      dumpPreservedSet(P);
259
260      if (!skipThisLoop) {
261        // Manually check that this loop is still healthy. This is done
262        // instead of relying on LoopInfo::verifyLoop since LoopInfo
263        // is a function pass and it's really expensive to verify every
264        // loop in the function every time. That level of checking can be
265        // enabled with the -verify-loop-info option.
266        {
267          TimeRegion PassTimer(getPassTimer(&LIWP));
268          CurrentLoop->verifyLoop();
269        }
270
271        // Then call the regular verifyAnalysis functions.
272        verifyPreservedAnalysis(P);
273
274        F.getContext().yield();
275      }
276
277      removeNotPreservedAnalysis(P);
278      recordAvailableAnalysis(P);
279      removeDeadPasses(P,
280                       skipThisLoop ? "<deleted>" :
281                                      CurrentLoop->getHeader()->getName(),
282                       ON_LOOP_MSG);
283
284      if (skipThisLoop)
285        // Do not run other passes on this loop.
286        break;
287    }
288
289    // If the loop was deleted, release all the loop passes. This frees up
290    // some memory, and avoids trouble with the pass manager trying to call
291    // verifyAnalysis on them.
292    if (skipThisLoop)
293      for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
294        Pass *P = getContainedPass(Index);
295        freePass(P, "<deleted>", ON_LOOP_MSG);
296      }
297
298    // Pop the loop from queue after running all passes.
299    LQ.pop_back();
300
301    if (redoThisLoop)
302      LQ.push_back(CurrentLoop);
303  }
304
305  // Finalization
306  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
307    LoopPass *P = getContainedPass(Index);
308    Changed |= P->doFinalization();
309  }
310
311  return Changed;
312}
313
314/// Print passes managed by this manager
315void LPPassManager::dumpPassStructure(unsigned Offset) {
316  errs().indent(Offset*2) << "Loop Pass Manager\n";
317  for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
318    Pass *P = getContainedPass(Index);
319    P->dumpPassStructure(Offset + 1);
320    dumpLastUses(P, Offset+1);
321  }
322}
323
324
325//===----------------------------------------------------------------------===//
326// LoopPass
327
328Pass *LoopPass::createPrinterPass(raw_ostream &O,
329                                  const std::string &Banner) const {
330  return new PrintLoopPass(Banner, O);
331}
332
333// Check if this pass is suitable for the current LPPassManager, if
334// available. This pass P is not suitable for a LPPassManager if P
335// is not preserving higher level analysis info used by other
336// LPPassManager passes. In such case, pop LPPassManager from the
337// stack. This will force assignPassManager() to create new
338// LPPassManger as expected.
339void LoopPass::preparePassManager(PMStack &PMS) {
340
341  // Find LPPassManager
342  while (!PMS.empty() &&
343         PMS.top()->getPassManagerType() > PMT_LoopPassManager)
344    PMS.pop();
345
346  // If this pass is destroying high level information that is used
347  // by other passes that are managed by LPM then do not insert
348  // this pass in current LPM. Use new LPPassManager.
349  if (PMS.top()->getPassManagerType() == PMT_LoopPassManager &&
350      !PMS.top()->preserveHigherLevelAnalysis(this))
351    PMS.pop();
352}
353
354/// Assign pass manager to manage this pass.
355void LoopPass::assignPassManager(PMStack &PMS,
356                                 PassManagerType PreferredType) {
357  // Find LPPassManager
358  while (!PMS.empty() &&
359         PMS.top()->getPassManagerType() > PMT_LoopPassManager)
360    PMS.pop();
361
362  LPPassManager *LPPM;
363  if (PMS.top()->getPassManagerType() == PMT_LoopPassManager)
364    LPPM = (LPPassManager*)PMS.top();
365  else {
366    // Create new Loop Pass Manager if it does not exist.
367    assert (!PMS.empty() && "Unable to create Loop Pass Manager");
368    PMDataManager *PMD = PMS.top();
369
370    // [1] Create new Loop Pass Manager
371    LPPM = new LPPassManager();
372    LPPM->populateInheritedAnalysis(PMS);
373
374    // [2] Set up new manager's top level manager
375    PMTopLevelManager *TPM = PMD->getTopLevelManager();
376    TPM->addIndirectPassManager(LPPM);
377
378    // [3] Assign manager to manage this new manager. This may create
379    // and push new managers into PMS
380    Pass *P = LPPM->getAsPass();
381    TPM->schedulePass(P);
382
383    // [4] Push new manager into PMS
384    PMS.push(LPPM);
385  }
386
387  LPPM->add(this);
388}
389
390// Containing function has Attribute::OptimizeNone and transformation
391// passes should skip it.
392bool LoopPass::skipOptnoneFunction(const Loop *L) const {
393  const Function *F = L->getHeader()->getParent();
394  if (F && F->hasFnAttribute(Attribute::OptimizeNone)) {
395    // FIXME: Report this to dbgs() only once per function.
396    DEBUG(dbgs() << "Skipping pass '" << getPassName()
397          << "' in function " << F->getName() << "\n");
398    // FIXME: Delete loop from pass manager's queue?
399    return true;
400  }
401  return false;
402}
403