From d0ec2352ae14acd4526ac04783e28c3280a26fb8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 1 Nov 2009 03:03:03 +0000 Subject: [PATCH] Fix BlockAddress::replaceUsesOfWithOnConstant to correctly 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 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 2d3d71b6863..fe4f90af06d 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -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; }