From 2aa97100dac93b1a08067de9b82824dabf765336 Mon Sep 17 00:00:00 2001 From: Jakub Kuderski Date: Sat, 14 Oct 2017 03:00:56 +0000 Subject: [PATCH] [Dominators] Remove the NCA check Summary: This patch removes the `verifyNCD` check. The reason for this is that the other checks are sufficient to prove or disprove correctness of any DominatorTree, and that `verifyNCD` doesn't provide (in my option) better error messages then the other ones. Additionally, this should give a (small) improvement to the total verification time, as the check is O(n), and checking the sibling property takes O(n^3). Reviewers: dberlin, grosser, davide, brzycki Reviewed By: brzycki Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38802 llvm-svn: 315790 --- .../llvm/Support/GenericDomTreeConstruction.h | 39 +------------------ 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/include/llvm/Support/GenericDomTreeConstruction.h b/include/llvm/Support/GenericDomTreeConstruction.h index 460110eb70b..8f801662d0f 100644 --- a/include/llvm/Support/GenericDomTreeConstruction.h +++ b/include/llvm/Support/GenericDomTreeConstruction.h @@ -1461,40 +1461,6 @@ struct SemiNCAInfo { return true; } - // Checks if for every edge From -> To in the graph - // NCD(From, To) == IDom(To) or To. - bool verifyNCD(const DomTreeT &DT) { - clear(); - doFullDFSWalk(DT, AlwaysDescend); - - for (auto &BlockToInfo : NodeToInfo) { - auto &Info = BlockToInfo.second; - - const NodePtr From = NumToNode[Info.Parent]; - if (!From) continue; - - const NodePtr To = BlockToInfo.first; - const TreeNodePtr ToTN = DT.getNode(To); - assert(ToTN); - - const NodePtr NCD = DT.findNearestCommonDominator(From, To); - const TreeNodePtr NCDTN = DT.getNode(NCD); - const TreeNodePtr ToIDom = ToTN->getIDom(); - if (NCDTN != ToTN && NCDTN != ToIDom) { - errs() << "NearestCommonDominator verification failed:\n\tNCD(From:" - << BlockNamePrinter(From) << ", To:" << BlockNamePrinter(To) - << ") = " << BlockNamePrinter(NCD) - << ",\t (should be To or IDom[To]: " << BlockNamePrinter(ToIDom) - << ")\n"; - errs().flush(); - - return false; - } - } - - return true; - } - // The below routines verify the correctness of the dominator tree relative to // the CFG it's coming from. A tree is a dominator tree iff it has two // properties, called the parent property and the sibling property. Tarjan @@ -1632,9 +1598,8 @@ template bool Verify(const DomTreeT &DT) { SemiNCAInfo SNCA(nullptr); return SNCA.verifyRoots(DT) && SNCA.verifyReachability(DT) && - SNCA.VerifyLevels(DT) && SNCA.verifyNCD(DT) && - SNCA.verifyParentProperty(DT) && SNCA.verifySiblingProperty(DT) && - SNCA.VerifyDFSNumbers(DT); + SNCA.VerifyLevels(DT) && SNCA.verifyParentProperty(DT) && + SNCA.verifySiblingProperty(DT) && SNCA.VerifyDFSNumbers(DT); } } // namespace DomTreeBuilder