00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef LLVM_REGION_PASS_H
00017 #define LLVM_REGION_PASS_H
00018
00019 #include "llvm/Analysis/RegionInfo.h"
00020
00021 #include "llvm/Pass.h"
00022 #include "llvm/PassManagers.h"
00023 #include "llvm/Function.h"
00024
00025 namespace llvm {
00026
00027 class RGPassManager;
00028 class Function;
00029 class PMStack;
00030
00031 class RegionPass : public Pass {
00032 public:
00033 explicit RegionPass(intptr_t pid) : Pass(PT_Region, pid) {}
00034 explicit RegionPass(void *pid) : Pass(PT_Region, pid) {}
00035
00038 virtual bool runOnRegion(Region *R, RGPassManager &RGM) = 0;
00039
00041 virtual bool doInitialization(Region *R, RGPassManager &RGM) {
00042 return false;
00043 }
00044
00045 virtual bool doFinalization() { return false; }
00046
00047 void preparePassManager(PMStack &PMS);
00048
00049 virtual void assignPassManager(PMStack &PMS,
00050 PassManagerType PMT = PMT_RegionPassManager);
00051
00053 virtual PassManagerType getPotentialPassManagerType() const {
00054 return PMT_RegionPassManager;
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00067 virtual void cloneBasicBlockAnalysis(BasicBlock *F, BasicBlock *T,
00068 Region *R) {}
00069
00071 virtual void deleteAnalysisValue(Value *V, Region *R) {}
00072 };
00073
00074 class RGPassManager : public FunctionPass, public PMDataManager {
00075 public:
00076 static char ID;
00077 explicit RGPassManager(int Depth);
00078
00082 bool runOnFunction(Function &F);
00083
00086 void getAnalysisUsage(AnalysisUsage &Info) const;
00087
00088 virtual const char *getPassName() const {
00089 return "Region Pass Manager";
00090 }
00091
00092 virtual PMDataManager *getAsPMDataManager() { return this; }
00093 virtual Pass *getAsPass() { return this; }
00094
00096 void dumpPassStructure(unsigned Offset);
00097
00098 Pass *getContainedPass(unsigned N) {
00099 assert(N < PassVector.size() && "Pass number out of range!");
00100 Pass *FP = static_cast<Pass *>(PassVector[N]);
00101 return FP;
00102 }
00103
00104 virtual PassManagerType getPassManagerType() const {
00105 return PMT_RegionPassManager;
00106 }
00107
00108 public:
00110 void deleteRegionFromQueue(Region *R);
00111
00113 void deleteRegionAndParentsFromQueue(Region *R);
00114
00117 void insertRegion(Region *R, Region *ParentRegion);
00118
00120 void insertRegionIntoQueue(Region *R);
00121
00125 void redoRegion(Region *R);
00126
00127
00128
00129
00130
00131
00132
00133
00134
00137 void cloneBasicBlockSimpleAnalysis(BasicBlock *From, BasicBlock *To,
00138 Region *R);
00139
00142 void deleteSimpleAnalysisValue(Value *V, Region *R);
00143
00144 private:
00145 std::deque<Region *> RQ;
00146 bool skipThisRegion;
00147 bool redoThisRegion;
00148 RegionInfo *RI;
00149 Region *CurrentRegion;
00150 };
00151
00152 }
00153
00154 #endif