Add verification functions to GVN which check to see that an instruction was
authorBill Wendling <isanbard@gmail.com>
Mon, 22 Dec 2008 21:36:08 +0000 (21:36 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 22 Dec 2008 21:36:08 +0000 (21:36 +0000)
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

index 6e532630c7b254f6667fe3e370788c109b925998..8a3b384b0632f1257b7427cca93f391fc5b62b82 100644 (file)
@@ -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<Value*, uint32_t>::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);
+}