File indexing completed on 2026-05-10 08:43:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_ANALYSIS_LOOPPASS_H
0015 #define LLVM_ANALYSIS_LOOPPASS_H
0016
0017 #include "llvm/IR/LegacyPassManagers.h"
0018 #include "llvm/Pass.h"
0019 #include <deque>
0020
0021 namespace llvm {
0022
0023 class Loop;
0024 class LoopInfo;
0025 class LPPassManager;
0026 class Function;
0027
0028 class LoopPass : public Pass {
0029 public:
0030 explicit LoopPass(char &pid) : Pass(PT_Loop, pid) {}
0031
0032
0033
0034 Pass *createPrinterPass(raw_ostream &O,
0035 const std::string &Banner) const override;
0036
0037
0038
0039 virtual bool runOnLoop(Loop *L, LPPassManager &LPM) = 0;
0040
0041 using llvm::Pass::doInitialization;
0042 using llvm::Pass::doFinalization;
0043
0044
0045 virtual bool doInitialization(Loop *L, LPPassManager &LPM) {
0046 return false;
0047 }
0048
0049
0050
0051 virtual bool doFinalization() { return false; }
0052
0053
0054
0055
0056
0057
0058
0059 void preparePassManager(PMStack &PMS) override;
0060
0061
0062 void assignPassManager(PMStack &PMS, PassManagerType PMT) override;
0063
0064
0065 PassManagerType getPotentialPassManagerType() const override {
0066 return PMT_LoopPassManager;
0067 }
0068
0069 protected:
0070
0071
0072
0073 bool skipLoop(const Loop *L) const;
0074 };
0075
0076 class LPPassManager : public FunctionPass, public PMDataManager {
0077 public:
0078 static char ID;
0079 explicit LPPassManager();
0080
0081
0082
0083 bool runOnFunction(Function &F) override;
0084
0085
0086
0087 void getAnalysisUsage(AnalysisUsage &Info) const override;
0088
0089 StringRef getPassName() const override { return "Loop Pass Manager"; }
0090
0091 PMDataManager *getAsPMDataManager() override { return this; }
0092 Pass *getAsPass() override { return this; }
0093
0094
0095 void dumpPassStructure(unsigned Offset) override;
0096
0097 LoopPass *getContainedPass(unsigned N) {
0098 assert(N < PassVector.size() && "Pass number out of range!");
0099 LoopPass *LP = static_cast<LoopPass *>(PassVector[N]);
0100 return LP;
0101 }
0102
0103 PassManagerType getPassManagerType() const override {
0104 return PMT_LoopPassManager;
0105 }
0106
0107 public:
0108
0109 void addLoop(Loop &L);
0110
0111
0112 void markLoopAsDeleted(Loop &L);
0113
0114 private:
0115 std::deque<Loop *> LQ;
0116 LoopInfo *LI;
0117 Loop *CurrentLoop;
0118 bool CurrentLoopDeleted;
0119 };
0120
0121
0122
0123
0124 struct LCSSAVerificationPass : public FunctionPass {
0125 static char ID;
0126 LCSSAVerificationPass();
0127
0128 bool runOnFunction(Function &F) override { return false; }
0129
0130 void getAnalysisUsage(AnalysisUsage &AU) const override {
0131 AU.setPreservesAll();
0132 }
0133 };
0134
0135 }
0136
0137 #endif