Fix BlockAddress::replaceUsesOfWithOnConstant to correctly
authorChris Lattner <sabre@nondot.org>
Sun, 1 Nov 2009 03:03:03 +0000 (03:03 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 1 Nov 2009 03:03:03 +0000 (03:03 +0000)
maintain the block use count in SubclassData.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85701 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index 2d3d71b6863c71f1897a9dafd1b33102f9325eb5..fe4f90af06da50bc92a92f50130e6c7a96586017 100644 (file)
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This file implements the Constant* classes...
+// This file implements the Constant* classes.
 //
 //===----------------------------------------------------------------------===//
 
@@ -1043,8 +1043,8 @@ BlockAddress *BlockAddress::get(Function *F, BasicBlock *BB) {
 BlockAddress::BlockAddress(Function *F, BasicBlock *BB)
 : Constant(Type::getInt8PtrTy(F->getContext()), Value::BlockAddressVal,
            &Op<0>(), 2) {
-  Op<0>() = F;
-  Op<1>() = BB;
+  setOperand(0, F);
+  setOperand(1, BB);
   BB->AdjustBlockAddressRefCount(1);
 }
 
@@ -1074,13 +1074,16 @@ void BlockAddress::replaceUsesOfWithOnConstant(Value *From, Value *To, Use *U) {
   BlockAddress *&NewBA =
     getContext().pImpl->BlockAddresses[std::make_pair(NewF, NewBB)];
   if (NewBA == 0) {
+    getBasicBlock()->AdjustBlockAddressRefCount(-1);
+    
     // Remove the old entry, this can't cause the map to rehash (just a
     // tombstone will get added).
     getContext().pImpl->BlockAddresses.erase(std::make_pair(getFunction(),
                                                             getBasicBlock()));
     NewBA = this;
-    Op<0>() = NewF;
-    Op<1>() = NewBB;
+    setOperand(0, NewF);
+    setOperand(1, NewBB);
+    getBasicBlock()->AdjustBlockAddressRefCount(1);
     return;
   }