@@ -326,6 +326,14 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
326
326
// with the CB BB ('Entry') between which the inlined callee will be pasted.
327
327
Successors.insert (succ_begin (&CallSiteBB), succ_end (&CallSiteBB));
328
328
329
+ // the outcome of the inlining may be that some edges get lost (DCEd BBs
330
+ // because inlining brought some constant, for example). We don't know which
331
+ // edges will be removed, so we list all of them as potentially removable.
332
+ for (auto *Succ : successors (&CallSiteBB))
333
+ DomTreeUpdates.emplace_back (DominatorTree::UpdateKind::Delete,
334
+ const_cast <BasicBlock *>(&CallSiteBB),
335
+ const_cast <BasicBlock *>(Succ));
336
+
329
337
// Inlining only handles invoke and calls. If this is an invoke, and inlining
330
338
// it pulls another invoke, the original landing pad may get split, so as to
331
339
// share its content with other potential users. So the edge up to which we
@@ -336,6 +344,11 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
336
344
if (const auto *II = dyn_cast<InvokeInst>(&CB)) {
337
345
const auto *UnwindDest = II->getUnwindDest ();
338
346
Successors.insert (succ_begin (UnwindDest), succ_end (UnwindDest));
347
+ // Same idea as above, we pretend we lose all these edges.
348
+ for (auto *Succ : successors (UnwindDest))
349
+ DomTreeUpdates.emplace_back (DominatorTree::UpdateKind::Delete,
350
+ const_cast <BasicBlock *>(UnwindDest),
351
+ const_cast <BasicBlock *>(Succ));
339
352
}
340
353
341
354
// Exclude the CallSiteBB, if it happens to be its own successor (1-BB loop).
@@ -356,6 +369,45 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
356
369
FPI.updateForBB (*BB, -1 );
357
370
}
358
371
372
+ DominatorTree &FunctionPropertiesUpdater::getUpdatedDominatorTree (
373
+ FunctionAnalysisManager &FAM) const {
374
+ auto &DT =
375
+ FAM.getResult <DominatorTreeAnalysis>(const_cast <Function &>(Caller));
376
+
377
+ SetVector<const BasicBlock *> NewSucc;
378
+ NewSucc.insert (succ_begin (&CallSiteBB), succ_end (&CallSiteBB));
379
+
380
+ // tell the DomTree about the new edges
381
+ std::deque<const BasicBlock *> Worklist;
382
+ Worklist.push_back (&CallSiteBB);
383
+
384
+ // Build the list of edges to actually remove. Those are those edges in the
385
+ // DomTreeUpdates that cannot be found in the CFG anymore.
386
+ SmallVector<DominatorTree::UpdateType, 2 > FinalDomTreeUpdates;
387
+ while (!Worklist.empty ()) {
388
+ auto *BB = Worklist.front ();
389
+ Worklist.pop_front ();
390
+ assert (DT.getNode (BB));
391
+
392
+ for (auto *Succ : NewSucc) {
393
+ if (!DT.getNode (Succ))
394
+ Worklist.push_back (Succ);
395
+ FinalDomTreeUpdates.push_back ({DominatorTree::UpdateKind::Insert,
396
+ const_cast <BasicBlock *>(BB),
397
+ const_cast <BasicBlock *>(Succ)});
398
+ }
399
+ }
400
+ for (auto &Upd : DomTreeUpdates)
401
+ if (!llvm::is_contained (successors (Upd.getFrom ()), Upd.getTo ()))
402
+ FinalDomTreeUpdates.push_back (Upd);
403
+
404
+ DT.applyUpdates (FinalDomTreeUpdates);
405
+ #ifdef EXPENSIVE_CHECKS
406
+ assert (DT.verify (DominatorTree::VerificationLevel::Full));
407
+ #endif
408
+ return DT;
409
+ }
410
+
359
411
void FunctionPropertiesUpdater::finish (FunctionAnalysisManager &FAM) const {
360
412
// Update feature values from the BBs that were copied from the callee, or
361
413
// might have been modified because of inlining. The latter have been
@@ -383,8 +435,7 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
383
435
// remove E.
384
436
SetVector<const BasicBlock *> Reinclude;
385
437
SetVector<const BasicBlock *> Unreachable;
386
- const auto &DT =
387
- FAM.getResult <DominatorTreeAnalysis>(const_cast <Function &>(Caller));
438
+ auto &DT = getUpdatedDominatorTree (FAM);
388
439
389
440
if (&CallSiteBB != &*Caller.begin ())
390
441
Reinclude.insert (&*Caller.begin ());
@@ -427,6 +478,9 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
427
478
428
479
const auto &LI = FAM.getResult <LoopAnalysis>(const_cast <Function &>(Caller));
429
480
FPI.updateAggregateStats (Caller, LI);
481
+ #ifdef EXPENSIVE_CHECKS
482
+ assert (isUpdateValid (Caller, FPI, FAM));
483
+ #endif
430
484
}
431
485
432
486
bool FunctionPropertiesUpdater::isUpdateValid (Function &F,
0 commit comments