[llvm-commits] CVS: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp

Devang Patel dpatel at apple.com
Fri Mar 9 15:39:31 PST 2007



Changes in directory llvm/lib/Transforms/Utils:

PromoteMemoryToRegister.cpp updated: 1.93 -> 1.94
---
Log message:

Avoid recursion. Use iterative algorithm for RenamePass().


---
Diffs of the changes:  (+31 -4)

 PromoteMemoryToRegister.cpp |   35 +++++++++++++++++++++++++++++++----
 1 files changed, 31 insertions(+), 4 deletions(-)


Index: llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
diff -u llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.93 llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.94
--- llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1.93	Tue Feb  6 19:15:04 2007
+++ llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp	Fri Mar  9 17:39:14 2007
@@ -72,6 +72,17 @@
 }
 
 namespace {
+
+  // Data package used by RenamePass()
+  class VISIBILITY_HIDDEN RenamePassData {
+  public:
+    RenamePassData(BasicBlock *B, BasicBlock *P,
+                   std::vector<Value *> V) : BB(B), Pred(P), Values(V) {}
+    BasicBlock *BB;
+    BasicBlock *Pred;
+    std::vector<Value *> Values;
+  };
+
   struct VISIBILITY_HIDDEN PromoteMem2Reg {
     /// Allocas - The alloca instructions being promoted.
     ///
@@ -111,6 +122,9 @@
     /// non-determinstic behavior.
     DenseMap<BasicBlock*, unsigned> BBNumbers;
 
+    /// RenamePassWorkList - Worklist used by RenamePass()
+    std::vector<RenamePassData *> RenamePassWorkList;
+
   public:
     PromoteMem2Reg(const std::vector<AllocaInst*> &A,
                    SmallVector<AllocaInst*, 16> &Retry, DominatorTree &dt,
@@ -146,6 +160,7 @@
     bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version,
                       SmallPtrSet<PHINode*, 16> &InsertedPHINodes);
   };
+
 }  // end of anonymous namespace
 
 void PromoteMem2Reg::run() {
@@ -391,8 +406,17 @@
   // Walks all basic blocks in the function performing the SSA rename algorithm
   // and inserting the phi nodes we marked as necessary
   //
-  RenamePass(F.begin(), 0, Values);
-
+  //RenamePass(F.begin(), 0, Values);
+  RenamePassWorkList.clear();
+  RenamePassData *RPD = new RenamePassData(F.begin(), 0, Values);
+  RenamePassWorkList.push_back(RPD);
+  while(!RenamePassWorkList.empty()) {
+    RenamePassData *RPD = RenamePassWorkList.back(); RenamePassWorkList.pop_back();
+    // RenamePass may add new worklist entries.
+    RenamePass(RPD->BB, RPD->Pred, RPD->Values);
+    delete RPD;
+  }
+  
   // The renamer uses the Visited set to avoid infinite loops.  Clear it now.
   Visited.clear();
 
@@ -772,8 +796,11 @@
   // Recurse to our successors.
   TerminatorInst *TI = BB->getTerminator();
   for (unsigned i = 0; i != TI->getNumSuccessors(); i++) {
-    std::vector<Value*> OutgoingVals(IncomingVals);
-    RenamePass(TI->getSuccessor(i), BB, OutgoingVals);
+    RenamePassData *RPD = new RenamePassData(TI->getSuccessor(i), BB,
+                                             IncomingVals);
+    RenamePassWorkList.push_back(RPD);
+    //    std::vector<Value*> OutgoingVals(IncomingVals);
+    //    RenamePass(TI->getSuccessor(i), BB, OutgoingVals);
   }
 }
 






More information about the llvm-commits mailing list