diff options
Diffstat (limited to 'llvm/lib/IR/LLVMContextImpl.cpp')
-rw-r--r-- | llvm/lib/IR/LLVMContextImpl.cpp | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp index 5f9782714170..f197b3e67d30 100644 --- a/llvm/lib/IR/LLVMContextImpl.cpp +++ b/llvm/lib/IR/LLVMContextImpl.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "LLVMContextImpl.h" +#include "llvm/ADT/SetVector.h" #include "llvm/IR/Module.h" #include "llvm/IR/OptBisect.h" #include "llvm/IR/Type.h" @@ -25,6 +26,7 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C) VoidTy(C, Type::VoidTyID), LabelTy(C, Type::LabelTyID), HalfTy(C, Type::HalfTyID), + BFloatTy(C, Type::BFloatTyID), FloatTy(C, Type::FloatTyID), DoubleTy(C, Type::DoubleTyID), MetadataTy(C, Type::MetadataTyID), @@ -103,21 +105,6 @@ LLVMContextImpl::~LLVMContextImpl() { delete CDSConstant.second; CDSConstants.clear(); - // Destroy attributes. - for (FoldingSetIterator<AttributeImpl> I = AttrsSet.begin(), - E = AttrsSet.end(); I != E; ) { - FoldingSetIterator<AttributeImpl> Elem = I++; - delete &*Elem; - } - - // Destroy attribute lists. - for (FoldingSetIterator<AttributeListImpl> I = AttrsLists.begin(), - E = AttrsLists.end(); - I != E;) { - FoldingSetIterator<AttributeListImpl> Elem = I++; - delete &*Elem; - } - // Destroy attribute node lists. for (FoldingSetIterator<AttributeSetNode> I = AttrsSetNodes.begin(), E = AttrsSetNodes.end(); I != E; ) { @@ -142,18 +129,19 @@ LLVMContextImpl::~LLVMContextImpl() { } void LLVMContextImpl::dropTriviallyDeadConstantArrays() { - bool Changed; - do { - Changed = false; - - for (auto I = ArrayConstants.begin(), E = ArrayConstants.end(); I != E;) { - auto *C = *I++; - if (C->use_empty()) { - Changed = true; - C->destroyConstant(); + SmallSetVector<ConstantArray *, 4> WorkList(ArrayConstants.begin(), + ArrayConstants.end()); + + while (!WorkList.empty()) { + ConstantArray *C = WorkList.pop_back_val(); + if (C->use_empty()) { + for (const Use &Op : C->operands()) { + if (auto *COp = dyn_cast<ConstantArray>(Op)) + WorkList.insert(COp); } + C->destroyConstant(); } - } while (Changed); + } } void Module::dropTriviallyDeadConstantArrays() { |