diff options
| author | Misha Brukman <brukman+llvm@gmail.com> | 2004-02-28 03:33:01 +0000 |
|---|---|---|
| committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-02-28 03:33:01 +0000 |
| commit | 03a11340ff6dec73ab8cb09261ae374ae4003417 (patch) | |
| tree | 22fc103e7683152d285adebd5155398873a13604 /llvm/lib/Transforms/Utils | |
| parent | caa1a5abeba40b8b747e1c38b466cc6230f8e8e0 (diff) | |
| download | bcm5719-llvm-03a11340ff6dec73ab8cb09261ae374ae4003417.tar.gz bcm5719-llvm-03a11340ff6dec73ab8cb09261ae374ae4003417.zip | |
A pass that uses the generic CodeExtractor to rip out *every* loop in every
function, as long as the loop isn't the only one in that function. This should
help debugging passes easier with BugPoint.
llvm-svn: 11936
Diffstat (limited to 'llvm/lib/Transforms/Utils')
| -rw-r--r-- | llvm/lib/Transforms/Utils/LoopExtractor.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopExtractor.cpp b/llvm/lib/Transforms/Utils/LoopExtractor.cpp new file mode 100644 index 00000000000..aae7ccbe480 --- /dev/null +++ b/llvm/lib/Transforms/Utils/LoopExtractor.cpp @@ -0,0 +1,69 @@ +//===- LoopExtractor.cpp - Extract each loop into a new function ----------===// +// +// A pass wrapper around the ExtractLoop() scalar transformation to extract each +// top-level loop into its own new function. If the loop is the ONLY loop in a +// given function, it is not touched. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Module.h" +#include "llvm/Pass.h" +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Utils/FunctionUtils.h" +#include <vector> +using namespace llvm; + +namespace { + +// FIXME: PassManager should allow Module passes to require FunctionPasses +struct LoopExtraction : public FunctionPass { + +public: + LoopExtractor() {} + virtual bool run(Module &M); + virtual bool runOnFunction(Function &F); + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<LoopInfo>(); + } + +}; + +RegisterOpt<LoopExtractor> +X("loop-extract", "Extract loops into new functions"); + +bool LoopExtractor::run(Module &M) { + bool Changed = false; + for (Module::iterator i = M.begin(), e = M.end(); i != e; ++i) + Changed |= runOnFunction(*i); + return Changed; +} + +bool LoopExtractor::runOnFunction(Function &F) { + std::cerr << F.getName() << "\n"; + + LoopInfo &LI = getAnalysis<LoopInfo>(); + + // We don't want to keep extracting the only loop of a function into a new one + if (LI.begin() == LI.end() || LI.begin() + 1 == LI.end()) + return false; + + bool Changed = false; + + // Try to move each loop out of the code into separate function + for (LoopInfo::iterator i = LI.begin(), e = LI.end(); i != e; ++i) + Changed |= (ExtractLoop(*i) != 0); + + return Changed; +} + + + +} // End anonymous namespace + +/// createLoopExtractorPass +/// +FunctionPass* llvm::createLoopExtractorPass() { + return new LoopExtractor; +} |

