Dominators.cpp revision cd4abb7e6da68510be8a843013fe15176f91ec49
1//===- Dominators.cpp - Dominator Calculation -----------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements simple dominator construction algorithms for finding
11// forward dominators.  Postdominators are available in libanalysis, but are not
12// included in libvmcore, because it's not needed.  Forward dominators are
13// needed to support the Verifier pass.
14//
15//===----------------------------------------------------------------------===//
16
17#include "llvm/Analysis/Dominators.h"
18#include "llvm/Support/CFG.h"
19#include "llvm/Assembly/Writer.h"
20#include "llvm/ADT/DepthFirstIterator.h"
21#include "llvm/ADT/SetOperations.h"
22#include "llvm/ADT/SmallPtrSet.h"
23#include "llvm/Instructions.h"
24#include <algorithm>
25using namespace llvm;
26
27//===----------------------------------------------------------------------===//
28//  ImmediateDominators Implementation
29//===----------------------------------------------------------------------===//
30//
31// Immediate Dominators construction - This pass constructs immediate dominator
32// information for a flow-graph based on the algorithm described in this
33// document:
34//
35//   A Fast Algorithm for Finding Dominators in a Flowgraph
36//   T. Lengauer & R. Tarjan, ACM TOPLAS July 1979, pgs 121-141.
37//
38// This implements both the O(n*ack(n)) and the O(n*log(n)) versions of EVAL and
39// LINK, but it turns out that the theoretically slower O(n*log(n))
40// implementation is actually faster than the "efficient" algorithm (even for
41// large CFGs) because the constant overheads are substantially smaller.  The
42// lower-complexity version can be enabled with the following #define:
43//
44#define BALANCE_IDOM_TREE 0
45//
46//===----------------------------------------------------------------------===//
47
48static RegisterPass<ImmediateDominators>
49C("idom", "Immediate Dominators Construction", true);
50
51namespace {
52  class  DFCalculateWorkObject  {
53  public:
54    DFCalculateWorkObject(BasicBlock *B, BasicBlock *P,
55                          const DominatorTree::Node *N,
56                          const DominatorTree::Node *PN)
57      : currentBB(B), parentBB(P), Node(N), parentNode(PN) {}
58    BasicBlock *currentBB;
59    BasicBlock *parentBB;
60    const DominatorTree::Node *Node;
61    const DominatorTree::Node *parentNode;
62  };
63}
64unsigned ImmediateDominators::DFSPass(BasicBlock *V, InfoRec &VInfo,
65                                      unsigned N) {
66  VInfo.Semi = ++N;
67  VInfo.Label = V;
68
69  Vertex.push_back(V);        // Vertex[n] = V;
70  //Info[V].Ancestor = 0;     // Ancestor[n] = 0
71  //Child[V] = 0;             // Child[v] = 0
72  VInfo.Size = 1;             // Size[v] = 1
73
74  for (succ_iterator SI = succ_begin(V), E = succ_end(V); SI != E; ++SI) {
75    InfoRec &SuccVInfo = Info[*SI];
76    if (SuccVInfo.Semi == 0) {
77      SuccVInfo.Parent = V;
78      N = DFSPass(*SI, SuccVInfo, N);
79    }
80  }
81  return N;
82}
83
84void ImmediateDominators::Compress(BasicBlock *V, InfoRec &VInfo) {
85  BasicBlock *VAncestor = VInfo.Ancestor;
86  InfoRec &VAInfo = Info[VAncestor];
87  if (VAInfo.Ancestor == 0)
88    return;
89
90  Compress(VAncestor, VAInfo);
91
92  BasicBlock *VAncestorLabel = VAInfo.Label;
93  BasicBlock *VLabel = VInfo.Label;
94  if (Info[VAncestorLabel].Semi < Info[VLabel].Semi)
95    VInfo.Label = VAncestorLabel;
96
97  VInfo.Ancestor = VAInfo.Ancestor;
98}
99
100BasicBlock *ImmediateDominators::Eval(BasicBlock *V) {
101  InfoRec &VInfo = Info[V];
102#if !BALANCE_IDOM_TREE
103  // Higher-complexity but faster implementation
104  if (VInfo.Ancestor == 0)
105    return V;
106  Compress(V, VInfo);
107  return VInfo.Label;
108#else
109  // Lower-complexity but slower implementation
110  if (VInfo.Ancestor == 0)
111    return VInfo.Label;
112  Compress(V, VInfo);
113  BasicBlock *VLabel = VInfo.Label;
114
115  BasicBlock *VAncestorLabel = Info[VInfo.Ancestor].Label;
116  if (Info[VAncestorLabel].Semi >= Info[VLabel].Semi)
117    return VLabel;
118  else
119    return VAncestorLabel;
120#endif
121}
122
123void ImmediateDominators::Link(BasicBlock *V, BasicBlock *W, InfoRec &WInfo){
124#if !BALANCE_IDOM_TREE
125  // Higher-complexity but faster implementation
126  WInfo.Ancestor = V;
127#else
128  // Lower-complexity but slower implementation
129  BasicBlock *WLabel = WInfo.Label;
130  unsigned WLabelSemi = Info[WLabel].Semi;
131  BasicBlock *S = W;
132  InfoRec *SInfo = &Info[S];
133
134  BasicBlock *SChild = SInfo->Child;
135  InfoRec *SChildInfo = &Info[SChild];
136
137  while (WLabelSemi < Info[SChildInfo->Label].Semi) {
138    BasicBlock *SChildChild = SChildInfo->Child;
139    if (SInfo->Size+Info[SChildChild].Size >= 2*SChildInfo->Size) {
140      SChildInfo->Ancestor = S;
141      SInfo->Child = SChild = SChildChild;
142      SChildInfo = &Info[SChild];
143    } else {
144      SChildInfo->Size = SInfo->Size;
145      S = SInfo->Ancestor = SChild;
146      SInfo = SChildInfo;
147      SChild = SChildChild;
148      SChildInfo = &Info[SChild];
149    }
150  }
151
152  InfoRec &VInfo = Info[V];
153  SInfo->Label = WLabel;
154
155  assert(V != W && "The optimization here will not work in this case!");
156  unsigned WSize = WInfo.Size;
157  unsigned VSize = (VInfo.Size += WSize);
158
159  if (VSize < 2*WSize)
160    std::swap(S, VInfo.Child);
161
162  while (S) {
163    SInfo = &Info[S];
164    SInfo->Ancestor = V;
165    S = SInfo->Child;
166  }
167#endif
168}
169
170
171
172bool ImmediateDominators::runOnFunction(Function &F) {
173  IDoms.clear();     // Reset from the last time we were run...
174  BasicBlock *Root = &F.getEntryBlock();
175  Roots.clear();
176  Roots.push_back(Root);
177
178  Vertex.push_back(0);
179
180  // Step #1: Number blocks in depth-first order and initialize variables used
181  // in later stages of the algorithm.
182  unsigned N = 0;
183  for (unsigned i = 0, e = Roots.size(); i != e; ++i)
184    N = DFSPass(Roots[i], Info[Roots[i]], 0);
185
186  for (unsigned i = N; i >= 2; --i) {
187    BasicBlock *W = Vertex[i];
188    InfoRec &WInfo = Info[W];
189
190    // Step #2: Calculate the semidominators of all vertices
191    for (pred_iterator PI = pred_begin(W), E = pred_end(W); PI != E; ++PI)
192      if (Info.count(*PI)) {  // Only if this predecessor is reachable!
193        unsigned SemiU = Info[Eval(*PI)].Semi;
194        if (SemiU < WInfo.Semi)
195          WInfo.Semi = SemiU;
196      }
197
198    Info[Vertex[WInfo.Semi]].Bucket.push_back(W);
199
200    BasicBlock *WParent = WInfo.Parent;
201    Link(WParent, W, WInfo);
202
203    // Step #3: Implicitly define the immediate dominator of vertices
204    std::vector<BasicBlock*> &WParentBucket = Info[WParent].Bucket;
205    while (!WParentBucket.empty()) {
206      BasicBlock *V = WParentBucket.back();
207      WParentBucket.pop_back();
208      BasicBlock *U = Eval(V);
209      IDoms[V] = Info[U].Semi < Info[V].Semi ? U : WParent;
210    }
211  }
212
213  // Step #4: Explicitly define the immediate dominator of each vertex
214  for (unsigned i = 2; i <= N; ++i) {
215    BasicBlock *W = Vertex[i];
216    BasicBlock *&WIDom = IDoms[W];
217    if (WIDom != Vertex[Info[W].Semi])
218      WIDom = IDoms[WIDom];
219  }
220
221  // Free temporary memory used to construct idom's
222  Info.clear();
223  std::vector<BasicBlock*>().swap(Vertex);
224
225  return false;
226}
227
228/// dominates - Return true if A dominates B.
229///
230bool ImmediateDominatorsBase::dominates(BasicBlock *A, BasicBlock *B) const {
231  assert(A && B && "Null pointers?");
232
233  // Walk up the dominator tree from B to determine if A dom B.
234  while (A != B && B)
235    B = get(B);
236  return A == B;
237}
238
239void ImmediateDominatorsBase::print(std::ostream &o, const Module* ) const {
240  Function *F = getRoots()[0]->getParent();
241  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
242    o << "  Immediate Dominator For Basic Block:";
243    WriteAsOperand(o, I, false);
244    o << " is:";
245    if (BasicBlock *ID = get(I))
246      WriteAsOperand(o, ID, false);
247    else
248      o << " <<exit node>>";
249    o << "\n";
250  }
251  o << "\n";
252}
253
254namespace llvm {
255static std::ostream &operator<<(std::ostream &o,
256                                const std::set<BasicBlock*> &BBs) {
257  for (std::set<BasicBlock*>::const_iterator I = BBs.begin(), E = BBs.end();
258       I != E; ++I)
259    if (*I)
260      WriteAsOperand(o, *I, false);
261    else
262      o << " <<exit node>>";
263  return o;
264}
265}
266
267//===----------------------------------------------------------------------===//
268//  DominatorTree Implementation
269//===----------------------------------------------------------------------===//
270
271static RegisterPass<DominatorTree>
272E("domtree", "Dominator Tree Construction", true);
273
274// DominatorTreeBase::reset - Free all of the tree node memory.
275//
276void DominatorTreeBase::reset() {
277  for (NodeMapType::iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I)
278    delete I->second;
279  Nodes.clear();
280  RootNode = 0;
281}
282
283void DominatorTreeBase::Node::setIDom(Node *NewIDom) {
284  assert(IDom && "No immediate dominator?");
285  if (IDom != NewIDom) {
286    std::vector<Node*>::iterator I =
287      std::find(IDom->Children.begin(), IDom->Children.end(), this);
288    assert(I != IDom->Children.end() &&
289           "Not in immediate dominator children set!");
290    // I am no longer your child...
291    IDom->Children.erase(I);
292
293    // Switch to new dominator
294    IDom = NewIDom;
295    IDom->Children.push_back(this);
296  }
297}
298
299DominatorTreeBase::Node *DominatorTree::getNodeForBlock(BasicBlock *BB) {
300  Node *&BBNode = Nodes[BB];
301  if (BBNode) return BBNode;
302
303  // Haven't calculated this node yet?  Get or calculate the node for the
304  // immediate dominator.
305  BasicBlock *IDom = getAnalysis<ImmediateDominators>()[BB];
306  Node *IDomNode = getNodeForBlock(IDom);
307
308  // Add a new tree node for this BasicBlock, and link it as a child of
309  // IDomNode
310  return BBNode = IDomNode->addChild(new Node(BB, IDomNode));
311}
312
313void DominatorTree::calculate(const ImmediateDominators &ID) {
314  assert(Roots.size() == 1 && "DominatorTree should have 1 root block!");
315  BasicBlock *Root = Roots[0];
316  Nodes[Root] = RootNode = new Node(Root, 0); // Add a node for the root...
317
318  Function *F = Root->getParent();
319  // Loop over all of the reachable blocks in the function...
320  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
321    if (BasicBlock *ImmDom = ID.get(I)) {  // Reachable block.
322      Node *&BBNode = Nodes[I];
323      if (!BBNode) {  // Haven't calculated this node yet?
324        // Get or calculate the node for the immediate dominator
325        Node *IDomNode = getNodeForBlock(ImmDom);
326
327        // Add a new tree node for this BasicBlock, and link it as a child of
328        // IDomNode
329        BBNode = IDomNode->addChild(new Node(I, IDomNode));
330      }
331    }
332}
333
334static std::ostream &operator<<(std::ostream &o,
335                                const DominatorTreeBase::Node *Node) {
336  if (Node->getBlock())
337    WriteAsOperand(o, Node->getBlock(), false);
338  else
339    o << " <<exit node>>";
340  return o << "\n";
341}
342
343static void PrintDomTree(const DominatorTreeBase::Node *N, std::ostream &o,
344                         unsigned Lev) {
345  o << std::string(2*Lev, ' ') << "[" << Lev << "] " << N;
346  for (DominatorTreeBase::Node::const_iterator I = N->begin(), E = N->end();
347       I != E; ++I)
348    PrintDomTree(*I, o, Lev+1);
349}
350
351void DominatorTreeBase::print(std::ostream &o, const Module* ) const {
352  o << "=============================--------------------------------\n"
353    << "Inorder Dominator Tree:\n";
354  PrintDomTree(getRootNode(), o, 1);
355}
356
357
358//===----------------------------------------------------------------------===//
359//  DominanceFrontier Implementation
360//===----------------------------------------------------------------------===//
361
362static RegisterPass<DominanceFrontier>
363G("domfrontier", "Dominance Frontier Construction", true);
364
365const DominanceFrontier::DomSetType &
366DominanceFrontier::calculate(const DominatorTree &DT,
367                             const DominatorTree::Node *Node) {
368  BasicBlock *BB = Node->getBlock();
369  DomSetType *Result = NULL;
370
371  std::vector<DFCalculateWorkObject> workList;
372  SmallPtrSet<BasicBlock *, 32> visited;
373
374  workList.push_back(DFCalculateWorkObject(BB, NULL, Node, NULL));
375  do {
376    DFCalculateWorkObject *currentW = &workList.back();
377    assert (currentW && "Missing work object.");
378
379    BasicBlock *currentBB = currentW->currentBB;
380    BasicBlock *parentBB = currentW->parentBB;
381    const DominatorTree::Node *currentNode = currentW->Node;
382    const DominatorTree::Node *parentNode = currentW->parentNode;
383    assert (currentBB && "Invalid work object. Missing current Basic Block");
384    assert (currentNode && "Invalid work object. Missing current Node");
385    DomSetType &S = Frontiers[currentBB];
386
387    // Visit each block only once.
388    if (visited.count(currentBB) == 0) {
389      visited.insert(currentBB);
390
391      // Loop over CFG successors to calculate DFlocal[currentNode]
392      for (succ_iterator SI = succ_begin(currentBB), SE = succ_end(currentBB);
393           SI != SE; ++SI) {
394        // Does Node immediately dominate this successor?
395        if (DT[*SI]->getIDom() != currentNode)
396          S.insert(*SI);
397      }
398    }
399
400    // At this point, S is DFlocal.  Now we union in DFup's of our children...
401    // Loop through and visit the nodes that Node immediately dominates (Node's
402    // children in the IDomTree)
403    bool visitChild = false;
404    for (DominatorTree::Node::const_iterator NI = currentNode->begin(),
405           NE = currentNode->end(); NI != NE; ++NI) {
406      DominatorTree::Node *IDominee = *NI;
407      BasicBlock *childBB = IDominee->getBlock();
408      if (visited.count(childBB) == 0) {
409        workList.push_back(DFCalculateWorkObject(childBB, currentBB, IDominee, currentNode));
410        visitChild = true;
411      }
412    }
413
414    // If all children are visited or there is any child then pop this block
415    // from the workList.
416    if (!visitChild) {
417
418      if (!parentBB) {
419        Result = &S;
420        break;
421      }
422
423      DomSetType::const_iterator CDFI = S.begin(), CDFE = S.end();
424      DomSetType &parentSet = Frontiers[parentBB];
425      for (; CDFI != CDFE; ++CDFI) {
426        if (!parentNode->properlyDominates(DT[*CDFI]))
427          parentSet.insert(*CDFI);
428      }
429      workList.pop_back();
430    }
431
432  } while (!workList.empty());
433
434  return *Result;
435}
436
437void DominanceFrontierBase::print(std::ostream &o, const Module* ) const {
438  for (const_iterator I = begin(), E = end(); I != E; ++I) {
439    o << "  DomFrontier for BB";
440    if (I->first)
441      WriteAsOperand(o, I->first, false);
442    else
443      o << " <<exit node>>";
444    o << " is:\t" << I->second << "\n";
445  }
446}
447
448//===----------------------------------------------------------------------===//
449// ETOccurrence Implementation
450//===----------------------------------------------------------------------===//
451
452void ETOccurrence::Splay() {
453  ETOccurrence *father;
454  ETOccurrence *grandfather;
455  int occdepth;
456  int fatherdepth;
457
458  while (Parent) {
459    occdepth = Depth;
460
461    father = Parent;
462    fatherdepth = Parent->Depth;
463    grandfather = father->Parent;
464
465    // If we have no grandparent, a single zig or zag will do.
466    if (!grandfather) {
467      setDepthAdd(fatherdepth);
468      MinOccurrence = father->MinOccurrence;
469      Min = father->Min;
470
471      // See what we have to rotate
472      if (father->Left == this) {
473        // Zig
474        father->setLeft(Right);
475        setRight(father);
476        if (father->Left)
477          father->Left->setDepthAdd(occdepth);
478      } else {
479        // Zag
480        father->setRight(Left);
481        setLeft(father);
482        if (father->Right)
483          father->Right->setDepthAdd(occdepth);
484      }
485      father->setDepth(-occdepth);
486      Parent = NULL;
487
488      father->recomputeMin();
489      return;
490    }
491
492    // If we have a grandfather, we need to do some
493    // combination of zig and zag.
494    int grandfatherdepth = grandfather->Depth;
495
496    setDepthAdd(fatherdepth + grandfatherdepth);
497    MinOccurrence = grandfather->MinOccurrence;
498    Min = grandfather->Min;
499
500    ETOccurrence *greatgrandfather = grandfather->Parent;
501
502    if (grandfather->Left == father) {
503      if (father->Left == this) {
504        // Zig zig
505        grandfather->setLeft(father->Right);
506        father->setLeft(Right);
507        setRight(father);
508        father->setRight(grandfather);
509
510        father->setDepth(-occdepth);
511
512        if (father->Left)
513          father->Left->setDepthAdd(occdepth);
514
515        grandfather->setDepth(-fatherdepth);
516        if (grandfather->Left)
517          grandfather->Left->setDepthAdd(fatherdepth);
518      } else {
519        // Zag zig
520        grandfather->setLeft(Right);
521        father->setRight(Left);
522        setLeft(father);
523        setRight(grandfather);
524
525        father->setDepth(-occdepth);
526        if (father->Right)
527          father->Right->setDepthAdd(occdepth);
528        grandfather->setDepth(-occdepth - fatherdepth);
529        if (grandfather->Left)
530          grandfather->Left->setDepthAdd(occdepth + fatherdepth);
531      }
532    } else {
533      if (father->Left == this) {
534        // Zig zag
535        grandfather->setRight(Left);
536        father->setLeft(Right);
537        setLeft(grandfather);
538        setRight(father);
539
540        father->setDepth(-occdepth);
541        if (father->Left)
542          father->Left->setDepthAdd(occdepth);
543        grandfather->setDepth(-occdepth - fatherdepth);
544        if (grandfather->Right)
545          grandfather->Right->setDepthAdd(occdepth + fatherdepth);
546      } else {              // Zag Zag
547        grandfather->setRight(father->Left);
548        father->setRight(Left);
549        setLeft(father);
550        father->setLeft(grandfather);
551
552        father->setDepth(-occdepth);
553        if (father->Right)
554          father->Right->setDepthAdd(occdepth);
555        grandfather->setDepth(-fatherdepth);
556        if (grandfather->Right)
557          grandfather->Right->setDepthAdd(fatherdepth);
558      }
559    }
560
561    // Might need one more rotate depending on greatgrandfather.
562    setParent(greatgrandfather);
563    if (greatgrandfather) {
564      if (greatgrandfather->Left == grandfather)
565        greatgrandfather->Left = this;
566      else
567        greatgrandfather->Right = this;
568
569    }
570    grandfather->recomputeMin();
571    father->recomputeMin();
572  }
573}
574
575//===----------------------------------------------------------------------===//
576// ETNode implementation
577//===----------------------------------------------------------------------===//
578
579void ETNode::Split() {
580  ETOccurrence *right, *left;
581  ETOccurrence *rightmost = RightmostOcc;
582  ETOccurrence *parent;
583
584  // Update the occurrence tree first.
585  RightmostOcc->Splay();
586
587  // Find the leftmost occurrence in the rightmost subtree, then splay
588  // around it.
589  for (right = rightmost->Right; right->Left; right = right->Left);
590
591  right->Splay();
592
593  // Start splitting
594  right->Left->Parent = NULL;
595  parent = ParentOcc;
596  parent->Splay();
597  ParentOcc = NULL;
598
599  left = parent->Left;
600  parent->Right->Parent = NULL;
601
602  right->setLeft(left);
603
604  right->recomputeMin();
605
606  rightmost->Splay();
607  rightmost->Depth = 0;
608  rightmost->Min = 0;
609
610  delete parent;
611
612  // Now update *our* tree
613
614  if (Father->Son == this)
615    Father->Son = Right;
616
617  if (Father->Son == this)
618    Father->Son = NULL;
619  else {
620    Left->Right = Right;
621    Right->Left = Left;
622  }
623  Left = Right = NULL;
624  Father = NULL;
625}
626
627void ETNode::setFather(ETNode *NewFather) {
628  ETOccurrence *rightmost;
629  ETOccurrence *leftpart;
630  ETOccurrence *NewFatherOcc;
631  ETOccurrence *temp;
632
633  // First update the path in the splay tree
634  NewFatherOcc = new ETOccurrence(NewFather);
635
636  rightmost = NewFather->RightmostOcc;
637  rightmost->Splay();
638
639  leftpart = rightmost->Left;
640
641  temp = RightmostOcc;
642  temp->Splay();
643
644  NewFatherOcc->setLeft(leftpart);
645  NewFatherOcc->setRight(temp);
646
647  temp->Depth++;
648  temp->Min++;
649  NewFatherOcc->recomputeMin();
650
651  rightmost->setLeft(NewFatherOcc);
652
653  if (NewFatherOcc->Min + rightmost->Depth < rightmost->Min) {
654    rightmost->Min = NewFatherOcc->Min + rightmost->Depth;
655    rightmost->MinOccurrence = NewFatherOcc->MinOccurrence;
656  }
657
658  delete ParentOcc;
659  ParentOcc = NewFatherOcc;
660
661  // Update *our* tree
662  ETNode *left;
663  ETNode *right;
664
665  Father = NewFather;
666  right = Father->Son;
667
668  if (right)
669    left = right->Left;
670  else
671    left = right = this;
672
673  left->Right = this;
674  right->Left = this;
675  Left = left;
676  Right = right;
677
678  Father->Son = this;
679}
680
681bool ETNode::Below(ETNode *other) {
682  ETOccurrence *up = other->RightmostOcc;
683  ETOccurrence *down = RightmostOcc;
684
685  if (this == other)
686    return true;
687
688  up->Splay();
689
690  ETOccurrence *left, *right;
691  left = up->Left;
692  right = up->Right;
693
694  if (!left)
695    return false;
696
697  left->Parent = NULL;
698
699  if (right)
700    right->Parent = NULL;
701
702  down->Splay();
703
704  if (left == down || left->Parent != NULL) {
705    if (right)
706      right->Parent = up;
707    up->setLeft(down);
708  } else {
709    left->Parent = up;
710
711    // If the two occurrences are in different trees, put things
712    // back the way they were.
713    if (right && right->Parent != NULL)
714      up->setRight(down);
715    else
716      up->setRight(right);
717    return false;
718  }
719
720  if (down->Depth <= 0)
721    return false;
722
723  return !down->Right || down->Right->Min + down->Depth >= 0;
724}
725
726ETNode *ETNode::NCA(ETNode *other) {
727  ETOccurrence *occ1 = RightmostOcc;
728  ETOccurrence *occ2 = other->RightmostOcc;
729
730  ETOccurrence *left, *right, *ret;
731  ETOccurrence *occmin;
732  int mindepth;
733
734  if (this == other)
735    return this;
736
737  occ1->Splay();
738  left = occ1->Left;
739  right = occ1->Right;
740
741  if (left)
742    left->Parent = NULL;
743
744  if (right)
745    right->Parent = NULL;
746  occ2->Splay();
747
748  if (left == occ2 || (left && left->Parent != NULL)) {
749    ret = occ2->Right;
750
751    occ1->setLeft(occ2);
752    if (right)
753      right->Parent = occ1;
754  } else {
755    ret = occ2->Left;
756
757    occ1->setRight(occ2);
758    if (left)
759      left->Parent = occ1;
760  }
761
762  if (occ2->Depth > 0) {
763    occmin = occ1;
764    mindepth = occ1->Depth;
765  } else {
766    occmin = occ2;
767    mindepth = occ2->Depth + occ1->Depth;
768  }
769
770  if (ret && ret->Min + occ1->Depth + occ2->Depth < mindepth)
771    return ret->MinOccurrence->OccFor;
772  else
773    return occmin->OccFor;
774}
775
776void ETNode::assignDFSNumber(int num) {
777  std::vector<ETNode *>  workStack;
778  std::set<ETNode *> visitedNodes;
779
780  workStack.push_back(this);
781  visitedNodes.insert(this);
782  this->DFSNumIn = num++;
783
784  while (!workStack.empty()) {
785    ETNode  *Node = workStack.back();
786
787    // If this is leaf node then set DFSNumOut and pop the stack
788    if (!Node->Son) {
789      Node->DFSNumOut = num++;
790      workStack.pop_back();
791      continue;
792    }
793
794    ETNode *son = Node->Son;
795
796    // Visit Node->Son first
797    if (visitedNodes.count(son) == 0) {
798      son->DFSNumIn = num++;
799      workStack.push_back(son);
800      visitedNodes.insert(son);
801      continue;
802    }
803
804    bool visitChild = false;
805    // Visit remaining children
806    for (ETNode *s = son->Right;  s != son && !visitChild; s = s->Right) {
807      if (visitedNodes.count(s) == 0) {
808        visitChild = true;
809        s->DFSNumIn = num++;
810        workStack.push_back(s);
811        visitedNodes.insert(s);
812      }
813    }
814
815    if (!visitChild) {
816      // If we reach here means all children are visited
817      Node->DFSNumOut = num++;
818      workStack.pop_back();
819    }
820  }
821}
822
823//===----------------------------------------------------------------------===//
824// ETForest implementation
825//===----------------------------------------------------------------------===//
826
827static RegisterPass<ETForest>
828D("etforest", "ET Forest Construction", true);
829
830void ETForestBase::reset() {
831  for (ETMapType::iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I)
832    delete I->second;
833  Nodes.clear();
834}
835
836void ETForestBase::updateDFSNumbers()
837{
838  int dfsnum = 0;
839  // Iterate over all nodes in depth first order.
840  for (unsigned i = 0, e = Roots.size(); i != e; ++i)
841    for (df_iterator<BasicBlock*> I = df_begin(Roots[i]),
842           E = df_end(Roots[i]); I != E; ++I) {
843      BasicBlock *BB = *I;
844      ETNode *ETN = getNode(BB);
845      if (ETN && !ETN->hasFather())
846        ETN->assignDFSNumber(dfsnum);
847  }
848  SlowQueries = 0;
849  DFSInfoValid = true;
850}
851
852// dominates - Return true if A dominates B. THis performs the
853// special checks necessary if A and B are in the same basic block.
854bool ETForestBase::dominates(Instruction *A, Instruction *B) {
855  BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
856  if (BBA != BBB) return dominates(BBA, BBB);
857
858  // Loop through the basic block until we find A or B.
859  BasicBlock::iterator I = BBA->begin();
860  for (; &*I != A && &*I != B; ++I) /*empty*/;
861
862  // It is not possible to determine dominance between two PHI nodes
863  // based on their ordering.
864  if (isa<PHINode>(A) && isa<PHINode>(B))
865    return false;
866
867  if(!IsPostDominators) {
868    // A dominates B if it is found first in the basic block.
869    return &*I == A;
870  } else {
871    // A post-dominates B if B is found first in the basic block.
872    return &*I == B;
873  }
874}
875
876ETNode *ETForest::getNodeForBlock(BasicBlock *BB) {
877  ETNode *&BBNode = Nodes[BB];
878  if (BBNode) return BBNode;
879
880  // Haven't calculated this node yet?  Get or calculate the node for the
881  // immediate dominator.
882  BasicBlock *IDom = getAnalysis<ImmediateDominators>()[BB];
883
884  // If we are unreachable, we may not have an immediate dominator.
885  if (!IDom)
886    return BBNode = new ETNode(BB);
887  else {
888    ETNode *IDomNode = getNodeForBlock(IDom);
889
890    // Add a new tree node for this BasicBlock, and link it as a child of
891    // IDomNode
892    BBNode = new ETNode(BB);
893    BBNode->setFather(IDomNode);
894    return BBNode;
895  }
896}
897
898void ETForest::calculate(const ImmediateDominators &ID) {
899  assert(Roots.size() == 1 && "ETForest should have 1 root block!");
900  BasicBlock *Root = Roots[0];
901  Nodes[Root] = new ETNode(Root); // Add a node for the root
902
903  Function *F = Root->getParent();
904  // Loop over all of the reachable blocks in the function...
905  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
906    if (BasicBlock *ImmDom = ID.get(I)) {  // Reachable block.
907      ETNode *&BBNode = Nodes[I];
908      if (!BBNode) {  // Haven't calculated this node yet?
909        // Get or calculate the node for the immediate dominator
910        ETNode *IDomNode =  getNodeForBlock(ImmDom);
911
912        // Add a new ETNode for this BasicBlock, and set it's parent
913        // to it's immediate dominator.
914        BBNode = new ETNode(I);
915        BBNode->setFather(IDomNode);
916      }
917    }
918
919  // Make sure we've got nodes around for every block
920  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
921    ETNode *&BBNode = Nodes[I];
922    if (!BBNode)
923      BBNode = new ETNode(I);
924  }
925
926  updateDFSNumbers ();
927}
928
929//===----------------------------------------------------------------------===//
930// ETForestBase Implementation
931//===----------------------------------------------------------------------===//
932
933void ETForestBase::addNewBlock(BasicBlock *BB, BasicBlock *IDom) {
934  ETNode *&BBNode = Nodes[BB];
935  assert(!BBNode && "BasicBlock already in ET-Forest");
936
937  BBNode = new ETNode(BB);
938  BBNode->setFather(getNode(IDom));
939  DFSInfoValid = false;
940}
941
942void ETForestBase::setImmediateDominator(BasicBlock *BB, BasicBlock *newIDom) {
943  assert(getNode(BB) && "BasicBlock not in ET-Forest");
944  assert(getNode(newIDom) && "IDom not in ET-Forest");
945
946  ETNode *Node = getNode(BB);
947  if (Node->hasFather()) {
948    if (Node->getFather()->getData<BasicBlock>() == newIDom)
949      return;
950    Node->Split();
951  }
952  Node->setFather(getNode(newIDom));
953  DFSInfoValid= false;
954}
955
956void ETForestBase::print(std::ostream &o, const Module *) const {
957  o << "=============================--------------------------------\n";
958  o << "ET Forest:\n";
959  o << "DFS Info ";
960  if (DFSInfoValid)
961    o << "is";
962  else
963    o << "is not";
964  o << " up to date\n";
965
966  Function *F = getRoots()[0]->getParent();
967  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) {
968    o << "  DFS Numbers For Basic Block:";
969    WriteAsOperand(o, I, false);
970    o << " are:";
971    if (ETNode *EN = getNode(I)) {
972      o << "In: " << EN->getDFSNumIn();
973      o << " Out: " << EN->getDFSNumOut() << "\n";
974    } else {
975      o << "No associated ETNode";
976    }
977    o << "\n";
978  }
979  o << "\n";
980}
981