From 38fc88ee5d822c1775fca0bdb2bf3499dc50a481 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Thu, 1 Apr 2010 18:46:59 +0000 Subject: [PATCH] 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. llvm-svn: 100126 --- .../llvm/Transforms/Utils/SSAUpdater.h | 2 +- llvm/lib/Transforms/Utils/SSAUpdater.cpp | 38 +++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/SSAUpdater.h b/llvm/include/llvm/Transforms/Utils/SSAUpdater.h index 748ded30e7b3..f353840cd59a 100644 --- a/llvm/include/llvm/Transforms/Utils/SSAUpdater.h +++ b/llvm/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/llvm/lib/Transforms/Utils/SSAUpdater.cpp b/llvm/lib/Transforms/Utils/SSAUpdater.cpp index 20a92d690c27..1431a86f71a4 100644 --- a/llvm/lib/Transforms/Utils/SSAUpdater.cpp +++ b/llvm/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(PHI->getIncomingValue(i)); - if (!PHIVal) continue; - BasicBlock *Pred = PHIVal->getParent(); - ClearPHITags(Pred, (*BBMap)[Pred], PHIVal); + SmallVector 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(PHI->getIncomingValue(i)); + if (!IncomingVal) continue; + WorkList.push_back(IncomingVal); + } } }