[llvm-commits] CVS: llvm/lib/Transforms/Scalar/LICM.cpp

Tanya Brethour tbrethou at niobe.cs.uiuc.edu
Tue Aug 5 15:40:01 PDT 2003


Changes in directory llvm/lib/Transforms/Scalar:

LICM.cpp updated: 1.29 -> 1.30

---
Log message:

Fixed minor bug in SafeToHoist and made some changes suggested by Chris.



---
Diffs of the changes:

Index: llvm/lib/Transforms/Scalar/LICM.cpp
diff -u llvm/lib/Transforms/Scalar/LICM.cpp:1.29 llvm/lib/Transforms/Scalar/LICM.cpp:1.30
--- llvm/lib/Transforms/Scalar/LICM.cpp:1.29	Tue Aug  5 13:45:46 2003
+++ llvm/lib/Transforms/Scalar/LICM.cpp	Tue Aug  5 15:39:02 2003
@@ -67,7 +67,7 @@
     BasicBlock *Preheader;   // The preheader block of the current loop...
     Loop *CurLoop;           // The current loop we are working on...
     AliasSetTracker *CurAST; // AliasSet information for the current loop...
-    DominatorTree *CurDT;    // Dominator Tree for the current Loop...
+    DominatorTree *DT;       // Dominator Tree for the current Loop...
 
     /// visitLoop - Hoist expressions out of the specified loop...    
     ///
@@ -173,6 +173,7 @@
   // Get our Loop and Alias Analysis information...
   LI = &getAnalysis<LoopInfo>();
   AA = &getAnalysis<AliasAnalysis>();
+  DT = &getAnalysis<DominatorTree>();
 
   // Hoist expressions out of all of the top-level loops.
   const std::vector<Loop*> &TopLevelLoops = LI->getTopLevelLoops();
@@ -223,9 +224,7 @@
   // that we are guaranteed to see definitions before we see uses.  This allows
   // us to perform the LICM transformation in one pass, without iteration.
   //
-  CurDT = &getAnalysis<DominatorTree>();
-  
-  HoistRegion(CurDT->getNode(L->getHeader()));
+  HoistRegion(DT->getNode(L->getHeader()));
 
   // Now that all loop invariants have been removed from the loop, promote any
   // memory references to scalars that we can...
@@ -290,36 +289,28 @@
     BasicBlock *InstBB = Inst.getParent();
     
     //Get the Dominator Tree Node for the instruction's basic block/
-    DominatorTree::Node *InstDTNode = CurDT->getNode(InstBB);
+    DominatorTree::Node *InstDTNode = DT->getNode(InstBB);
 
     //Get the exit blocks for the current loop.
-    const std::vector<BasicBlock* > ExitBlocks = CurLoop->getExitBlocks();
+    const std::vector<BasicBlock* > &ExitBlocks = CurLoop->getExitBlocks();
 
     //For each exit block, get the DT node and walk up the DT until
     //the instruction's basic block is found or we exit the loop.
     for(unsigned i=0; i < ExitBlocks.size(); ++i) {
-      DominatorTree::Node *IDom = CurDT->getNode(ExitBlocks[i]);
+      DominatorTree::Node *IDom = DT->getNode(ExitBlocks[i]);
       
-      //Using boolean variable because exit nodes are not "contained"
-      //in the loop, so can not use that as the while test condition
-      //for first pass.
-      bool inLoop = true;
-
-      while(inLoop) {
+      while(IDom != InstDTNode) {
  
-        //compare Instruction DT node to Current DT Node
-        if(IDom == InstDTNode)
-          return true;
-
         //Get next Immediate Dominator.
         IDom = IDom->getIDom();
 
         //See if we exited the loop.
-        inLoop = CurLoop->contains(IDom->getNode());
+        if(!CurLoop->contains(IDom->getNode()))
+          return false;
       }
-      return false;
     }
   }
+  
   return true;
 }
 





More information about the llvm-commits mailing list