From 238d855bdcdc1ac515b8f10b89dd358754d94bd6 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 24 Jun 2016 13:32:22 +0000 Subject: [PATCH] [MachineDominatorTree] Add a MDT verifier. Differential Revision: http://reviews.llvm.org/D21657 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273678 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/MachineDominators.h | 23 +++++++++++++++++ lib/CodeGen/MachineDominators.cpp | 30 ++++++++++++++++++++++ test/CodeGen/AArch64/tailmerging_in_mbp.ll | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/include/llvm/CodeGen/MachineDominators.h b/include/llvm/CodeGen/MachineDominators.h index a69936f6e26..ed7cc277e8b 100644 --- a/include/llvm/CodeGen/MachineDominators.h +++ b/include/llvm/CodeGen/MachineDominators.h @@ -216,6 +216,8 @@ public: void releaseMemory() override; + void verifyAnalysis() const override; + void print(raw_ostream &OS, const Module*) const override; /// \brief Record that the critical edge (FromBB, ToBB) has been @@ -239,6 +241,27 @@ public: "A basic block inserted via edge splitting cannot appear twice"); CriticalEdgesToSplit.push_back({FromBB, ToBB, NewBB}); } + + /// \brief Returns *false* if the other dominator tree matches this dominator + /// tree. + inline bool compare(const MachineDominatorTree &Other) const { + const MachineDomTreeNode *R = getRootNode(); + const MachineDomTreeNode *OtherR = Other.getRootNode(); + + if (!R || !OtherR || R->getBlock() != OtherR->getBlock()) + return true; + + if (DT->compare(*Other.DT)) + return true; + + return false; + } + + /// \brief Verify the correctness of the domtree by re-computing it. + /// + /// This should only be used for debugging as it aborts the program if the + /// verification fails. + void verifyDomTree() const; }; //===------------------------------------- diff --git a/lib/CodeGen/MachineDominators.cpp b/lib/CodeGen/MachineDominators.cpp index 3f04bb0b532..be6778ac17a 100644 --- a/lib/CodeGen/MachineDominators.cpp +++ b/lib/CodeGen/MachineDominators.cpp @@ -15,9 +15,20 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/Passes.h" #include "llvm/ADT/SmallBitVector.h" +#include "llvm/Support/CommandLine.h" using namespace llvm; +// FIXME: Always verify dominfo if expensive checking is enabled. +#ifdef EXPENSIVE_CHECKS +static bool VerifyMachineDomInfo = false; +#else +static bool VerifyMachineDomInfo = false; +#endif +static cl::opt VerifyMachineDomInfoX( + "verify-machine-dom-info", cl::location(VerifyMachineDomInfo), + cl::desc("Verify machine dominator info (time consuming)")); + namespace llvm { template class DomTreeNodeBase; template class DominatorTreeBase; @@ -57,6 +68,11 @@ void MachineDominatorTree::releaseMemory() { DT->releaseMemory(); } +void MachineDominatorTree::verifyAnalysis() const { + if (VerifyMachineDomInfo) + verifyDomTree(); +} + void MachineDominatorTree::print(raw_ostream &OS, const Module*) const { DT->print(OS); } @@ -125,3 +141,17 @@ void MachineDominatorTree::applySplitCriticalEdges() const { NewBBs.clear(); CriticalEdgesToSplit.clear(); } + +void MachineDominatorTree::verifyDomTree() const { + MachineFunction &F = *getRoot()->getParent(); + + MachineDominatorTree OtherDT; + OtherDT.DT->recalculate(F); + if (compare(OtherDT)) { + errs() << "MachineDominatorTree is not up to date!\nComputed:\n"; + print(errs(), nullptr); + errs() << "\nActual:\n"; + OtherDT.print(errs(), nullptr); + abort(); + } +} diff --git a/test/CodeGen/AArch64/tailmerging_in_mbp.ll b/test/CodeGen/AArch64/tailmerging_in_mbp.ll index 29df9def992..d850801ee54 100644 --- a/test/CodeGen/AArch64/tailmerging_in_mbp.ll +++ b/test/CodeGen/AArch64/tailmerging_in_mbp.ll @@ -1,4 +1,4 @@ -; RUN: llc <%s -march=aarch64 | FileCheck %s +; RUN: llc <%s -march=aarch64 -verify-machine-dom-info | FileCheck %s ; CHECK-LABEL: test: ; CHECK: LBB0_7: -- 2.50.1