diff options
author | Bob Wilson <bob.wilson@apple.com> | 2010-04-01 18:46:59 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2010-04-01 18:46:59 +0000 |
commit | 44269f937ff72aba46fa351b861c021d3bb5ad7b (patch) | |
tree | b77655cf419e8836ad23e530d5f7c435da617786 | |
parent | 7fed26826a06a92975666b6a555af27261827a4a (diff) | |
download | external_llvm-44269f937ff72aba46fa351b861c021d3bb5ad7b.zip external_llvm-44269f937ff72aba46fa351b861c021d3bb5ad7b.tar.gz external_llvm-44269f937ff72aba46fa351b861c021d3bb5ad7b.tar.bz2 |
The SSAUpdater should avoid recursive traversals of the CFG, since that may
blow out the stack for really big functions. Start by fixing an easy case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100126 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Transforms/Utils/SSAUpdater.h | 2 | ||||
-rw-r--r-- | lib/Transforms/Utils/SSAUpdater.cpp | 38 |
2 files changed, 24 insertions, 16 deletions
diff --git a/include/llvm/Transforms/Utils/SSAUpdater.h b/include/llvm/Transforms/Utils/SSAUpdater.h index 748ded3..f353840 100644 --- a/include/llvm/Transforms/Utils/SSAUpdater.h +++ b/include/llvm/Transforms/Utils/SSAUpdater.h @@ -111,7 +111,7 @@ private: void FindExistingPHI(BasicBlock *BB, BBInfo *Info); bool CheckIfPHIMatches(BasicBlock *BB, BBInfo *Info, Value *Val); void RecordMatchingPHI(BasicBlock *BB, BBInfo *Info, PHINode *PHI); - void ClearPHITags(BasicBlock *BB, BBInfo *Info, PHINode *PHI); + void ClearPHITags(PHINode *PHI); void operator=(const SSAUpdater&); // DO NOT IMPLEMENT SSAUpdater(const SSAUpdater&); // DO NOT IMPLEMENT diff --git a/lib/Transforms/Utils/SSAUpdater.cpp b/lib/Transforms/Utils/SSAUpdater.cpp index 20a92d6..1431a86 100644 --- a/lib/Transforms/Utils/SSAUpdater.cpp +++ b/lib/Transforms/Utils/SSAUpdater.cpp @@ -427,7 +427,7 @@ void SSAUpdater::FindExistingPHI(BasicBlock *BB, BBInfo *Info) { RecordMatchingPHI(BB, Info, SomePHI); break; } - ClearPHITags(BB, Info, SomePHI); + ClearPHITags(SomePHI); } } @@ -490,20 +490,28 @@ void SSAUpdater::RecordMatchingPHI(BasicBlock *BB, BBInfo *Info, PHINode *PHI) { } /// ClearPHITags - When one of the existing PHI nodes fails to match, clear -/// the PHITag values stored in the BBMap while checking to see if it matched. -void SSAUpdater::ClearPHITags(BasicBlock *BB, BBInfo *Info, PHINode *PHI) { - if (!Info || Info->AvailableVal || !Info->PHITag) - return; - - // Clear the tag. - Info->PHITag = 0; - - // Iterate through the predecessors. +/// the PHITag values that were stored in the BBMap when checking to see if +/// it matched. +void SSAUpdater::ClearPHITags(PHINode *PHI) { BBMapTy *BBMap = getBBMap(BM); - for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) { - PHINode *PHIVal = dyn_cast<PHINode>(PHI->getIncomingValue(i)); - if (!PHIVal) continue; - BasicBlock *Pred = PHIVal->getParent(); - ClearPHITags(Pred, (*BBMap)[Pred], PHIVal); + SmallVector<PHINode*, 20> WorkList; + WorkList.push_back(PHI); + + while (!WorkList.empty()) { + PHI = WorkList.pop_back_val(); + BasicBlock *BB = PHI->getParent(); + BBInfo *Info = (*BBMap)[BB]; + if (!Info || Info->AvailableVal || !Info->PHITag) + continue; + + // Clear the tag. + Info->PHITag = 0; + + // Iterate through the PHI's incoming values. + for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i) { + PHINode *IncomingVal = dyn_cast<PHINode>(PHI->getIncomingValue(i)); + if (!IncomingVal) continue; + WorkList.push_back(IncomingVal); + } } } |