diff --git a/include/llvm/IR/Instructions.h b/include/llvm/IR/Instructions.h index 5e216f0c0cf..131de3db3c5 100644 --- a/include/llvm/IR/Instructions.h +++ b/include/llvm/IR/Instructions.h @@ -2265,7 +2265,6 @@ public: const Twine &NameStr, BasicBlock *InsertAtEnd) { return new PHINode(Ty, NumReservedValues, NameStr, InsertAtEnd); } - ~PHINode() override; /// Provide fast operand accessors DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); @@ -2458,7 +2457,6 @@ public: static LandingPadInst *Create(Type *RetTy, Value *PersonalityFn, unsigned NumReservedClauses, const Twine &NameStr, BasicBlock *InsertAtEnd); - ~LandingPadInst() override; /// Provide fast operand accessors DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); @@ -2857,8 +2855,6 @@ public: return new SwitchInst(Value, Default, NumCases, InsertAtEnd); } - ~SwitchInst() override; - /// Provide fast operand accessors DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); @@ -3043,7 +3039,6 @@ public: BasicBlock *InsertAtEnd) { return new IndirectBrInst(Address, NumDests, InsertAtEnd); } - ~IndirectBrInst() override; /// Provide fast operand accessors. DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); diff --git a/include/llvm/IR/User.h b/include/llvm/IR/User.h index df6034d0b48..b68dcf9cc24 100644 --- a/include/llvm/IR/User.h +++ b/include/llvm/IR/User.h @@ -58,14 +58,16 @@ protected: /// \param IsPhi identifies callers which are phi nodes and which need /// N BasicBlock* allocated along with N Use *allocHungoffUses(unsigned N, bool IsPhi = false); - void dropHungoffUses() { - Use::zap(OperandList, OperandList + NumOperands, true); - OperandList = nullptr; - // Reset NumOperands so User::operator delete() does the right thing. - NumOperands = 0; - } public: - ~User() override { Use::zap(OperandList, OperandList + NumOperands); } + ~User() override { + // drop the hung off uses. + Use::zap(OperandList, OperandList + NumOperands, HasHungOffUses); + if (HasHungOffUses) { + OperandList = nullptr; + // Reset NumOperands so User::operator delete() does the right thing. + NumOperands = 0; + } + } /// \brief Free memory allocated for User and Use objects. void operator delete(void *Usr); /// \brief Placement delete - required by std, but never called. diff --git a/lib/IR/Instructions.cpp b/lib/IR/Instructions.cpp index 06e2d0913ce..9c8f66c11de 100644 --- a/lib/IR/Instructions.cpp +++ b/lib/IR/Instructions.cpp @@ -93,10 +93,6 @@ PHINode::PHINode(const PHINode &PN) SubclassOptionalData = PN.SubclassOptionalData; } -PHINode::~PHINode() { - dropHungoffUses(); -} - // removeIncomingValue - Remove an incoming value. This is useful if a // predecessor basic block is deleted. Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) { @@ -190,10 +186,6 @@ LandingPadInst::LandingPadInst(const LandingPadInst &LP) setCleanup(LP.isCleanup()); } -LandingPadInst::~LandingPadInst() { - dropHungoffUses(); -} - LandingPadInst *LandingPadInst::Create(Type *RetTy, Value *PersonalityFn, unsigned NumReservedClauses, const Twine &NameStr, @@ -3325,10 +3317,6 @@ SwitchInst::SwitchInst(const SwitchInst &SI) SubclassOptionalData = SI.SubclassOptionalData; } -SwitchInst::~SwitchInst() { - dropHungoffUses(); -} - /// addCase - Add an entry to the switch instruction... /// @@ -3450,10 +3438,6 @@ IndirectBrInst::IndirectBrInst(const IndirectBrInst &IBI) SubclassOptionalData = IBI.SubclassOptionalData; } -IndirectBrInst::~IndirectBrInst() { - dropHungoffUses(); -} - /// addDestination - Add a destination. /// void IndirectBrInst::addDestination(BasicBlock *DestBB) {