diff options
author | Devang Patel <dpatel@apple.com> | 2006-09-27 17:18:05 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2006-09-27 17:18:05 +0000 |
commit | 79db5b7370142a97ec36fcae22ac3185b84cac47 (patch) | |
tree | a9476f5bb0f459cb7117660a540f3f30c871aedd /lib/Analysis/PostDominators.cpp | |
parent | 6c88e9b458648c1c0cdecfd03e8b85b3f7db2d25 (diff) | |
download | external_llvm-79db5b7370142a97ec36fcae22ac3185b84cac47.zip external_llvm-79db5b7370142a97ec36fcae22ac3185b84cac47.tar.gz external_llvm-79db5b7370142a97ec36fcae22ac3185b84cac47.tar.bz2 |
Fix DFS walk.
Fix http://llvm.org/bugs/show_bug.cgi?id=923
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30630 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/PostDominators.cpp')
-rw-r--r-- | lib/Analysis/PostDominators.cpp | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp index bfa1520..9f1f468 100644 --- a/lib/Analysis/PostDominators.cpp +++ b/lib/Analysis/PostDominators.cpp @@ -28,36 +28,49 @@ D("postidom", "Immediate Post-Dominators Construction", true); unsigned ImmediatePostDominators::DFSPass(BasicBlock *V, InfoRec &VInfo, unsigned N) { - std::vector<std::pair<BasicBlock *, InfoRec *> > workStack; + std::set<BasicBlock *> visited; workStack.push_back(std::make_pair(V, &VInfo)); do { BasicBlock *currentBB = workStack.back().first; InfoRec *currentVInfo = workStack.back().second; - workStack.pop_back(); - - currentVInfo->Semi = ++N; - currentVInfo->Label = currentBB; - Vertex.push_back(currentBB); // Vertex[n] = current; - // Info[currentBB].Ancestor = 0; - // Ancestor[n] = 0 - // Child[currentBB] = 0; - currentVInfo->Size = 1; // Size[currentBB] = 1 + // Visit each block only once. + if (visited.count(currentBB) == 0) { + + visited.insert(currentBB); + currentVInfo->Semi = ++N; + currentVInfo->Label = currentBB; + + Vertex.push_back(currentBB); // Vertex[n] = current; + // Info[currentBB].Ancestor = 0; + // Ancestor[n] = 0 + // Child[currentBB] = 0; + currentVInfo->Size = 1; // Size[currentBB] = 1 + } - // For PostDominators, we want to walk predecessors rather than successors - // as we do in forward Dominators. + // Visit children + bool visitChild = false; for (pred_iterator PI = pred_begin(currentBB), PE = pred_end(currentBB); - PI != PE; ++PI) { + PI != PE && !visitChild; ++PI) { InfoRec &SuccVInfo = Info[*PI]; if (SuccVInfo.Semi == 0) { SuccVInfo.Parent = currentBB; - - workStack.push_back(std::make_pair(*PI, &SuccVInfo)); + if (visited.count (*PI) == 0) { + workStack.push_back(std::make_pair(*PI, &SuccVInfo)); + visitChild = true; + } } } + + // If all children are visited or if this block has no child then pop this + // block out of workStack. + if (!visitChild) + workStack.pop_back(); + } while (!workStack.empty()); + return N; } |