Split into two passes. Now there is the general loop extractor, usable on

the command line, and the single loop extractor, usable by bugpoint


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12390 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2004-03-14 20:01:36 +00:00
parent 7bc91c62f0
commit 41bc0b069c

View File

@ -23,8 +23,14 @@
using namespace llvm;
namespace {
// FIXME: PassManager should allow Module passes to require FunctionPasses
// FIXME: This is not a function pass, but the PassManager doesn't allow
// Module passes to require FunctionPasses, so we can't get loop info if we're
// not a function pass.
struct LoopExtractor : public FunctionPass {
unsigned NumLoops;
LoopExtractor(unsigned numLoops = ~0) : NumLoops(numLoops) {}
virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
@ -35,6 +41,14 @@ namespace {
RegisterOpt<LoopExtractor>
X("loop-extract", "Extract loops into new functions");
/// SingleLoopExtractor - For bugpoint.
struct SingleLoopExtractor : public LoopExtractor {
SingleLoopExtractor() : LoopExtractor(1) {}
};
RegisterOpt<SingleLoopExtractor>
Y("loop-extract-single", "Extract at most one loop into a new function");
} // End anonymous namespace
bool LoopExtractor::runOnFunction(Function &F) {
@ -47,14 +61,18 @@ bool LoopExtractor::runOnFunction(Function &F) {
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)
for (LoopInfo::iterator i = LI.begin(), e = LI.end(); i != e; ++i) {
if (NumLoops == 0) return Changed;
--NumLoops;
Changed |= (ExtractLoop(*i) != 0);
}
return Changed;
}
/// createLoopExtractorPass
///
Pass* llvm::createLoopExtractorPass() {
return new LoopExtractor();
// createSingleLoopExtractorPass - This pass extracts one natural loop from the
// program into a function if it can. This is used by bugpoint.
//
Pass *llvm::createSingleLoopExtractorPass() {
return new SingleLoopExtractor();
}