diff --git a/llvm/include/llvm/BasicBlock.h b/llvm/include/llvm/BasicBlock.h index c6e60802093f..10f2577869ec 100644 --- a/llvm/include/llvm/BasicBlock.h +++ b/llvm/include/llvm/BasicBlock.h @@ -23,6 +23,7 @@ namespace llvm { class TerminatorInst; class LLVMContext; +class BlockAddress; template<> struct ilist_traits : public SymbolTableListTraits { @@ -66,7 +67,7 @@ private: /// @brief LLVM Basic Block Representation class BasicBlock : public Value, // Basic blocks are data objects also public ilist_node { - + friend class BlockAddress; public: typedef iplist InstListType; private: @@ -238,7 +239,15 @@ public: /// hasAddressTaken - returns true if there are any uses of this basic block /// other than direct branches, switches, etc. to it. - bool hasAddressTaken() const; + bool hasAddressTaken() const { return SubclassData != 0; } +private: + /// AdjustBlockAddressRefCount - BasicBlock stores the number of BlockAddress + /// objects using it. This is almost always 0, sometimes one, possibly but + /// almost never 2, and inconceivably 3 or more. + void AdjustBlockAddressRefCount(int Amt) { + SubclassData += Amt; + assert((int)(char)SubclassData >= 0 && "Refcount wrap-around"); + } }; } // End llvm namespace diff --git a/llvm/lib/VMCore/BasicBlock.cpp b/llvm/lib/VMCore/BasicBlock.cpp index ede2d1245107..e8069c0f0532 100644 --- a/llvm/lib/VMCore/BasicBlock.cpp +++ b/llvm/lib/VMCore/BasicBlock.cpp @@ -278,11 +278,3 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) { return New; } -/// hasAddressTaken - returns true if there are any uses of this basic block -/// other than direct branches, switches, etc. to it. -bool BasicBlock::hasAddressTaken() const { - for (Value::use_const_iterator I = use_begin(), E = use_end(); I != E; ++I) - if (isa(*I)) - return true; - return false; -} diff --git a/llvm/lib/VMCore/Constants.cpp b/llvm/lib/VMCore/Constants.cpp index 0d7fabacea7b..2d3d71b6863c 100644 --- a/llvm/lib/VMCore/Constants.cpp +++ b/llvm/lib/VMCore/Constants.cpp @@ -44,7 +44,7 @@ using namespace llvm; // Constructor to create a '0' constant of arbitrary type... static const uint64_t zero[2] = {0, 0}; -Constant* Constant::getNullValue(const Type* Ty) { +Constant *Constant::getNullValue(const Type *Ty) { switch (Ty->getTypeID()) { case Type::IntegerTyID: return ConstantInt::get(Ty, 0); @@ -72,7 +72,7 @@ Constant* Constant::getNullValue(const Type* Ty) { } } -Constant* Constant::getIntegerValue(const Type* Ty, const APInt &V) { +Constant* Constant::getIntegerValue(const Type *Ty, const APInt &V) { const Type *ScalarTy = Ty->getScalarType(); // Create the base integer constant. @@ -89,13 +89,13 @@ Constant* Constant::getIntegerValue(const Type* Ty, const APInt &V) { return C; } -Constant* Constant::getAllOnesValue(const Type* Ty) { - if (const IntegerType* ITy = dyn_cast(Ty)) +Constant* Constant::getAllOnesValue(const Type *Ty) { + if (const IntegerType *ITy = dyn_cast(Ty)) return ConstantInt::get(Ty->getContext(), APInt::getAllOnesValue(ITy->getBitWidth())); std::vector Elts; - const VectorType* VTy = cast(Ty); + const VectorType *VTy = cast(Ty); Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType())); assert(Elts[0] && "Not a vector integer type!"); return cast(ConstantVector::get(Elts)); @@ -1045,6 +1045,7 @@ BlockAddress::BlockAddress(Function *F, BasicBlock *BB) &Op<0>(), 2) { Op<0>() = F; Op<1>() = BB; + BB->AdjustBlockAddressRefCount(1); } @@ -1053,6 +1054,7 @@ BlockAddress::BlockAddress(Function *F, BasicBlock *BB) void BlockAddress::destroyConstant() { getFunction()->getType()->getContext().pImpl ->BlockAddresses.erase(std::make_pair(getFunction(), getBasicBlock())); + getBasicBlock()->AdjustBlockAddressRefCount(-1); destroyConstantImpl(); }