From 03a11340ff6dec73ab8cb09261ae374ae4003417 Mon Sep 17 00:00:00 2001 From: Misha Brukman Date: Sat, 28 Feb 2004 03:33:01 +0000 Subject: [PATCH] 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 --- llvm/lib/Transforms/Utils/LoopExtractor.cpp | 69 +++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 llvm/lib/Transforms/Utils/LoopExtractor.cpp diff --git a/llvm/lib/Transforms/Utils/LoopExtractor.cpp b/llvm/lib/Transforms/Utils/LoopExtractor.cpp new file mode 100644 index 000000000000..aae7ccbe4804 --- /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 +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(); + } + +}; + +RegisterOpt +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(); + + // 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; +}