[vmkit-commits] [vmkit] r83139 - /vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Sep 29 21:03:16 PDT 2009


Author: geoffray
Date: Tue Sep 29 23:03:15 2009
New Revision: 83139

URL: http://llvm.org/viewvc/llvm-project?rev=83139&view=rev
Log:
Inform the loop analysis that new blocks are in the loop when inserting a safe
point.


Modified:
    vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp

Modified: vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp?rev=83139&r1=83138&r2=83139&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp Tue Sep 29 23:03:15 2009
@@ -25,9 +25,14 @@
 
     virtual bool runOnLoop(Loop* L, LPPassManager& LPM);
 
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.addRequired<LoopInfo>();
+    }
+
+
   private:
     void insertSafePoint(BasicBlock* BB, Function* SafeFunction,
-                         Value* YieldPtr);
+                         Value* YieldPtr, Loop* L, LoopInfo* LI);
   };
 
   char LoopSafePoints::ID = 0;
@@ -35,9 +40,10 @@
                                  "Add safe points in loop headers");
 
 void LoopSafePoints::insertSafePoint(BasicBlock* BB, Function* SafeFunction,
-                                     Value* YieldPtr) {
+                                     Value* YieldPtr, Loop* L, LoopInfo* LI) {
   Instruction* I = BB->getFirstNonPHI();
   BasicBlock* NBB = BB->splitBasicBlock(I);
+  L->addBasicBlockToLoop(NBB, LI->getBase());
 
   NBB = NBB->getSinglePredecessor();
   I = NBB->getTerminator();
@@ -47,14 +53,20 @@
   Value* Ld = new LoadInst(YieldPtr, "", NBB);
   BasicBlock* yield = BasicBlock::Create(SafeFunction->getContext(), "",
                                          BB->getParent());
+  
   BranchInst::Create(yield, SU, Ld, NBB);
 
   CallInst::Create(SafeFunction, "", yield);
   BranchInst::Create(SU, yield);
+
+  L->addBasicBlockToLoop(yield, LI->getBase());
+
 }
 
+
 bool LoopSafePoints::runOnLoop(Loop* L, LPPassManager& LPM) {
- 
+
+  LoopInfo* LI = &getAnalysis<LoopInfo>();
   BasicBlock* Header = L->getHeader();
   Function *F = Header->getParent();  
   Function* SafeFunction =
@@ -101,18 +113,18 @@
       bool containsSecond = L->contains(Second);
 
       if (!containsFirst) {
-        insertSafePoint(Second, SafeFunction, YieldPtr);
+        insertSafePoint(Second, SafeFunction, YieldPtr, L, LI);
         return true;
       }
       
       if (!containsSecond) {
-        insertSafePoint(First, SafeFunction, YieldPtr);
+        insertSafePoint(First, SafeFunction, YieldPtr, L, LI);
         return true;
       }
     }
   }
   
-  insertSafePoint(Header, SafeFunction, YieldPtr);
+  insertSafePoint(Header, SafeFunction, YieldPtr, L, LI);
   return true;
 }
 





More information about the vmkit-commits mailing list