From 246dbbb8befcb04abb5451d73b5d94f7d21f22c6 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 22 Dec 2008 21:36:08 +0000 Subject: [PATCH] Add verification functions to GVN which check to see that an instruction was truely deleted. These will be expanded with further checks of all of the data structures. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61347 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 6e532630c7b..8a3b384b063 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -173,6 +173,7 @@ namespace { void setMemDep(MemoryDependenceAnalysis* M) { MD = M; } void setDomTree(DominatorTree* D) { DT = D; } uint32_t getNextUnusedValueNumber() { return nextValueNumber; } + void verifyRemoved(const Value *) const; }; } @@ -678,6 +679,15 @@ void ValueTable::erase(Value* V) { valueNumbering.erase(V); } +/// verifyRemoved - Verify that the value is removed from all internal data +/// structures. +void ValueTable::verifyRemoved(const Value *V) const { + for (DenseMap::iterator + I = valueNumbering.begin(), E = valueNumbering.end(); I != E; ++I) { + assert(I->first != V && "Inst still occurs in value numbering map!"); + } +} + //===----------------------------------------------------------------------===// // GVN Pass //===----------------------------------------------------------------------===// @@ -741,6 +751,7 @@ namespace { bool mergeBlockIntoPredecessor(BasicBlock* BB); Value* AttemptRedundancyElimination(Instruction* orig, unsigned valno); void cleanupGlobalSets(); + void verifyRemoved(const Instruction *I) const; }; char GVN::ID = 0; @@ -859,6 +870,7 @@ Value *GVN::GetValueForBlock(BasicBlock *BB, Instruction* orig, DEBUG(cerr << "GVN removed: " << *PN); MD->removeInstruction(PN); PN->eraseFromParent(); + DEBUG(verifyRemoved(PN)); Phis[BB] = v; return v; @@ -1640,3 +1652,9 @@ void GVN::cleanupGlobalSets() { delete I->second; localAvail.clear(); } + +/// verifyRemoved - Verify that the specified instruction does not occur in our +/// internal data structures. +void GVN::verifyRemoved(const Instruction *I) const { + VN.verifyRemoved(I); +}