LLVM 24.0.0git
Dominators.cpp
Go to the documentation of this file.
1//===- Dominators.cpp - Dominator Calculation -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements simple dominator construction algorithms for finding
10// forward dominators. Postdominators are available in libanalysis, but are not
11// included in libvmcore, because it's not needed. Forward dominators are
12// needed to support the Verifier pass.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/IR/Dominators.h"
17#include "llvm/ADT/StringRef.h"
18#include "llvm/Config/llvm-config.h"
19#include "llvm/IR/CFG.h"
20#include "llvm/IR/Function.h"
21#include "llvm/IR/Instruction.h"
23#include "llvm/IR/PassManager.h"
25#include "llvm/PassRegistry.h"
31
32#include <cassert>
33
34namespace llvm {
35class Argument;
36class Constant;
37class Value;
38} // namespace llvm
39using namespace llvm;
40
44 cl::desc("Verify dominator info (time consuming)"));
45
46#ifdef EXPENSIVE_CHECKS
47static constexpr bool ExpensiveChecksEnabled = true;
48#else
49static constexpr bool ExpensiveChecksEnabled = false;
50#endif
51
52//===----------------------------------------------------------------------===//
53// DominatorTree Implementation
54//===----------------------------------------------------------------------===//
55//
56// Provide public access to DominatorTree information. Implementation details
57// can be found in Dominators.h, GenericDomTree.h, and
58// GenericDomTreeConstruction.h.
59//
60//===----------------------------------------------------------------------===//
61
63template class LLVM_EXPORT_TEMPLATE
65template class LLVM_EXPORT_TEMPLATE
67
69
71 FunctionAnalysisManager::Invalidator &) {
72 // Check whether the analysis, all analyses on functions, or the function's
73 // CFG have been preserved.
74 auto PAC = PA.getChecker<DominatorTreeAnalysis>();
75 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
76 PAC.preservedSet<CFGAnalyses>());
77}
78
79bool DominatorTree::dominates(const BasicBlock *BB, const Use &U) const {
80 Instruction *UserInst = cast<Instruction>(U.getUser());
81 if (auto *PN = dyn_cast<PHINode>(UserInst))
82 // A phi use using a value from a block is dominated by the end of that
83 // block. Note that the phi's parent block may not be.
84 return dominates(BB, PN->getIncomingBlock(U));
85 else
86 return properlyDominates(BB, UserInst->getParent());
87}
88
89// dominates - Return true if Def dominates a use in User. This performs
90// the special checks necessary if Def and User are in the same basic block.
91// Note that Def doesn't dominate a use in Def itself!
93 const Instruction *User) const {
94 const Instruction *Def = dyn_cast<Instruction>(DefV);
95 if (!Def) {
96 assert((isa<Argument>(DefV) || isa<Constant>(DefV)) &&
97 "Should be called with an instruction, argument or constant");
98 return true; // Arguments and constants dominate everything.
99 }
100
101 const BasicBlock *UseBB = User->getParent();
102 const BasicBlock *DefBB = Def->getParent();
103
104 // Any unreachable use is dominated, even if Def == User.
105 if (!isReachableFromEntry(UseBB))
106 return true;
107
108 // Unreachable definitions don't dominate anything.
109 if (!isReachableFromEntry(DefBB))
110 return false;
111
112 // An instruction doesn't dominate a use in itself.
113 if (Def == User)
114 return false;
115
116 // The value defined by an invoke dominates an instruction only if it
117 // dominates every instruction in UseBB.
118 // A PHI is dominated only if the instruction dominates every possible use in
119 // the UseBB.
121 return dominates(Def, UseBB);
122
123 if (DefBB != UseBB)
124 return dominates(DefBB, UseBB);
125
126 return Def->comesBefore(User);
127}
128
129// true if Def would dominate a use in any instruction in UseBB.
130// note that dominates(Def, Def->getParent()) is false.
132 const BasicBlock *UseBB) const {
133 const BasicBlock *DefBB = Def->getParent();
134
135 // Any unreachable use is dominated, even if DefBB == UseBB.
136 if (!isReachableFromEntry(UseBB))
137 return true;
138
139 // Unreachable definitions don't dominate anything.
140 if (!isReachableFromEntry(DefBB))
141 return false;
142
143 if (DefBB == UseBB)
144 return false;
145
146 // Invoke results are only usable in the normal destination, not in the
147 // exceptional destination.
148 if (const auto *II = dyn_cast<InvokeInst>(Def)) {
149 BasicBlock *NormalDest = II->getNormalDest();
150 BasicBlockEdge E(DefBB, NormalDest);
151 return dominates(E, UseBB);
152 }
153
154 return dominates(DefBB, UseBB);
155}
156
158 const BasicBlock *UseBB) const {
159 // If the BB the edge ends in doesn't dominate the use BB, then the
160 // edge also doesn't.
161 const BasicBlock *Start = BBE.getStart();
162 const BasicBlock *End = BBE.getEnd();
163 if (!dominates(End, UseBB))
164 return false;
165
166 // Simple case: if the end BB has a single predecessor, the fact that it
167 // dominates the use block implies that the edge also does.
168 if (End->getSinglePredecessor())
169 return true;
170
171 // The normal edge from the invoke is critical. Conceptually, what we would
172 // like to do is split it and check if the new block dominates the use.
173 // With X being the new block, the graph would look like:
174 //
175 // DefBB
176 // /\ . .
177 // / \ . .
178 // / \ . .
179 // / \ | |
180 // A X B C
181 // | \ | /
182 // . \|/
183 // . NormalDest
184 // .
185 //
186 // Given the definition of dominance, NormalDest is dominated by X iff X
187 // dominates all of NormalDest's predecessors (X, B, C in the example). X
188 // trivially dominates itself, so we only have to find if it dominates the
189 // other predecessors. Since the only way out of X is via NormalDest, X can
190 // only properly dominate a node if NormalDest dominates that node too.
191 int IsDuplicateEdge = 0;
192 for (const BasicBlock *BB : predecessors(End)) {
193 if (BB == Start) {
194 // If there are multiple edges between Start and End, by definition they
195 // can't dominate anything.
196 if (IsDuplicateEdge++)
197 return false;
198 continue;
199 }
200
201 if (!dominates(End, BB))
202 return false;
203 }
204 return true;
205}
206
207bool DominatorTree::dominates(const BasicBlockEdge &BBE, const Use &U) const {
208 Instruction *UserInst = cast<Instruction>(U.getUser());
209 // A PHI in the end of the edge is dominated by it.
210 PHINode *PN = dyn_cast<PHINode>(UserInst);
211 if (PN && PN->getParent() == BBE.getEnd() &&
212 PN->getIncomingBlock(U) == BBE.getStart())
213 return true;
214
215 // Otherwise use the edge-dominates-block query, which
216 // handles the crazy critical edge cases properly.
217 const BasicBlock *UseBB;
218 if (PN)
219 UseBB = PN->getIncomingBlock(U);
220 else
221 UseBB = UserInst->getParent();
222 return dominates(BBE, UseBB);
223}
224
225bool DominatorTree::dominates(const Value *DefV, const Use &U) const {
226 const Instruction *Def = dyn_cast<Instruction>(DefV);
227 if (!Def) {
228 assert((isa<Argument>(DefV) || isa<Constant>(DefV)) &&
229 "Should be called with an instruction, argument or constant");
230 return true; // Arguments and constants dominate everything.
231 }
232
233 Instruction *UserInst = cast<Instruction>(U.getUser());
234 const BasicBlock *DefBB = Def->getParent();
235
236 // Determine the block in which the use happens. PHI nodes use
237 // their operands on edges; simulate this by thinking of the use
238 // happening at the end of the predecessor block.
239 const BasicBlock *UseBB;
240 if (PHINode *PN = dyn_cast<PHINode>(UserInst))
241 UseBB = PN->getIncomingBlock(U);
242 else
243 UseBB = UserInst->getParent();
244
245 // Any unreachable use is dominated, even if Def == User.
246 if (!isReachableFromEntry(UseBB))
247 return true;
248
249 // Unreachable definitions don't dominate anything.
250 if (!isReachableFromEntry(DefBB))
251 return false;
252
253 // Invoke instructions define their return values on the edges to their normal
254 // successors, so we have to handle them specially.
255 // Among other things, this means they don't dominate anything in
256 // their own block, except possibly a phi, so we don't need to
257 // walk the block in any case.
258 if (const InvokeInst *II = dyn_cast<InvokeInst>(Def)) {
259 BasicBlock *NormalDest = II->getNormalDest();
260 BasicBlockEdge E(DefBB, NormalDest);
261 return dominates(E, U);
262 }
263
264 // If the def and use are in different blocks, do a simple CFG dominator
265 // tree query.
266 if (DefBB != UseBB)
267 return dominates(DefBB, UseBB);
268
269 // Ok, def and use are in the same block. If the def is an invoke, it
270 // doesn't dominate anything in the block. If it's a PHI, it dominates
271 // everything in the block.
272 if (isa<PHINode>(UserInst))
273 return true;
274
275 return Def->comesBefore(UserInst);
276}
277
279 Instruction *I = dyn_cast<Instruction>(U.getUser());
280
281 // ConstantExprs aren't really reachable from the entry block, but they
282 // don't need to be treated like unreachable code either.
283 if (!I) return true;
284
285 // PHI nodes use their operands on their incoming edges.
286 if (PHINode *PN = dyn_cast<PHINode>(I))
287 return isReachableFromEntry(PN->getIncomingBlock(U));
288
289 // Everything else uses their operands in their own block.
290 return isReachableFromEntry(I->getParent());
291}
292
293// Edge BBE1 dominates edge BBE2 if they match or BBE1 dominates start of BBE2.
295 const BasicBlockEdge &BBE2) const {
296 if (BBE1.getStart() == BBE2.getStart() && BBE1.getEnd() == BBE2.getEnd())
297 return true;
298 return dominates(BBE1, BBE2.getStart());
299}
300
302 Instruction *I2) const {
303 BasicBlock *BB1 = I1->getParent();
304 BasicBlock *BB2 = I2->getParent();
305 if (BB1 == BB2)
306 return I1->comesBefore(I2) ? I1 : I2;
307 if (!isReachableFromEntry(BB2))
308 return I1;
309 if (!isReachableFromEntry(BB1))
310 return I2;
311 BasicBlock *DomBB = findNearestCommonDominator(BB1, BB2);
312 if (BB1 == DomBB)
313 return I1;
314 if (BB2 == DomBB)
315 return I2;
316 return DomBB->getTerminator();
317}
318
319//===----------------------------------------------------------------------===//
320// DominatorTreeAnalysis and related pass implementations
321//===----------------------------------------------------------------------===//
322//
323// This implements the DominatorTreeAnalysis which is used with the new pass
324// manager. It also implements some methods from utility passes.
325//
326//===----------------------------------------------------------------------===//
327
334
335AnalysisKey DominatorTreeAnalysis::Key;
336
338
341 OS << "DominatorTree for function: " << F.getName() << "\n";
343
344 return PreservedAnalyses::all();
345}
346
349 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
350 assert(DT.verify());
351 (void)DT;
352 return PreservedAnalyses::all();
353}
354
355//===----------------------------------------------------------------------===//
356// DominatorTreeWrapperPass Implementation
357//===----------------------------------------------------------------------===//
358//
359// The implementation details of the wrapper pass that holds a DominatorTree
360// suitable for use with the legacy pass manager.
361//
362//===----------------------------------------------------------------------===//
363
365
367
369 "Dominator Tree Construction", true, true)
370
372 DT.recalculate(F);
373 return false;
374}
375
377 if (VerifyDomInfo)
378 assert(DT.verify(DominatorTree::VerificationLevel::Full));
379 else if (ExpensiveChecksEnabled)
380 assert(DT.verify(DominatorTree::VerificationLevel::Basic));
381}
382
384 DT.print(OS);
385}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_EXPORT_TEMPLATE
Definition Compiler.h:217
static cl::opt< bool, true > VerifyDomInfoX("verify-dom-info", cl::location(VerifyDomInfo), cl::Hidden, cl::desc("Verify dominator info (time consuming)"))
static bool runOnFunction(Function &F, bool PostInlining)
Generic dominator tree construction - this file provides routines to construct immediate dominator in...
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
static constexpr bool ExpensiveChecksEnabled
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
const BasicBlock * getEnd() const
Definition Dominators.h:85
const BasicBlock * getStart() const
Definition Dominators.h:81
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
This is an important base class in LLVM.
Definition Constant.h:43
Base class for the actual dominator tree node.
Analysis pass which computes a DominatorTree.
Definition Dominators.h:241
LLVM_ABI DominatorTree run(Function &F, FunctionAnalysisManager &)
Run the analysis pass over a function and produce a dominator tree.
Core dominator tree base class.
void recalculate(ParentType &Func)
recalculate - compute a dominator tree for the given function
bool properlyDominates(const DomTreeNodeBase< BasicBlock > *A, const DomTreeNodeBase< BasicBlock > *B) const
LLVM_ABI DominatorTreePrinterPass(raw_ostream &OS)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Legacy analysis pass which computes a DominatorTree.
Definition Dominators.h:277
void print(raw_ostream &OS, const Module *M=nullptr) const override
print - Print out the internal state of the pass.
void verifyAnalysis() const override
verifyAnalysis() - This member can be implemented by a analysis pass to check state of analysis infor...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
LLVM_ABI Instruction * findNearestCommonDominator(Instruction *I1, Instruction *I2) const
Find the nearest instruction I that dominates both I1 and I2, in the sense that a result produced bef...
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &)
Handle invalidation explicitly.
FunctionPass(char &pid)
Definition Pass.h:316
Invoke instruction.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
const ParentTy * getParent() const
Definition ilist_node.h:34
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
LocationClass< Ty > location(Ty &L)
This is an optimization pass for GlobalISel generic memory operations.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool VerifyDomInfo
Enables verification of dominator trees.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)