blob: 24b6c47d0fdc4a1172a89ab13567b7b25a14dbc3 [file] [log] [blame]
Chris Lattnerd43023a2002-08-02 16:43:03 +00001//===- Dominators.cpp - Dominator Calculation -----------------------------===//
Misha Brukmanb1c93172005-04-21 23:48:37 +00002//
John Criswell482202a2003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanb1c93172005-04-21 23:48:37 +00007//
John Criswell482202a2003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner081aabc2001-07-02 05:46:38 +00009//
Chris Lattnerd43023a2002-08-02 16:43:03 +000010// 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.
Chris Lattner081aabc2001-07-02 05:46:38 +000014//
15//===----------------------------------------------------------------------===//
16
Chandler Carruth5ad5f152014-01-13 09:26:24 +000017#include "llvm/IR/Dominators.h"
Reid Spencer7c16caa2004-09-01 22:55:40 +000018#include "llvm/ADT/DepthFirstIterator.h"
Devang Patel5a1bd402007-03-27 20:50:46 +000019#include "llvm/ADT/SmallPtrSet.h"
Chandler Carruth1305dc32014-03-04 11:45:46 +000020#include "llvm/IR/CFG.h"
Brian M. Rzycki9b7ae232018-01-12 21:06:48 +000021#include "llvm/IR/Constants.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000022#include "llvm/IR/Instructions.h"
Chandler Carruth64764b42015-01-14 10:19:28 +000023#include "llvm/IR/PassManager.h"
Dan Gohman4dbb3012009-09-28 00:27:48 +000024#include "llvm/Support/CommandLine.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000025#include "llvm/Support/Debug.h"
Chandler Carruthe509db42014-01-13 10:52:56 +000026#include "llvm/Support/GenericDomTreeConstruction.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000027#include "llvm/Support/raw_ostream.h"
Chris Lattnerc5e0be62004-06-05 00:24:59 +000028#include <algorithm>
Chris Lattner189d19f2003-11-21 20:23:48 +000029using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000030
Serge Pavlov69b3ff92017-01-24 05:52:07 +000031bool llvm::VerifyDomInfo = false;
Zachary Turner8065f0b2017-12-01 00:53:10 +000032static cl::opt<bool, true>
33 VerifyDomInfoX("verify-dom-info", cl::location(VerifyDomInfo), cl::Hidden,
34 cl::desc("Verify dominator info (time consuming)"));
Dan Gohman4dbb3012009-09-28 00:27:48 +000035
Jakub Kuderskiffb4fb72018-01-24 02:40:35 +000036#ifdef EXPENSIVE_CHECKS
37static constexpr bool ExpensiveChecksEnabled = true;
38#else
39static constexpr bool ExpensiveChecksEnabled = false;
40#endif
41
Rafael Espindolacc80cde2012-08-16 15:09:43 +000042bool BasicBlockEdge::isSingleEdge() const {
43 const TerminatorInst *TI = Start->getTerminator();
44 unsigned NumEdgesToEnd = 0;
45 for (unsigned int i = 0, n = TI->getNumSuccessors(); i < n; ++i) {
46 if (TI->getSuccessor(i) == End)
47 ++NumEdgesToEnd;
48 if (NumEdgesToEnd >= 2)
49 return false;
50 }
51 assert(NumEdgesToEnd == 1);
52 return true;
Rafael Espindola11870772012-08-10 14:05:55 +000053}
54
Chris Lattnerc385beb2001-07-06 16:58:22 +000055//===----------------------------------------------------------------------===//
Owen Andersonf35a1db2007-04-15 08:47:27 +000056// DominatorTree Implementation
Chris Lattner00f51672003-12-07 00:38:08 +000057//===----------------------------------------------------------------------===//
58//
Owen Anderson84c357f2007-09-23 21:31:44 +000059// Provide public access to DominatorTree information. Implementation details
Chandler Carruthe509db42014-01-13 10:52:56 +000060// can be found in Dominators.h, GenericDomTree.h, and
61// GenericDomTreeConstruction.h.
Chris Lattner00f51672003-12-07 00:38:08 +000062//
63//===----------------------------------------------------------------------===//
64
Benjamin Kramera667d1a2015-07-13 17:21:31 +000065template class llvm::DomTreeNodeBase<BasicBlock>;
Jakub Kuderskib292c222017-07-14 18:26:09 +000066template class llvm::DominatorTreeBase<BasicBlock, false>; // DomTreeBase
67template class llvm::DominatorTreeBase<BasicBlock, true>; // PostDomTreeBase
Owen Anderson41878012007-10-16 19:59:25 +000068
Jakub Kuderski624463a2017-08-16 16:12:52 +000069template struct llvm::DomTreeBuilder::Update<BasicBlock *>;
70
Jakub Kuderskic271dea2017-07-26 18:07:40 +000071template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBDomTree>(
72 DomTreeBuilder::BBDomTree &DT);
73template void llvm::DomTreeBuilder::Calculate<DomTreeBuilder::BBPostDomTree>(
74 DomTreeBuilder::BBPostDomTree &DT);
Jakub Kuderski5af07f52017-07-13 20:45:32 +000075
Jakub Kuderski13e9ef12017-07-14 21:17:33 +000076template void llvm::DomTreeBuilder::InsertEdge<DomTreeBuilder::BBDomTree>(
77 DomTreeBuilder::BBDomTree &DT, BasicBlock *From, BasicBlock *To);
78template void llvm::DomTreeBuilder::InsertEdge<DomTreeBuilder::BBPostDomTree>(
79 DomTreeBuilder::BBPostDomTree &DT, BasicBlock *From, BasicBlock *To);
80
Jakub Kuderskieb59ff22017-07-14 21:58:53 +000081template void llvm::DomTreeBuilder::DeleteEdge<DomTreeBuilder::BBDomTree>(
82 DomTreeBuilder::BBDomTree &DT, BasicBlock *From, BasicBlock *To);
83template void llvm::DomTreeBuilder::DeleteEdge<DomTreeBuilder::BBPostDomTree>(
84 DomTreeBuilder::BBPostDomTree &DT, BasicBlock *From, BasicBlock *To);
85
Jakub Kuderski624463a2017-08-16 16:12:52 +000086template void llvm::DomTreeBuilder::ApplyUpdates<DomTreeBuilder::BBDomTree>(
87 DomTreeBuilder::BBDomTree &DT, DomTreeBuilder::BBUpdates);
88template void llvm::DomTreeBuilder::ApplyUpdates<DomTreeBuilder::BBPostDomTree>(
89 DomTreeBuilder::BBPostDomTree &DT, DomTreeBuilder::BBUpdates);
90
Jakub Kuderski5af07f52017-07-13 20:45:32 +000091template bool llvm::DomTreeBuilder::Verify<DomTreeBuilder::BBDomTree>(
Jakub Kuderskiffb4fb72018-01-24 02:40:35 +000092 const DomTreeBuilder::BBDomTree &DT,
93 DomTreeBuilder::BBDomTree::VerificationLevel VL);
Jakub Kuderskib292c222017-07-14 18:26:09 +000094template bool llvm::DomTreeBuilder::Verify<DomTreeBuilder::BBPostDomTree>(
Jakub Kuderskiffb4fb72018-01-24 02:40:35 +000095 const DomTreeBuilder::BBPostDomTree &DT,
96 DomTreeBuilder::BBPostDomTree::VerificationLevel VL);
Rafael Espindola30616362014-02-14 22:36:16 +000097
Chandler Carruthca68a3e2017-01-15 06:32:49 +000098bool DominatorTree::invalidate(Function &F, const PreservedAnalyses &PA,
99 FunctionAnalysisManager::Invalidator &) {
100 // Check whether the analysis, all analyses on functions, or the function's
101 // CFG have been preserved.
102 auto PAC = PA.getChecker<DominatorTreeAnalysis>();
103 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
104 PAC.preservedSet<CFGAnalyses>());
105}
106
Rafael Espindola94df2672012-02-26 02:19:19 +0000107// dominates - Return true if Def dominates a use in User. This performs
108// the special checks necessary if Def and User are in the same basic block.
109// Note that Def doesn't dominate a use in Def itself!
110bool DominatorTree::dominates(const Instruction *Def,
111 const Instruction *User) const {
112 const BasicBlock *UseBB = User->getParent();
113 const BasicBlock *DefBB = Def->getParent();
Rafael Espindola082d4822012-02-18 19:46:02 +0000114
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000115 // Any unreachable use is dominated, even if Def == User.
116 if (!isReachableFromEntry(UseBB))
117 return true;
118
119 // Unreachable definitions don't dominate anything.
120 if (!isReachableFromEntry(DefBB))
121 return false;
Rafael Espindola082d4822012-02-18 19:46:02 +0000122
Rafael Espindola94df2672012-02-26 02:19:19 +0000123 // An instruction doesn't dominate a use in itself.
124 if (Def == User)
Chris Lattner22151ce2009-09-21 22:30:50 +0000125 return false;
Rafael Espindola082d4822012-02-18 19:46:02 +0000126
David Majnemer8a1c45d2015-12-12 05:38:55 +0000127 // The value defined by an invoke dominates an instruction only if it
128 // dominates every instruction in UseBB.
129 // A PHI is dominated only if the instruction dominates every possible use in
130 // the UseBB.
131 if (isa<InvokeInst>(Def) || isa<PHINode>(User))
Rafael Espindola94df2672012-02-26 02:19:19 +0000132 return dominates(Def, UseBB);
133
134 if (DefBB != UseBB)
135 return dominates(DefBB, UseBB);
136
137 // Loop through the basic block until we find Def or User.
138 BasicBlock::const_iterator I = DefBB->begin();
139 for (; &*I != Def && &*I != User; ++I)
Chris Lattner22151ce2009-09-21 22:30:50 +0000140 /*empty*/;
Rafael Espindola082d4822012-02-18 19:46:02 +0000141
Rafael Espindola94df2672012-02-26 02:19:19 +0000142 return &*I == Def;
143}
144
145// true if Def would dominate a use in any instruction in UseBB.
146// note that dominates(Def, Def->getParent()) is false.
147bool DominatorTree::dominates(const Instruction *Def,
148 const BasicBlock *UseBB) const {
149 const BasicBlock *DefBB = Def->getParent();
150
Rafael Espindolaa53c46a2012-03-30 16:46:21 +0000151 // Any unreachable use is dominated, even if DefBB == UseBB.
152 if (!isReachableFromEntry(UseBB))
153 return true;
154
155 // Unreachable definitions don't dominate anything.
156 if (!isReachableFromEntry(DefBB))
157 return false;
Rafael Espindola94df2672012-02-26 02:19:19 +0000158
159 if (DefBB == UseBB)
160 return false;
161
David Majnemer8a1c45d2015-12-12 05:38:55 +0000162 // Invoke results are only usable in the normal destination, not in the
163 // exceptional destination.
David Majnemer0bc0eef2015-08-15 02:46:08 +0000164 if (const auto *II = dyn_cast<InvokeInst>(Def)) {
165 BasicBlock *NormalDest = II->getNormalDest();
166 BasicBlockEdge E(DefBB, NormalDest);
167 return dominates(E, UseBB);
168 }
Rafael Espindola94df2672012-02-26 02:19:19 +0000169
David Majnemer0bc0eef2015-08-15 02:46:08 +0000170 return dominates(DefBB, UseBB);
Rafael Espindola59564072012-08-07 17:30:46 +0000171}
172
173bool DominatorTree::dominates(const BasicBlockEdge &BBE,
174 const BasicBlock *UseBB) const {
175 // If the BB the edge ends in doesn't dominate the use BB, then the
176 // edge also doesn't.
177 const BasicBlock *Start = BBE.getStart();
178 const BasicBlock *End = BBE.getEnd();
179 if (!dominates(End, UseBB))
Rafael Espindola94df2672012-02-26 02:19:19 +0000180 return false;
181
Rafael Espindola59564072012-08-07 17:30:46 +0000182 // Simple case: if the end BB has a single predecessor, the fact that it
183 // dominates the use block implies that the edge also does.
184 if (End->getSinglePredecessor())
Rafael Espindola94df2672012-02-26 02:19:19 +0000185 return true;
186
187 // The normal edge from the invoke is critical. Conceptually, what we would
188 // like to do is split it and check if the new block dominates the use.
189 // With X being the new block, the graph would look like:
190 //
191 // DefBB
192 // /\ . .
193 // / \ . .
194 // / \ . .
195 // / \ | |
196 // A X B C
197 // | \ | /
198 // . \|/
199 // . NormalDest
200 // .
201 //
Sylvestre Ledru91ce36c2012-09-27 10:14:43 +0000202 // Given the definition of dominance, NormalDest is dominated by X iff X
Rafael Espindola94df2672012-02-26 02:19:19 +0000203 // dominates all of NormalDest's predecessors (X, B, C in the example). X
204 // trivially dominates itself, so we only have to find if it dominates the
205 // other predecessors. Since the only way out of X is via NormalDest, X can
206 // only properly dominate a node if NormalDest dominates that node too.
Adam Nemet4ef096b2017-06-05 16:27:09 +0000207 int IsDuplicateEdge = 0;
Duncan P. N. Exon Smith6c990152014-07-21 17:06:51 +0000208 for (const_pred_iterator PI = pred_begin(End), E = pred_end(End);
209 PI != E; ++PI) {
210 const BasicBlock *BB = *PI;
Adam Nemet4ef096b2017-06-05 16:27:09 +0000211 if (BB == Start) {
212 // If there are multiple edges between Start and End, by definition they
213 // can't dominate anything.
214 if (IsDuplicateEdge++)
215 return false;
Rafael Espindola94df2672012-02-26 02:19:19 +0000216 continue;
Adam Nemet4ef096b2017-06-05 16:27:09 +0000217 }
Rafael Espindola94df2672012-02-26 02:19:19 +0000218
Rafael Espindola59564072012-08-07 17:30:46 +0000219 if (!dominates(End, BB))
Rafael Espindola94df2672012-02-26 02:19:19 +0000220 return false;
221 }
222 return true;
Chris Lattner22151ce2009-09-21 22:30:50 +0000223}
Dan Gohman73273272012-04-12 23:31:46 +0000224
Chandler Carruth73523022014-01-13 13:07:17 +0000225bool DominatorTree::dominates(const BasicBlockEdge &BBE, const Use &U) const {
Rafael Espindola59564072012-08-07 17:30:46 +0000226 Instruction *UserInst = cast<Instruction>(U.getUser());
227 // A PHI in the end of the edge is dominated by it.
228 PHINode *PN = dyn_cast<PHINode>(UserInst);
229 if (PN && PN->getParent() == BBE.getEnd() &&
230 PN->getIncomingBlock(U) == BBE.getStart())
231 return true;
232
233 // Otherwise use the edge-dominates-block query, which
234 // handles the crazy critical edge cases properly.
235 const BasicBlock *UseBB;
236 if (PN)
237 UseBB = PN->getIncomingBlock(U);
238 else
239 UseBB = UserInst->getParent();
240 return dominates(BBE, UseBB);
241}
242
Chandler Carruth73523022014-01-13 13:07:17 +0000243bool DominatorTree::dominates(const Instruction *Def, const Use &U) const {
Rafael Espindola59564072012-08-07 17:30:46 +0000244 Instruction *UserInst = cast<Instruction>(U.getUser());
Dan Gohman73273272012-04-12 23:31:46 +0000245 const BasicBlock *DefBB = Def->getParent();
246
247 // Determine the block in which the use happens. PHI nodes use
248 // their operands on edges; simulate this by thinking of the use
249 // happening at the end of the predecessor block.
250 const BasicBlock *UseBB;
251 if (PHINode *PN = dyn_cast<PHINode>(UserInst))
252 UseBB = PN->getIncomingBlock(U);
253 else
254 UseBB = UserInst->getParent();
255
256 // Any unreachable use is dominated, even if Def == User.
257 if (!isReachableFromEntry(UseBB))
258 return true;
259
260 // Unreachable definitions don't dominate anything.
261 if (!isReachableFromEntry(DefBB))
262 return false;
263
David Majnemer8a1c45d2015-12-12 05:38:55 +0000264 // Invoke instructions define their return values on the edges to their normal
265 // successors, so we have to handle them specially.
Dan Gohman73273272012-04-12 23:31:46 +0000266 // Among other things, this means they don't dominate anything in
267 // their own block, except possibly a phi, so we don't need to
268 // walk the block in any case.
269 if (const InvokeInst *II = dyn_cast<InvokeInst>(Def)) {
Rafael Espindola59564072012-08-07 17:30:46 +0000270 BasicBlock *NormalDest = II->getNormalDest();
271 BasicBlockEdge E(DefBB, NormalDest);
272 return dominates(E, U);
Dan Gohman73273272012-04-12 23:31:46 +0000273 }
274
275 // If the def and use are in different blocks, do a simple CFG dominator
276 // tree query.
277 if (DefBB != UseBB)
278 return dominates(DefBB, UseBB);
279
280 // Ok, def and use are in the same block. If the def is an invoke, it
281 // doesn't dominate anything in the block. If it's a PHI, it dominates
282 // everything in the block.
283 if (isa<PHINode>(UserInst))
284 return true;
285
286 // Otherwise, just loop through the basic block until we find Def or User.
287 BasicBlock::const_iterator I = DefBB->begin();
288 for (; &*I != Def && &*I != UserInst; ++I)
289 /*empty*/;
290
291 return &*I != UserInst;
292}
293
294bool DominatorTree::isReachableFromEntry(const Use &U) const {
295 Instruction *I = dyn_cast<Instruction>(U.getUser());
296
297 // ConstantExprs aren't really reachable from the entry block, but they
298 // don't need to be treated like unreachable code either.
299 if (!I) return true;
300
301 // PHI nodes use their operands on their incoming edges.
302 if (PHINode *PN = dyn_cast<PHINode>(I))
303 return isReachableFromEntry(PN->getIncomingBlock(U));
304
305 // Everything else uses their operands in their own block.
306 return isReachableFromEntry(I->getParent());
307}
Chandler Carruth73523022014-01-13 13:07:17 +0000308
Chandler Carruth73523022014-01-13 13:07:17 +0000309//===----------------------------------------------------------------------===//
Chandler Carruth64764b42015-01-14 10:19:28 +0000310// DominatorTreeAnalysis and related pass implementations
311//===----------------------------------------------------------------------===//
312//
313// This implements the DominatorTreeAnalysis which is used with the new pass
314// manager. It also implements some methods from utility passes.
315//
316//===----------------------------------------------------------------------===//
317
Chandler Carruth164a2aa62016-06-17 00:11:01 +0000318DominatorTree DominatorTreeAnalysis::run(Function &F,
Sean Silva36e0d012016-08-09 00:28:15 +0000319 FunctionAnalysisManager &) {
Chandler Carruth64764b42015-01-14 10:19:28 +0000320 DominatorTree DT;
321 DT.recalculate(F);
322 return DT;
323}
324
Chandler Carruthdab4eae2016-11-23 17:53:26 +0000325AnalysisKey DominatorTreeAnalysis::Key;
NAKAMURA Takumidf0cd722016-02-28 17:17:00 +0000326
Chandler Carruth64764b42015-01-14 10:19:28 +0000327DominatorTreePrinterPass::DominatorTreePrinterPass(raw_ostream &OS) : OS(OS) {}
328
329PreservedAnalyses DominatorTreePrinterPass::run(Function &F,
Chandler Carruthb47f8012016-03-11 11:05:24 +0000330 FunctionAnalysisManager &AM) {
Chandler Carruth64764b42015-01-14 10:19:28 +0000331 OS << "DominatorTree for function: " << F.getName() << "\n";
Chandler Carruthb47f8012016-03-11 11:05:24 +0000332 AM.getResult<DominatorTreeAnalysis>(F).print(OS);
Chandler Carruth64764b42015-01-14 10:19:28 +0000333
334 return PreservedAnalyses::all();
335}
336
337PreservedAnalyses DominatorTreeVerifierPass::run(Function &F,
Chandler Carruthb47f8012016-03-11 11:05:24 +0000338 FunctionAnalysisManager &AM) {
David Green7c35de12018-02-28 11:00:08 +0000339 auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
340 assert(DT.verify());
341 (void)DT;
Chandler Carruth64764b42015-01-14 10:19:28 +0000342 return PreservedAnalyses::all();
343}
344
345//===----------------------------------------------------------------------===//
Chandler Carruth73523022014-01-13 13:07:17 +0000346// DominatorTreeWrapperPass Implementation
347//===----------------------------------------------------------------------===//
348//
Chandler Carruth64764b42015-01-14 10:19:28 +0000349// The implementation details of the wrapper pass that holds a DominatorTree
350// suitable for use with the legacy pass manager.
Chandler Carruth73523022014-01-13 13:07:17 +0000351//
352//===----------------------------------------------------------------------===//
353
354char DominatorTreeWrapperPass::ID = 0;
355INITIALIZE_PASS(DominatorTreeWrapperPass, "domtree",
356 "Dominator Tree Construction", true, true)
357
358bool DominatorTreeWrapperPass::runOnFunction(Function &F) {
359 DT.recalculate(F);
360 return false;
361}
362
Adam Nemete340f852015-05-06 08:18:41 +0000363void DominatorTreeWrapperPass::verifyAnalysis() const {
David Green7c35de12018-02-28 11:00:08 +0000364 if (VerifyDomInfo)
365 assert(DT.verify(DominatorTree::VerificationLevel::Full));
366 else if (ExpensiveChecksEnabled)
367 assert(DT.verify(DominatorTree::VerificationLevel::Basic));
Adam Nemete340f852015-05-06 08:18:41 +0000368}
Chandler Carruth73523022014-01-13 13:07:17 +0000369
370void DominatorTreeWrapperPass::print(raw_ostream &OS, const Module *) const {
371 DT.print(OS);
372}
373
Brian M. Rzycki9b7ae232018-01-12 21:06:48 +0000374//===----------------------------------------------------------------------===//
375// DeferredDominance Implementation
376//===----------------------------------------------------------------------===//
377//
378// The implementation details of the DeferredDominance class which allows
379// one to queue updates to a DominatorTree.
380//
381//===----------------------------------------------------------------------===//
382
383/// \brief Queues multiple updates and discards duplicates.
384void DeferredDominance::applyUpdates(
385 ArrayRef<DominatorTree::UpdateType> Updates) {
386 SmallVector<DominatorTree::UpdateType, 8> Seen;
387 for (auto U : Updates)
388 // Avoid duplicates to applyUpdate() to save on analysis.
389 if (std::none_of(Seen.begin(), Seen.end(),
390 [U](DominatorTree::UpdateType S) { return S == U; })) {
391 Seen.push_back(U);
392 applyUpdate(U.getKind(), U.getFrom(), U.getTo());
393 }
394}
395
396/// \brief Helper method for a single edge insertion. It's almost always better
397/// to batch updates and call applyUpdates to quickly remove duplicate edges.
398/// This is best used when there is only a single insertion needed to update
399/// Dominators.
400void DeferredDominance::insertEdge(BasicBlock *From, BasicBlock *To) {
401 applyUpdate(DominatorTree::Insert, From, To);
402}
403
404/// \brief Helper method for a single edge deletion. It's almost always better
405/// to batch updates and call applyUpdates to quickly remove duplicate edges.
406/// This is best used when there is only a single deletion needed to update
407/// Dominators.
408void DeferredDominance::deleteEdge(BasicBlock *From, BasicBlock *To) {
409 applyUpdate(DominatorTree::Delete, From, To);
410}
411
412/// \brief Delays the deletion of a basic block until a flush() event.
413void DeferredDominance::deleteBB(BasicBlock *DelBB) {
414 assert(DelBB && "Invalid push_back of nullptr DelBB.");
415 assert(pred_empty(DelBB) && "DelBB has one or more predecessors.");
416 // DelBB is unreachable and all its instructions are dead.
417 while (!DelBB->empty()) {
418 Instruction &I = DelBB->back();
419 // Replace used instructions with an arbitrary value (undef).
420 if (!I.use_empty())
421 I.replaceAllUsesWith(llvm::UndefValue::get(I.getType()));
422 DelBB->getInstList().pop_back();
423 }
424 // Make sure DelBB has a valid terminator instruction. As long as DelBB is a
425 // Child of Function F it must contain valid IR.
426 new UnreachableInst(DelBB->getContext(), DelBB);
427 DeletedBBs.insert(DelBB);
428}
429
430/// \brief Returns true if DelBB is awaiting deletion at a flush() event.
431bool DeferredDominance::pendingDeletedBB(BasicBlock *DelBB) {
432 if (DeletedBBs.empty())
433 return false;
434 return DeletedBBs.count(DelBB) != 0;
435}
436
Brian M. Rzyckif1a7df52018-02-16 16:35:17 +0000437/// \brief Returns true if pending DT updates are queued for a flush() event.
438bool DeferredDominance::pending() { return !PendUpdates.empty(); }
439
Brian M. Rzycki9b7ae232018-01-12 21:06:48 +0000440/// \brief Flushes all pending updates and block deletions. Returns a
441/// correct DominatorTree reference to be used by the caller for analysis.
442DominatorTree &DeferredDominance::flush() {
443 // Updates to DT must happen before blocks are deleted below. Otherwise the
444 // DT traversal will encounter badref blocks and assert.
445 if (!PendUpdates.empty()) {
446 DT.applyUpdates(PendUpdates);
447 PendUpdates.clear();
448 }
449 flushDelBB();
450 return DT;
451}
452
453/// \brief Drops all internal state and forces a (slow) recalculation of the
454/// DominatorTree based on the current state of the LLVM IR in F. This should
455/// only be used in corner cases such as the Entry block of F being deleted.
456void DeferredDominance::recalculate(Function &F) {
457 // flushDelBB must be flushed before the recalculation. The state of the IR
458 // must be consistent before the DT traversal algorithm determines the
459 // actual DT.
460 if (flushDelBB() || !PendUpdates.empty()) {
461 DT.recalculate(F);
462 PendUpdates.clear();
463 }
464}
465
466/// \brief Debug method to help view the state of pending updates.
467#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
468LLVM_DUMP_METHOD void DeferredDominance::dump() const {
469 raw_ostream &OS = llvm::dbgs();
470 OS << "PendUpdates:\n";
471 int I = 0;
472 for (auto U : PendUpdates) {
473 OS << " " << I << " : ";
474 ++I;
475 if (U.getKind() == DominatorTree::Insert)
476 OS << "Insert, ";
477 else
478 OS << "Delete, ";
479 BasicBlock *From = U.getFrom();
480 if (From) {
481 auto S = From->getName();
482 if (!From->hasName())
483 S = "(no name)";
484 OS << S << "(" << From << "), ";
485 } else {
486 OS << "(badref), ";
487 }
488 BasicBlock *To = U.getTo();
489 if (To) {
490 auto S = To->getName();
491 if (!To->hasName())
492 S = "(no_name)";
493 OS << S << "(" << To << ")\n";
494 } else {
495 OS << "(badref)\n";
496 }
497 }
498 OS << "DeletedBBs:\n";
499 I = 0;
500 for (auto BB : DeletedBBs) {
501 OS << " " << I << " : ";
502 ++I;
503 if (BB->hasName())
504 OS << BB->getName() << "(";
505 else
506 OS << "(no_name)(";
507 OS << BB << ")\n";
508 }
509}
510#endif
511
512/// Apply an update (Kind, From, To) to the internal queued updates. The
513/// update is only added when determined to be necessary. Checks for
514/// self-domination, unnecessary updates, duplicate requests, and balanced
515/// pairs of requests are all performed. Returns true if the update is
516/// queued and false if it is discarded.
517bool DeferredDominance::applyUpdate(DominatorTree::UpdateKind Kind,
518 BasicBlock *From, BasicBlock *To) {
519 if (From == To)
520 return false; // Cannot dominate self; discard update.
521
522 // Discard updates by inspecting the current state of successors of From.
523 // Since applyUpdate() must be called *after* the Terminator of From is
524 // altered we can determine if the update is unnecessary.
525 bool HasEdge = std::any_of(succ_begin(From), succ_end(From),
526 [To](BasicBlock *B) { return B == To; });
527 if (Kind == DominatorTree::Insert && !HasEdge)
528 return false; // Unnecessary Insert: edge does not exist in IR.
529 if (Kind == DominatorTree::Delete && HasEdge)
530 return false; // Unnecessary Delete: edge still exists in IR.
531
532 // Analyze pending updates to determine if the update is unnecessary.
533 DominatorTree::UpdateType Update = {Kind, From, To};
534 DominatorTree::UpdateType Invert = {Kind != DominatorTree::Insert
535 ? DominatorTree::Insert
536 : DominatorTree::Delete,
537 From, To};
538 for (auto I = PendUpdates.begin(), E = PendUpdates.end(); I != E; ++I) {
539 if (Update == *I)
540 return false; // Discard duplicate updates.
541 if (Invert == *I) {
542 // Update and Invert are both valid (equivalent to a no-op). Remove
543 // Invert from PendUpdates and discard the Update.
544 PendUpdates.erase(I);
545 return false;
546 }
547 }
548 PendUpdates.push_back(Update); // Save the valid update.
549 return true;
550}
551
552/// Performs all pending basic block deletions. We have to defer the deletion
553/// of these blocks until after the DominatorTree updates are applied. The
554/// internal workings of the DominatorTree code expect every update's From
555/// and To blocks to exist and to be a member of the same Function.
556bool DeferredDominance::flushDelBB() {
557 if (DeletedBBs.empty())
558 return false;
559 for (auto *BB : DeletedBBs)
560 BB->eraseFromParent();
561 DeletedBBs.clear();
562 return true;
563}