aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2010-04-01 18:46:59 +0000
committerBob Wilson <bob.wilson@apple.com>2010-04-01 18:46:59 +0000
commite8b64281ce79b804df613acc673f49f364631a63 (patch)
treeb77655cf419e8836ad23e530d5f7c435da617786
parent94107ba9ceaa199f8e5c03912511b0619c84226d (diff)
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.h2
-rw-r--r--lib/Transforms/Utils/SSAUpdater.cpp38
2 files changed, 24 insertions, 16 deletions
diff --git a/include/llvm/Transforms/Utils/SSAUpdater.h b/include/llvm/Transforms/Utils/SSAUpdater.h
index 748ded30e7..f353840cd5 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 20a92d690c..1431a86f71 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);
+ }
}
}