[Dominators] Delete UpdateLevelsAfterInsertion in edge insertion of depth-based search for release builds

Summary:
After insertion of (From, To), v is affected iff
depth(NCD)+1 < depth(v) && path P from To to v exists where every w on P s.t. depth(v) <= depth(w)

All affected vertices change their idom to NCD.

If a vertex u has changed its depth, it must be a descendant of an
affected vertex v. Its depth must have been updated by UpdateLevel()
called by setIDom() of the first affected ancestor.

So UpdateLevelsAfterInsertion and its bookkeeping variable VisitedNotAffectedQueue are redundant.
Run them only in debug builds as a sanity check.

Reviewers: kuhar

Reviewed By: kuhar

Subscribers: kristina, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58369

llvm-svn: 354429
This commit is contained in:
Fangrui Song 2019-02-20 02:35:24 +00:00
parent 7cca803d4c
commit 476e1b9937
1 changed files with 12 additions and 15 deletions

View File

@ -632,7 +632,9 @@ struct SemiNCAInfo {
Bucket;
SmallDenseSet<TreeNodePtr, 8> Visited;
SmallVector<TreeNodePtr, 8> Affected;
SmallVector<TreeNodePtr, 8> VisitedNotAffectedQueue;
#ifndef NDEBUG
SmallVector<TreeNodePtr, 8> VisitedUnaffected;
#endif
};
static void InsertEdge(DomTreeT &DT, const BatchUpdatePtr BUI,
@ -800,8 +802,10 @@ struct SemiNCAInfo {
// vertices. Store it in UnaffectedOnCurrentLevel.
LLVM_DEBUG(dbgs() << "\t\tMarking visited not affected "
<< BlockNamePrinter(Succ) << "\n");
II.VisitedNotAffectedQueue.push_back(SuccTN);
UnaffectedOnCurrentLevel.push_back(SuccTN);
#ifndef NDEBUG
II.VisitedUnaffected.push_back(SuccTN);
#endif
} else {
// The condition is satisfied (Succ is affected). Add Succ to the
// bucket queue.
@ -833,22 +837,15 @@ struct SemiNCAInfo {
TN->setIDom(NCD);
}
UpdateLevelsAfterInsertion(II);
#ifndef NDEBUG
for (const TreeNodePtr TN : II.VisitedUnaffected)
assert(TN->getLevel() == TN->getIDom()->getLevel() + 1 &&
"TN should have been updated by an affected ancestor");
#endif
if (IsPostDom) UpdateRootsAfterUpdate(DT, BUI);
}
static void UpdateLevelsAfterInsertion(InsertionInfo &II) {
LLVM_DEBUG(
dbgs() << "Updating levels for visited but not affected nodes\n");
for (const TreeNodePtr TN : II.VisitedNotAffectedQueue) {
LLVM_DEBUG(dbgs() << "\tlevel(" << BlockNamePrinter(TN) << ") = ("
<< BlockNamePrinter(TN->getIDom()) << ") "
<< TN->getIDom()->getLevel() << " + 1\n");
TN->UpdateLevel();
}
}
// Handles insertion to previously unreachable nodes.
static void InsertUnreachable(DomTreeT &DT, const BatchUpdatePtr BUI,
const TreeNodePtr From, const NodePtr To) {