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); } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits