From 6b18a3994bc05a7f47fd92bf02ecdfa231d26ef5 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. llvm-svn: 61347 --- llvm/lib/Transforms/Scalar/GVN.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 6e532630c7b2..8a3b384b0632 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/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); +}