Skip to content

Commit

Permalink
[MachineDominatorTree] Add a MDT verifier.
Browse files Browse the repository at this point in the history
Differential Revision: http://reviews.llvm.org/D21657

llvm-svn: 273678
  • Loading branch information
Chad Rosier committed Jun 24, 2016
1 parent f092cc8 commit fd34280
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
23 changes: 23 additions & 0 deletions llvm/include/llvm/CodeGen/MachineDominators.h
Expand Up @@ -216,6 +216,8 @@ class MachineDominatorTree : public MachineFunctionPass {

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
Expand All @@ -239,6 +241,27 @@ class MachineDominatorTree : public MachineFunctionPass {
"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;
};

//===-------------------------------------
Expand Down
30 changes: 30 additions & 0 deletions llvm/lib/CodeGen/MachineDominators.cpp
Expand Up @@ -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<bool, true> VerifyMachineDomInfoX(
"verify-machine-dom-info", cl::location(VerifyMachineDomInfo),
cl::desc("Verify machine dominator info (time consuming)"));

namespace llvm {
template class DomTreeNodeBase<MachineBasicBlock>;
template class DominatorTreeBase<MachineBasicBlock>;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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();
}
}
2 changes: 1 addition & 1 deletion llvm/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:
Expand Down

0 comments on commit fd34280

Please sign in to comment.