00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef LLVM_LOOP_PASS_H
00016 #define LLVM_LOOP_PASS_H
00017
00018 #include "llvm/Analysis/LoopInfo.h"
00019 #include "llvm/Pass.h"
00020 #include "llvm/PassManagers.h"
00021 #include "llvm/Function.h"
00022
00023 namespace llvm {
00024
00025 class LPPassManager;
00026 class Function;
00027 class PMStack;
00028
00029 class LoopPass : public Pass {
00030 public:
00031 explicit LoopPass(intptr_t pid) : Pass(PT_Loop, pid) {}
00032 explicit LoopPass(void *pid) : Pass(PT_Loop, pid) {}
00033
00034
00035
00036 virtual bool runOnLoop(Loop *L, LPPassManager &LPM) = 0;
00037
00038
00039 virtual bool doInitialization(Loop *L, LPPassManager &LPM) {
00040 return false;
00041 }
00042
00043
00044
00045 virtual bool doFinalization() { return false; }
00046
00047
00048
00049
00050
00051
00052
00053 void preparePassManager(PMStack &PMS);
00054
00056 virtual void assignPassManager(PMStack &PMS,
00057 PassManagerType PMT = PMT_LoopPassManager);
00058
00060 virtual PassManagerType getPotentialPassManagerType() const {
00061 return PMT_LoopPassManager;
00062 }
00063
00064
00070
00074 virtual void cloneBasicBlockAnalysis(BasicBlock *F, BasicBlock *T, Loop *L) {}
00075
00077 virtual void deleteAnalysisValue(Value *V, Loop *L) {}
00078 };
00079
00080 class LPPassManager : public FunctionPass, public PMDataManager {
00081 public:
00082 static char ID;
00083 explicit LPPassManager(int Depth);
00084
00087 bool runOnFunction(Function &F);
00088
00090
00091 void getAnalysisUsage(AnalysisUsage &Info) const;
00092
00093 virtual const char *getPassName() const {
00094 return "Loop Pass Manager";
00095 }
00096
00097 virtual PMDataManager *getAsPMDataManager() { return this; }
00098 virtual Pass *getAsPass() { return this; }
00099
00101 void dumpPassStructure(unsigned Offset);
00102
00103 Pass *getContainedPass(unsigned N) {
00104 assert(N < PassVector.size() && "Pass number out of range!");
00105 Pass *FP = static_cast<Pass *>(PassVector[N]);
00106 return FP;
00107 }
00108
00109 virtual PassManagerType getPassManagerType() const {
00110 return PMT_LoopPassManager;
00111 }
00112
00113 public:
00114
00115 void deleteLoopFromQueue(Loop *L);
00116
00117
00118
00119 void insertLoop(Loop *L, Loop *ParentLoop);
00120
00121
00122 void insertLoopIntoQueue(Loop *L);
00123
00124
00125
00126
00127 void redoLoop(Loop *L);
00128
00129
00135
00138 void cloneBasicBlockSimpleAnalysis(BasicBlock *From, BasicBlock *To, Loop *L);
00139
00142 void deleteSimpleAnalysisValue(Value *V, Loop *L);
00143
00144 private:
00145 std::deque<Loop *> LQ;
00146 bool skipThisLoop;
00147 bool redoThisLoop;
00148 LoopInfo *LI;
00149 Loop *CurrentLoop;
00150 };
00151
00152 }
00153
00154 #endif