LoopPass.h revision bd4d66d56a4e761a206dac14ccff4d37139d9ad9
1ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===- LoopPass.h - LoopPass class ----------------------------------------===//
2ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//
3ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//                     The LLVM Compiler Infrastructure
4ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//
5ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// This file is distributed under the University of Illinois Open Source
6ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// License. See LICENSE.TXT for details.
7ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//
8ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===----------------------------------------------------------------------===//
9ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//
10ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// This file defines LoopPass class. All loop optimization
11ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski// and transformation passes are derived from LoopPass.
12ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//
13ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski//===----------------------------------------------------------------------===//
14ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
15ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#ifndef LLVM_LOOP_PASS_H
16ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#define LLVM_LOOP_PASS_H
17ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
18ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Analysis/LoopInfo.h"
19ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Pass.h"
20ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/PassManagers.h"
21ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include "llvm/Function.h"
22ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#include <deque>
23ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
24ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskinamespace llvm {
25ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
26ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LPPassManager;
27ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass Function;
28ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass PMStack;
29ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
30ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LoopPass : public Pass {
31ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic:
32ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  explicit LoopPass(char &pid) : Pass(PT_Loop, pid) {}
33ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
34ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// getPrinterPass - Get a pass to print the function corresponding
35ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// to a Loop.
36ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  Pass *createPrinterPass(raw_ostream &O, const std::string &Banner) const;
37ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
38ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // runOnLoop - This method should be implemented by the subclass to perform
39ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // whatever action is necessary for the specified Loop.
40ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual bool runOnLoop(Loop *L, LPPassManager &LPM) = 0;
41ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
42ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Initialization and finalization hooks.
43ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual bool doInitialization(Loop *L, LPPassManager &LPM) {
44ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    return false;
45ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  }
46ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
47ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Finalization hook does not supply Loop because at this time
48ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // loop nest is completely different.
49ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual bool doFinalization() { return false; }
50ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
51ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Check if this pass is suitable for the current LPPassManager, if
52ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // available. This pass P is not suitable for a LPPassManager if P
53ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // is not preserving higher level analysis info used by other
54ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // LPPassManager passes. In such case, pop LPPassManager from the
55ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // stack. This will force assignPassManager() to create new
56ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // LPPassManger as expected.
57ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void preparePassManager(PMStack &PMS);
58ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
59ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// Assign pass manager to manage this pass
60ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual void assignPassManager(PMStack &PMS,
61ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski                                 PassManagerType PMT);
62ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
63ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  ///  Return what kind of Pass Manager can manage this pass.
64ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual PassManagerType getPotentialPassManagerType() const {
65ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    return PMT_LoopPassManager;
66ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  }
67ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
68ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  //===--------------------------------------------------------------------===//
69ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// SimpleAnalysis - Provides simple interface to update analysis info
70ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// maintained by various passes. Note, if required this interface can
71ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// be extracted into a separate abstract class but it would require
72ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// additional use of multiple inheritance in Pass class hierarchy, something
73ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// we are trying to avoid.
74ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
75ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// Each loop pass can override these simple analysis hooks to update
76ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// desired analysis information.
77ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// cloneBasicBlockAnalysis - Clone analysis info associated with basic block.
78ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual void cloneBasicBlockAnalysis(BasicBlock *F, BasicBlock *T, Loop *L) {}
79ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
80ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// deleteAnalysisValue - Delete analysis info associated with value V.
81ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual void deleteAnalysisValue(Value *V, Loop *L) {}
82ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski};
83ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
84ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiclass LPPassManager : public FunctionPass, public PMDataManager {
85ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic:
86ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  static char ID;
87ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  explicit LPPassManager(int Depth);
88ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
89ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// run - Execute all of the passes scheduled for execution.  Keep track of
90ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// whether any of the passes modifies the module, and if so, return true.
91ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  bool runOnFunction(Function &F);
92ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
93ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// Pass Manager itself does not invalidate any analysis info.
94ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // LPPassManager needs LoopInfo.
95ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void getAnalysisUsage(AnalysisUsage &Info) const;
96ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
97ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual const char *getPassName() const {
98ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    return "Loop Pass Manager";
99ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  }
100ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
101ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual PMDataManager *getAsPMDataManager() { return this; }
102ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual Pass *getAsPass() { return this; }
103ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
104ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// Print passes managed by this manager
105ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void dumpPassStructure(unsigned Offset);
106ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
107ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  LoopPass *getContainedPass(unsigned N) {
108ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    assert(N < PassVector.size() && "Pass number out of range!");
109ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    LoopPass *LP = static_cast<LoopPass *>(PassVector[N]);
110ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    return LP;
111ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  }
112ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
113ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  virtual PassManagerType getPassManagerType() const {
114ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski    return PMT_LoopPassManager;
115ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  }
116ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
117ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskipublic:
118ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Delete loop from the loop queue and loop nest (LoopInfo).
119ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void deleteLoopFromQueue(Loop *L);
120ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
121ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Insert loop into the loop queue and add it as a child of the
122ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // given parent.
123ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void insertLoop(Loop *L, Loop *ParentLoop);
124ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
125ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Insert a loop into the loop queue.
126ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void insertLoopIntoQueue(Loop *L);
127ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
128ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // Reoptimize this loop. LPPassManager will re-insert this loop into the
129ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // queue. This allows LoopPass to change loop nest for the loop. This
130ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  // utility may send LPPassManager into infinite loops so use caution.
131ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void redoLoop(Loop *L);
132ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
133ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  //===--------------------------------------------------------------------===//
134ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// SimpleAnalysis - Provides simple interface to update analysis info
135ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// maintained by various passes. Note, if required this interface can
136ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// be extracted into a separate abstract class but it would require
137ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// additional use of multiple inheritance in Pass class hierarchy, something
138ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// we are trying to avoid.
139ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
140ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// cloneBasicBlockSimpleAnalysis - Invoke cloneBasicBlockAnalysis hook for
141ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// all passes that implement simple analysis interface.
142ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void cloneBasicBlockSimpleAnalysis(BasicBlock *From, BasicBlock *To, Loop *L);
143ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
144ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// deleteSimpleAnalysisValue - Invoke deleteAnalysisValue hook for all passes
145ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  /// that implement simple analysis interface.
146ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  void deleteSimpleAnalysisValue(Value *V, Loop *L);
147ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
148ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowskiprivate:
149ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  std::deque<Loop *> LQ;
150ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  bool skipThisLoop;
151ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  bool redoThisLoop;
152ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  LoopInfo *LI;
153ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski  Loop *CurrentLoop;
154ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski};
155ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
156ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski} // End llvm namespace
157ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski
158ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski#endif
159ed79165d195c99e5d8e283bb5bbf84c3363ae254Maksymilian Osowski