summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/CodeGen/MachineDominators.h23
-rw-r--r--llvm/lib/CodeGen/MachineDominators.cpp30
-rw-r--r--llvm/test/CodeGen/AArch64/tailmerging_in_mbp.ll2
3 files changed, 54 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/MachineDominators.h b/llvm/include/llvm/CodeGen/MachineDominators.h
index a69936f6e26..ed7cc277e8b 100644
--- a/llvm/include/llvm/CodeGen/MachineDominators.h
+++ b/llvm/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/llvm/lib/CodeGen/MachineDominators.cpp b/llvm/lib/CodeGen/MachineDominators.cpp
index 3f04bb0b532..be6778ac17a 100644
--- a/llvm/lib/CodeGen/MachineDominators.cpp
+++ b/llvm/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<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>;
@@ -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/llvm/test/CodeGen/AArch64/tailmerging_in_mbp.ll b/llvm/test/CodeGen/AArch64/tailmerging_in_mbp.ll
index 29df9def992..d850801ee54 100644
--- a/llvm/test/CodeGen/AArch64/tailmerging_in_mbp.ll
+++ b/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:
OpenPOWER on IntegriCloud