Skip to content

Commit f6308b8

Browse files
committed
Reapply "[nfc][mlgo] Incrementally update DominatorTreeAnalysis in FunctionPropertiesAnalysis (#104867)
1 parent fc51797 commit f6308b8

File tree

3 files changed

+47
-3
lines changed

3 files changed

+47
-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: 41 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,30 @@ 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+
SmallVector<DominatorTree::UpdateType, 2> FinalDomTreeUpdates;
378+
379+
for (auto &Upd : DomTreeUpdates)
380+
FinalDomTreeUpdates.push_back(Upd);
381+
382+
DenseSet<const BasicBlock *> Inserted;
383+
for (auto *Succ : successors(&CallSiteBB))
384+
if (Inserted.insert(Succ).second)
385+
FinalDomTreeUpdates.push_back({DominatorTree::UpdateKind::Insert,
386+
const_cast<BasicBlock *>(&CallSiteBB),
387+
const_cast<BasicBlock *>(Succ)});
388+
389+
DT.applyUpdates(FinalDomTreeUpdates);
390+
#ifdef EXPENSIVE_CHECKS
391+
assert(DT.verify(DominatorTree::VerificationLevel::Full));
392+
#endif
393+
return DT;
394+
}
395+
359396
void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
360397
// Update feature values from the BBs that were copied from the callee, or
361398
// might have been modified because of inlining. The latter have been
@@ -383,8 +420,7 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
383420
// remove E.
384421
SetVector<const BasicBlock *> Reinclude;
385422
SetVector<const BasicBlock *> Unreachable;
386-
const auto &DT =
387-
FAM.getResult<DominatorTreeAnalysis>(const_cast<Function &>(Caller));
423+
auto &DT = getUpdatedDominatorTree(FAM);
388424

389425
if (&CallSiteBB != &*Caller.begin())
390426
Reinclude.insert(&*Caller.begin());
@@ -427,6 +463,9 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
427463

428464
const auto &LI = FAM.getResult<LoopAnalysis>(const_cast<Function &>(Caller));
429465
FPI.updateAggregateStats(Caller, LI);
466+
#ifdef EXPENSIVE_CHECKS
467+
assert(isUpdateValid(Caller, FPI, FAM));
468+
#endif
430469
}
431470

432471
bool FunctionPropertiesUpdater::isUpdateValid(Function &F,

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)