diff options
author | Chris Lattner <sabre@nondot.org> | 2004-03-14 02:32:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-03-14 02:32:27 +0000 |
commit | c3c8703c3bf0d4fff3420ee3ce00caea992a354c (patch) | |
tree | 3f196f9a88f48e79cdf4366bac2bbc38bf66f325 /lib/Transforms/IPO | |
parent | 2ed306362540a2a44fe4fdda6fa0af137925dd7c (diff) | |
download | external_llvm-c3c8703c3bf0d4fff3420ee3ce00caea992a354c.zip external_llvm-c3c8703c3bf0d4fff3420ee3ce00caea992a354c.tar.gz external_llvm-c3c8703c3bf0d4fff3420ee3ce00caea992a354c.tar.bz2 |
Move to the IPO library. Utils shouldn't contain passes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12372 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO')
-rw-r--r-- | lib/Transforms/IPO/LoopExtractor.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/LoopExtractor.cpp b/lib/Transforms/IPO/LoopExtractor.cpp new file mode 100644 index 0000000..3eda452 --- /dev/null +++ b/lib/Transforms/IPO/LoopExtractor.cpp @@ -0,0 +1,68 @@ +//===- 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. This is a pass most useful for debugging +// via bugpoint. +// +//===----------------------------------------------------------------------===// + +#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 LoopExtractor : 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(); +} |