Devirtualizing Value destructor (PR889). Patch by Pawel Kunio!
[oota-llvm.git] / lib / VMCore / BasicBlock.cpp
index d45a1c41aa76f5400413ff4723cfb4a504c12ba3..ad9ad4204c95c60947aca38c9ac47a1e88ab1eee 100644 (file)
@@ -30,31 +30,9 @@ ilist_traits<Instruction>::getSymTab(BasicBlock *BB) {
   return 0;
 }
 
-
-namespace {
-  /// DummyInst - An instance of this class is used to mark the end of the
-  /// instruction list.  This is not a real instruction.
-  struct VISIBILITY_HIDDEN DummyInst : public Instruction {
-    DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) {
-      // This should not be garbage monitored.
-      LeakDetector::removeGarbageObject(this);
-    }
-
-    Instruction *clone() const {
-      assert(0 && "Cannot clone EOL");abort();
-      return 0;
-    }
-    const char *getOpcodeName() const { return "*end-of-list-inst*"; }
-
-    // Methods for support type inquiry through isa, cast, and dyn_cast...
-    static inline bool classof(const DummyInst *) { return true; }
-    static inline bool classof(const Instruction *I) {
-      return I->getOpcode() == OtherOpsEnd;
-    }
-    static inline bool classof(const Value *V) {
-      return isa<Instruction>(V) && classof(cast<Instruction>(V));
-    }
-  };
+DummyInst::DummyInst() : Instruction(Type::VoidTy, OtherOpsEnd, 0, 0) {
+  // This should not be garbage monitored.
+  LeakDetector::removeGarbageObject(this);
 }
 
 Instruction *ilist_traits<Instruction>::createSentinel() {
@@ -88,10 +66,12 @@ BasicBlock::BasicBlock(const std::string &Name, Function *NewParent,
 }
 
 
-BasicBlock::~BasicBlock() {
-  assert(getParent() == 0 && "BasicBlock still linked into the program!");
-  dropAllReferences();
-  InstList.clear();
+void BasicBlock::destroyThis(BasicBlock*v)
+{
+  assert(v->getParent() == 0 && "BasicBlock still linked into the program!");
+  v->dropAllReferences();
+  v->InstList.clear();
+  Value::destroyThis(v);       
 }
 
 void BasicBlock::setParent(Function *parent) {