[llvm-commits] CVS: llvm/lib/Transforms/IPO/LoopExtractor.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Mar 14 14:02:02 PST 2004


Changes in directory llvm/lib/Transforms/IPO:

LoopExtractor.cpp updated: 1.5 -> 1.6

---
Log message:

Split into two passes.  Now there is the general loop extractor, usable on
the command line, and the single loop extractor, usable by bugpoint


---
Diffs of the changes:  (+24 -6)

Index: llvm/lib/Transforms/IPO/LoopExtractor.cpp
diff -u llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.5 llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.6
--- llvm/lib/Transforms/IPO/LoopExtractor.cpp:1.5	Sat Mar 13 22:17:53 2004
+++ llvm/lib/Transforms/IPO/LoopExtractor.cpp	Sun Mar 14 14:01:36 2004
@@ -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 @@
 
   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 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();
 }





More information about the llvm-commits mailing list