1 //===- Dominators.cpp - Dominator Calculation -----------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
15 //===----------------------------------------------------------------------===//
17 #include "llvm/Analysis/Dominators.h"
18 #include "llvm/Support/CFG.h"
19 #include "llvm/Support/Compiler.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/ADT/DepthFirstIterator.h"
22 #include "llvm/ADT/SmallPtrSet.h"
23 #include "llvm/ADT/SmallVector.h"
24 #include "llvm/Analysis/DominatorInternals.h"
25 #include "llvm/Assembly/Writer.h"
26 #include "llvm/Instructions.h"
27 #include "llvm/Support/raw_ostream.h"
28 #include "llvm/Support/CommandLine.h"
32 // Always verify dominfo if expensive checking is enabled.
34 static bool VerifyDomInfo
= true;
36 static bool VerifyDomInfo
= false;
38 static cl::opt
<bool,true>
39 VerifyDomInfoX("verify-dom-info", cl::location(VerifyDomInfo
),
40 cl::desc("Verify dominator info (time consuming)"));
42 //===----------------------------------------------------------------------===//
43 // DominatorTree Implementation
44 //===----------------------------------------------------------------------===//
46 // Provide public access to DominatorTree information. Implementation details
47 // can be found in DominatorInternals.h.
49 //===----------------------------------------------------------------------===//
51 TEMPLATE_INSTANTIATION(class llvm::DomTreeNodeBase
<BasicBlock
>);
52 TEMPLATE_INSTANTIATION(class llvm::DominatorTreeBase
<BasicBlock
>);
54 char DominatorTree::ID
= 0;
55 INITIALIZE_PASS(DominatorTree
, "domtree",
56 "Dominator Tree Construction", true, true)
58 bool DominatorTree::runOnFunction(Function
&F
) {
63 void DominatorTree::verifyAnalysis() const {
64 if (!VerifyDomInfo
) return;
66 Function
&F
= *getRoot()->getParent();
68 DominatorTree OtherDT
;
69 OtherDT
.getBase().recalculate(F
);
70 if (compare(OtherDT
)) {
71 errs() << "DominatorTree is not up to date! Computed:\n";
74 errs() << "\nActual:\n";
75 OtherDT
.print(errs());
80 void DominatorTree::print(raw_ostream
&OS
, const Module
*) const {
84 // dominates - Return true if A dominates a use in B. This performs the
85 // special checks necessary if A and B are in the same basic block.
86 bool DominatorTree::dominates(const Instruction
*A
, const Instruction
*B
) const{
87 const BasicBlock
*BBA
= A
->getParent(), *BBB
= B
->getParent();
89 // If A is an invoke instruction, its value is only available in this normal
91 if (const InvokeInst
*II
= dyn_cast
<InvokeInst
>(A
))
92 BBA
= II
->getNormalDest();
94 if (BBA
!= BBB
) return dominates(BBA
, BBB
);
96 // It is not possible to determine dominance between two PHI nodes
97 // based on their ordering.
98 if (isa
<PHINode
>(A
) && isa
<PHINode
>(B
))
101 // Loop through the basic block until we find A or B.
102 BasicBlock::const_iterator I
= BBA
->begin();
103 for (; &*I
!= A
&& &*I
!= B
; ++I
)