xref: /aosp_15_r20/external/llvm/lib/IR/Dominators.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1  //===- Dominators.cpp - Dominator Calculation -----------------------------===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // 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/IR/Dominators.h"
18  #include "llvm/ADT/DepthFirstIterator.h"
19  #include "llvm/ADT/SmallPtrSet.h"
20  #include "llvm/IR/CFG.h"
21  #include "llvm/IR/Instructions.h"
22  #include "llvm/IR/PassManager.h"
23  #include "llvm/Support/CommandLine.h"
24  #include "llvm/Support/Debug.h"
25  #include "llvm/Support/GenericDomTreeConstruction.h"
26  #include "llvm/Support/raw_ostream.h"
27  #include <algorithm>
28  using namespace llvm;
29  
30  // Always verify dominfo if expensive checking is enabled.
31  #ifdef EXPENSIVE_CHECKS
32  static bool VerifyDomInfo = true;
33  #else
34  static bool VerifyDomInfo = false;
35  #endif
36  static cl::opt<bool,true>
37  VerifyDomInfoX("verify-dom-info", cl::location(VerifyDomInfo),
38                 cl::desc("Verify dominator info (time consuming)"));
39  
isSingleEdge() const40  bool BasicBlockEdge::isSingleEdge() const {
41    const TerminatorInst *TI = Start->getTerminator();
42    unsigned NumEdgesToEnd = 0;
43    for (unsigned int i = 0, n = TI->getNumSuccessors(); i < n; ++i) {
44      if (TI->getSuccessor(i) == End)
45        ++NumEdgesToEnd;
46      if (NumEdgesToEnd >= 2)
47        return false;
48    }
49    assert(NumEdgesToEnd == 1);
50    return true;
51  }
52  
53  //===----------------------------------------------------------------------===//
54  //  DominatorTree Implementation
55  //===----------------------------------------------------------------------===//
56  //
57  // Provide public access to DominatorTree information.  Implementation details
58  // can be found in Dominators.h, GenericDomTree.h, and
59  // GenericDomTreeConstruction.h.
60  //
61  //===----------------------------------------------------------------------===//
62  
63  template class llvm::DomTreeNodeBase<BasicBlock>;
64  template class llvm::DominatorTreeBase<BasicBlock>;
65  
66  template void llvm::Calculate<Function, BasicBlock *>(
67      DominatorTreeBase<GraphTraits<BasicBlock *>::NodeType> &DT, Function &F);
68  template void llvm::Calculate<Function, Inverse<BasicBlock *>>(
69      DominatorTreeBase<GraphTraits<Inverse<BasicBlock *>>::NodeType> &DT,
70      Function &F);
71  
72  // dominates - Return true if Def dominates a use in User. This performs
73  // the special checks necessary if Def and User are in the same basic block.
74  // Note that Def doesn't dominate a use in Def itself!
dominates(const Instruction * Def,const Instruction * User) const75  bool DominatorTree::dominates(const Instruction *Def,
76                                const Instruction *User) const {
77    const BasicBlock *UseBB = User->getParent();
78    const BasicBlock *DefBB = Def->getParent();
79  
80    // Any unreachable use is dominated, even if Def == User.
81    if (!isReachableFromEntry(UseBB))
82      return true;
83  
84    // Unreachable definitions don't dominate anything.
85    if (!isReachableFromEntry(DefBB))
86      return false;
87  
88    // An instruction doesn't dominate a use in itself.
89    if (Def == User)
90      return false;
91  
92    // The value defined by an invoke dominates an instruction only if it
93    // dominates every instruction in UseBB.
94    // A PHI is dominated only if the instruction dominates every possible use in
95    // the UseBB.
96    if (isa<InvokeInst>(Def) || isa<PHINode>(User))
97      return dominates(Def, UseBB);
98  
99    if (DefBB != UseBB)
100      return dominates(DefBB, UseBB);
101  
102    // Loop through the basic block until we find Def or User.
103    BasicBlock::const_iterator I = DefBB->begin();
104    for (; &*I != Def && &*I != User; ++I)
105      /*empty*/;
106  
107    return &*I == Def;
108  }
109  
110  // true if Def would dominate a use in any instruction in UseBB.
111  // note that dominates(Def, Def->getParent()) is false.
dominates(const Instruction * Def,const BasicBlock * UseBB) const112  bool DominatorTree::dominates(const Instruction *Def,
113                                const BasicBlock *UseBB) const {
114    const BasicBlock *DefBB = Def->getParent();
115  
116    // Any unreachable use is dominated, even if DefBB == UseBB.
117    if (!isReachableFromEntry(UseBB))
118      return true;
119  
120    // Unreachable definitions don't dominate anything.
121    if (!isReachableFromEntry(DefBB))
122      return false;
123  
124    if (DefBB == UseBB)
125      return false;
126  
127    // Invoke results are only usable in the normal destination, not in the
128    // exceptional destination.
129    if (const auto *II = dyn_cast<InvokeInst>(Def)) {
130      BasicBlock *NormalDest = II->getNormalDest();
131      BasicBlockEdge E(DefBB, NormalDest);
132      return dominates(E, UseBB);
133    }
134  
135    return dominates(DefBB, UseBB);
136  }
137  
dominates(const BasicBlockEdge & BBE,const BasicBlock * UseBB) const138  bool DominatorTree::dominates(const BasicBlockEdge &BBE,
139                                const BasicBlock *UseBB) const {
140    // Assert that we have a single edge. We could handle them by simply
141    // returning false, but since isSingleEdge is linear on the number of
142    // edges, the callers can normally handle them more efficiently.
143    assert(BBE.isSingleEdge() &&
144           "This function is not efficient in handling multiple edges");
145  
146    // If the BB the edge ends in doesn't dominate the use BB, then the
147    // edge also doesn't.
148    const BasicBlock *Start = BBE.getStart();
149    const BasicBlock *End = BBE.getEnd();
150    if (!dominates(End, UseBB))
151      return false;
152  
153    // Simple case: if the end BB has a single predecessor, the fact that it
154    // dominates the use block implies that the edge also does.
155    if (End->getSinglePredecessor())
156      return true;
157  
158    // The normal edge from the invoke is critical. Conceptually, what we would
159    // like to do is split it and check if the new block dominates the use.
160    // With X being the new block, the graph would look like:
161    //
162    //        DefBB
163    //          /\      .  .
164    //         /  \     .  .
165    //        /    \    .  .
166    //       /      \   |  |
167    //      A        X  B  C
168    //      |         \ | /
169    //      .          \|/
170    //      .      NormalDest
171    //      .
172    //
173    // Given the definition of dominance, NormalDest is dominated by X iff X
174    // dominates all of NormalDest's predecessors (X, B, C in the example). X
175    // trivially dominates itself, so we only have to find if it dominates the
176    // other predecessors. Since the only way out of X is via NormalDest, X can
177    // only properly dominate a node if NormalDest dominates that node too.
178    for (const_pred_iterator PI = pred_begin(End), E = pred_end(End);
179         PI != E; ++PI) {
180      const BasicBlock *BB = *PI;
181      if (BB == Start)
182        continue;
183  
184      if (!dominates(End, BB))
185        return false;
186    }
187    return true;
188  }
189  
dominates(const BasicBlockEdge & BBE,const Use & U) const190  bool DominatorTree::dominates(const BasicBlockEdge &BBE, const Use &U) const {
191    // Assert that we have a single edge. We could handle them by simply
192    // returning false, but since isSingleEdge is linear on the number of
193    // edges, the callers can normally handle them more efficiently.
194    assert(BBE.isSingleEdge() &&
195           "This function is not efficient in handling multiple edges");
196  
197    Instruction *UserInst = cast<Instruction>(U.getUser());
198    // A PHI in the end of the edge is dominated by it.
199    PHINode *PN = dyn_cast<PHINode>(UserInst);
200    if (PN && PN->getParent() == BBE.getEnd() &&
201        PN->getIncomingBlock(U) == BBE.getStart())
202      return true;
203  
204    // Otherwise use the edge-dominates-block query, which
205    // handles the crazy critical edge cases properly.
206    const BasicBlock *UseBB;
207    if (PN)
208      UseBB = PN->getIncomingBlock(U);
209    else
210      UseBB = UserInst->getParent();
211    return dominates(BBE, UseBB);
212  }
213  
dominates(const Instruction * Def,const Use & U) const214  bool DominatorTree::dominates(const Instruction *Def, const Use &U) const {
215    Instruction *UserInst = cast<Instruction>(U.getUser());
216    const BasicBlock *DefBB = Def->getParent();
217  
218    // Determine the block in which the use happens. PHI nodes use
219    // their operands on edges; simulate this by thinking of the use
220    // happening at the end of the predecessor block.
221    const BasicBlock *UseBB;
222    if (PHINode *PN = dyn_cast<PHINode>(UserInst))
223      UseBB = PN->getIncomingBlock(U);
224    else
225      UseBB = UserInst->getParent();
226  
227    // Any unreachable use is dominated, even if Def == User.
228    if (!isReachableFromEntry(UseBB))
229      return true;
230  
231    // Unreachable definitions don't dominate anything.
232    if (!isReachableFromEntry(DefBB))
233      return false;
234  
235    // Invoke instructions define their return values on the edges to their normal
236    // successors, so we have to handle them specially.
237    // Among other things, this means they don't dominate anything in
238    // their own block, except possibly a phi, so we don't need to
239    // walk the block in any case.
240    if (const InvokeInst *II = dyn_cast<InvokeInst>(Def)) {
241      BasicBlock *NormalDest = II->getNormalDest();
242      BasicBlockEdge E(DefBB, NormalDest);
243      return dominates(E, U);
244    }
245  
246    // If the def and use are in different blocks, do a simple CFG dominator
247    // tree query.
248    if (DefBB != UseBB)
249      return dominates(DefBB, UseBB);
250  
251    // Ok, def and use are in the same block. If the def is an invoke, it
252    // doesn't dominate anything in the block. If it's a PHI, it dominates
253    // everything in the block.
254    if (isa<PHINode>(UserInst))
255      return true;
256  
257    // Otherwise, just loop through the basic block until we find Def or User.
258    BasicBlock::const_iterator I = DefBB->begin();
259    for (; &*I != Def && &*I != UserInst; ++I)
260      /*empty*/;
261  
262    return &*I != UserInst;
263  }
264  
isReachableFromEntry(const Use & U) const265  bool DominatorTree::isReachableFromEntry(const Use &U) const {
266    Instruction *I = dyn_cast<Instruction>(U.getUser());
267  
268    // ConstantExprs aren't really reachable from the entry block, but they
269    // don't need to be treated like unreachable code either.
270    if (!I) return true;
271  
272    // PHI nodes use their operands on their incoming edges.
273    if (PHINode *PN = dyn_cast<PHINode>(I))
274      return isReachableFromEntry(PN->getIncomingBlock(U));
275  
276    // Everything else uses their operands in their own block.
277    return isReachableFromEntry(I->getParent());
278  }
279  
verifyDomTree() const280  void DominatorTree::verifyDomTree() const {
281    Function &F = *getRoot()->getParent();
282  
283    DominatorTree OtherDT;
284    OtherDT.recalculate(F);
285    if (compare(OtherDT)) {
286      errs() << "DominatorTree is not up to date!\nComputed:\n";
287      print(errs());
288      errs() << "\nActual:\n";
289      OtherDT.print(errs());
290      abort();
291    }
292  }
293  
294  //===----------------------------------------------------------------------===//
295  //  DominatorTreeAnalysis and related pass implementations
296  //===----------------------------------------------------------------------===//
297  //
298  // This implements the DominatorTreeAnalysis which is used with the new pass
299  // manager. It also implements some methods from utility passes.
300  //
301  //===----------------------------------------------------------------------===//
302  
run(Function & F,AnalysisManager<Function> &)303  DominatorTree DominatorTreeAnalysis::run(Function &F,
304                                           AnalysisManager<Function> &) {
305    DominatorTree DT;
306    DT.recalculate(F);
307    return DT;
308  }
309  
310  char DominatorTreeAnalysis::PassID;
311  
DominatorTreePrinterPass(raw_ostream & OS)312  DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}
313  
run(Function & F,FunctionAnalysisManager & AM)314  PreservedAnalyses DominatorTreePrinterPass::run(Function &F,
315                                                  FunctionAnalysisManager &AM) {
316    OS << "DominatorTree for function: " << F.getName() << "\n";
317    AM.getResult<DominatorTreeAnalysis>(F).print(OS);
318  
319    return PreservedAnalyses::all();
320  }
321  
run(Function & F,FunctionAnalysisManager & AM)322  PreservedAnalyses DominatorTreeVerifierPass::run(Function &F,
323                                                   FunctionAnalysisManager &AM) {
324    AM.getResult<DominatorTreeAnalysis>(F).verifyDomTree();
325  
326    return PreservedAnalyses::all();
327  }
328  
329  //===----------------------------------------------------------------------===//
330  //  DominatorTreeWrapperPass Implementation
331  //===----------------------------------------------------------------------===//
332  //
333  // The implementation details of the wrapper pass that holds a DominatorTree
334  // suitable for use with the legacy pass manager.
335  //
336  //===----------------------------------------------------------------------===//
337  
338  char DominatorTreeWrapperPass::ID = 0;
339  INITIALIZE_PASS(DominatorTreeWrapperPass, "domtree",
340                  "Dominator Tree Construction", true, true)
341  
runOnFunction(Function & F)342  bool DominatorTreeWrapperPass::runOnFunction(Function &F) {
343    DT.recalculate(F);
344    return false;
345  }
346  
verifyAnalysis() const347  void DominatorTreeWrapperPass::verifyAnalysis() const {
348      if (VerifyDomInfo)
349        DT.verifyDomTree();
350  }
351  
print(raw_ostream & OS,const Module *) const352  void DominatorTreeWrapperPass::print(raw_ostream &OS, const Module *) const {
353    DT.print(OS);
354  }
355  
356