FunctionPass's should not define their own 'run' method.
[oota-llvm.git] / lib / Transforms / IPO / LoopExtractor.cpp
1 //===- LoopExtractor.cpp - Extract each loop into a new function ----------===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // A pass wrapper around the ExtractLoop() scalar transformation to extract each
11 // top-level loop into its own new function. If the loop is the ONLY loop in a
12 // given function, it is not touched. This is a pass most useful for debugging
13 // via bugpoint.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #include "llvm/Transforms/IPO.h"
18 #include "llvm/Module.h"
19 #include "llvm/Pass.h"
20 #include "llvm/Analysis/LoopInfo.h"
21 #include "llvm/Transforms/Scalar.h"
22 #include "llvm/Transforms/Utils/FunctionUtils.h"
23 using namespace llvm;
24
25 namespace {
26   // FIXME: PassManager should allow Module passes to require FunctionPasses
27   struct LoopExtractor : public FunctionPass {
28     virtual bool runOnFunction(Function &F);
29     
30     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
31       AU.addRequired<LoopInfo>();
32       AU.addRequiredID(LoopSimplifyID);
33     }
34   };
35
36   RegisterOpt<LoopExtractor> 
37   X("loop-extract", "Extract loops into new functions");
38 } // End anonymous namespace 
39
40 bool LoopExtractor::runOnFunction(Function &F) {
41   std::cerr << F.getName() << "\n";
42
43   LoopInfo &LI = getAnalysis<LoopInfo>();
44
45   // We don't want to keep extracting the only loop of a function into a new one
46   if (LI.begin() == LI.end() || LI.begin() + 1 == LI.end())
47     return false;
48
49   bool Changed = false;
50
51   // Try to move each loop out of the code into separate function
52   for (LoopInfo::iterator i = LI.begin(), e = LI.end(); i != e; ++i)
53     Changed |= (ExtractLoop(*i) != 0);
54
55   return Changed;
56 }
57
58 /// createLoopExtractorPass 
59 ///
60 Pass* llvm::createLoopExtractorPass() {
61   return new LoopExtractor();
62 }