diff options
author | Devang Patel <dpatel@apple.com> | 2007-02-22 08:56:17 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-02-22 08:56:17 +0000 |
commit | 16a31c4ebf36d6520f18cebd8a6b248d18d10f97 (patch) | |
tree | 2d37c0b2083c07ca3a6e5a61783003d57dac6720 /include/llvm/Analysis/LoopPass.h | |
parent | 7d8012b602ee3456072bf61a10574d8753990eac (diff) | |
download | external_llvm-16a31c4ebf36d6520f18cebd8a6b248d18d10f97.zip external_llvm-16a31c4ebf36d6520f18cebd8a6b248d18d10f97.tar.gz external_llvm-16a31c4ebf36d6520f18cebd8a6b248d18d10f97.tar.bz2 |
Add Loop Pass Manager.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34487 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis/LoopPass.h')
-rw-r--r-- | include/llvm/Analysis/LoopPass.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/include/llvm/Analysis/LoopPass.h b/include/llvm/Analysis/LoopPass.h new file mode 100644 index 0000000..eb15373 --- /dev/null +++ b/include/llvm/Analysis/LoopPass.h @@ -0,0 +1,86 @@ +//===- LoopPass.h - LoopPass class ----------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by Devang Patel and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines LoopPass class. All loop optimization +// and transformation passes are derived from LoopPass. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LOOP_PASS_H +#define LLVM_LOOP_PASS_H + +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/Pass.h" +#include "llvm/PassManagers.h" +#include "llvm/Function.h" + +namespace llvm { + +class LPPassManager; +class Loop; +class Function; + +class LoopPass : public Pass { + + public: + // runOnLoop - THis method should be implemented by the subclass to perform + // whatever action is necessary for the specfied Loop. + virtual bool runOnLoop (Loop &L, LPPassManager &LPM) = 0; + virtual bool runOnFunctionBody (Function &F, LPPassManager &LPM) { + return false; + } + +}; + +class LPPassManager : public FunctionPass, public PMDataManager { + +public: + LPPassManager(int Depth) : PMDataManager(Depth) { } + + /// run - Execute all of the passes scheduled for execution. Keep track of + /// whether any of the passes modifies the module, and if so, return true. + bool runOnFunction(Function &F); + + /// Pass Manager itself does not invalidate any analysis info. + void getAnalysisUsage(AnalysisUsage &Info) const { + // LPPassManager needs LoopInfo. In the long term LoopInfo class will + // be consumed by LPPassManager. + Info.addRequired<LoopInfo>(); + Info.setPreservesAll(); + } + + virtual const char *getPassName() const { + return "Loop Pass Manager"; + } + + // Print passes managed by this manager + void dumpPassStructure(unsigned Offset) { + llvm::cerr << std::string(Offset*2, ' ') << "Loop Pass Manager\n"; + for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { + Pass *P = getContainedPass(Index); + P->dumpPassStructure(Offset + 1); + dumpLastUses(P, Offset+1); + } + } + + Pass *getContainedPass(unsigned N) { + assert ( N < PassVector.size() && "Pass number out of range!"); + Pass *FP = static_cast<Pass *>(PassVector[N]); + return FP; + } + + virtual PassManagerType getPassManagerType() { + return PMT_LoopPassManager; + } + +}; + +} // End llvm namespace + +#endif |