Skip to content

Commit 67295e1

Browse files
committed
[nfc] Incrementally update DominatorTreeAnalysis in FunctionPropertiesAnalysis
1 parent c442025 commit 67295e1

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#define LLVM_ANALYSIS_FUNCTIONPROPERTIESANALYSIS_H
1616

1717
#include "llvm/ADT/DenseSet.h"
18+
#include "llvm/IR/Dominators.h"
1819
#include "llvm/IR/PassManager.h"
1920

2021
namespace llvm {
@@ -186,7 +187,12 @@ class FunctionPropertiesUpdater {
186187
static bool isUpdateValid(Function &F, const FunctionPropertiesInfo &FPI,
187188
FunctionAnalysisManager &FAM);
188189

190+
DominatorTree &getUpdatedDominatorTree(FunctionAnalysisManager &FAM) const;
191+
189192
DenseSet<const BasicBlock *> Successors;
193+
194+
// Edges we might potentially need to remove from the dominator tree.
195+
SmallVector<DominatorTree::UpdateType, 2> DomTreeUpdates;
190196
};
191197
} // namespace llvm
192198
#endif // LLVM_ANALYSIS_FUNCTIONPROPERTIESANALYSIS_H

llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,14 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
326326
// with the CB BB ('Entry') between which the inlined callee will be pasted.
327327
Successors.insert(succ_begin(&CallSiteBB), succ_end(&CallSiteBB));
328328

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+
329337
// Inlining only handles invoke and calls. If this is an invoke, and inlining
330338
// it pulls another invoke, the original landing pad may get split, so as to
331339
// share its content with other potential users. So the edge up to which we
@@ -336,6 +344,11 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
336344
if (const auto *II = dyn_cast<InvokeInst>(&CB)) {
337345
const auto *UnwindDest = II->getUnwindDest();
338346
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));
339352
}
340353

341354
// Exclude the CallSiteBB, if it happens to be its own successor (1-BB loop).
@@ -356,6 +369,40 @@ FunctionPropertiesUpdater::FunctionPropertiesUpdater(
356369
FPI.updateForBB(*BB, -1);
357370
}
358371

372+
DominatorTree &FunctionPropertiesUpdater::getUpdatedDominatorTree(
373+
FunctionAnalysisManager &FAM) const {
374+
auto &DT =
375+
FAM.getResult<DominatorTreeAnalysis>(const_cast<Function &>(Caller));
376+
377+
DenseSet<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+
while (!Worklist.empty()) {
384+
auto *BB = Worklist.front();
385+
Worklist.pop_front();
386+
assert(DT.getNode(BB));
387+
388+
for (auto *Succ : NewSucc) {
389+
if (!DT.getNode(Succ))
390+
Worklist.push_back(Succ);
391+
DT.insertEdge(const_cast<BasicBlock *>(BB),
392+
const_cast<BasicBlock *>(Succ));
393+
}
394+
}
395+
// Build the list of edges to actually remove. Those are those edges in the
396+
// DomTreeUpdates that cannot be found in the CFG anymore.
397+
SmallVector<DominatorTree::UpdateType, 2> FinalDomTreeUpdates;
398+
for (auto &Upd : DomTreeUpdates)
399+
if (!llvm::is_contained(successors(Upd.getFrom()), Upd.getTo()))
400+
FinalDomTreeUpdates.push_back(Upd);
401+
402+
DT.applyUpdates(FinalDomTreeUpdates);
403+
return DT;
404+
}
405+
359406
void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
360407
// Update feature values from the BBs that were copied from the callee, or
361408
// might have been modified because of inlining. The latter have been
@@ -383,8 +430,7 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
383430
// remove E.
384431
SetVector<const BasicBlock *> Reinclude;
385432
SetVector<const BasicBlock *> Unreachable;
386-
const auto &DT =
387-
FAM.getResult<DominatorTreeAnalysis>(const_cast<Function &>(Caller));
433+
auto &DT = getUpdatedDominatorTree(FAM);
388434

389435
if (&CallSiteBB != &*Caller.begin())
390436
Reinclude.insert(&*Caller.begin());

llvm/lib/Analysis/MLInlineAdvisor.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,6 @@ void MLInlineAdvisor::onSuccessfulInlining(const MLInlineAdvice &Advice,
288288
{
289289
PreservedAnalyses PA = PreservedAnalyses::all();
290290
PA.abandon<FunctionPropertiesAnalysis>();
291-
PA.abandon<DominatorTreeAnalysis>();
292291
PA.abandon<LoopAnalysis>();
293292
FAM.invalidate(*Caller, PA);
294293
}

0 commit comments

Comments
 (0)