summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/LLVMContextImpl.cpp
diff options
context:
space:
mode:
authorManman Ren <manman.ren@gmail.com>2015-01-20 19:24:59 +0000
committerManman Ren <manman.ren@gmail.com>2015-01-20 19:24:59 +0000
commitdab999d54f39af3ebb6a23e850dbc9742016fac8 (patch)
tree36a67ed7114bc57ab553f0436406dd61cad880e9 /llvm/lib/IR/LLVMContextImpl.cpp
parent3a70d07f5178086c589c67dffcf649c635e35972 (diff)
downloadbcm5719-llvm-dab999d54f39af3ebb6a23e850dbc9742016fac8.tar.gz
bcm5719-llvm-dab999d54f39af3ebb6a23e850dbc9742016fac8.zip
[llvm link] Destroy ConstantArrays in LLVMContext if they are not used.
ConstantArrays constructed during linking can cause quadratic memory explosion. An example is the ConstantArrays constructed when linking in GlobalVariables with appending linkage. Releasing all unused constants can cause a 20% LTO compile-time slowdown for a large application. So this commit releases unused ConstantArrays only. rdar://19040716. It reduces memory footprint from 20+G to 6+G. llvm-svn: 226592
Diffstat (limited to 'llvm/lib/IR/LLVMContextImpl.cpp')
-rw-r--r--llvm/lib/IR/LLVMContextImpl.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp
index aa7242af997..880e1c1bcad 100644
--- a/llvm/lib/IR/LLVMContextImpl.cpp
+++ b/llvm/lib/IR/LLVMContextImpl.cpp
@@ -163,6 +163,28 @@ LLVMContextImpl::~LLVMContextImpl() {
MDStringCache.clear();
}
+void LLVMContextImpl::dropTriviallyDeadConstantArrays() {
+ bool Changed;
+ do {
+ Changed = false;
+
+ for (auto I = ArrayConstants.map_begin(), E = ArrayConstants.map_end();
+ I != E; ) {
+ auto *C = I->first;
+ I++;
+ if (C->use_empty()) {
+ Changed = true;
+ C->destroyConstant();
+ }
+ }
+
+ } while (Changed);
+}
+
+void Module::dropTriviallyDeadConstantArrays() {
+ Context.pImpl->dropTriviallyDeadConstantArrays();
+}
+
namespace llvm {
/// \brief Make MDOperand transparent for hashing.
///
OpenPOWER on IntegriCloud