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 | 0a7953734139c8c58678aef0bf7501b956590fb5 (patch) | |
| tree | 3ae2b104bbccdd527963fad625663c62fd4666f2 /llvm/lib/Analysis | |
| parent | 5f6c93701b4f45c2a303aa2afbf27ea3e4f3a025 (diff) | |
| download | bcm5719-llvm-0a7953734139c8c58678aef0bf7501b956590fb5.tar.gz bcm5719-llvm-0a7953734139c8c58678aef0bf7501b956590fb5.zip  | |
Fix DFS walk.
Fix http://llvm.org/bugs/show_bug.cgi?id=923
llvm-svn: 30630
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/PostDominators.cpp | 43 | 
1 files changed, 28 insertions, 15 deletions
diff --git a/llvm/lib/Analysis/PostDominators.cpp b/llvm/lib/Analysis/PostDominators.cpp index bfa152035e0..9f1f468abbe 100644 --- a/llvm/lib/Analysis/PostDominators.cpp +++ b/llvm/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;  }  | 

