Free memory used by initializers of global variables, created during linking
Manman Ren
mren at apple.com
Tue Jan 20 11:45:01 PST 2015
In r226592.
Thanks for reviewing!
Manman
> On Jan 19, 2015, at 12:34 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>
>>
>> On 2015-Jan-19, at 11:25, Manman Ren <mren at apple.com> wrote:
>>
>> Thanks Rafael and Duncan.
>>
>> Updated patch is attached. It adds
>> + /// Destroy ConstantArrays in LLVMContext if they are not used.
>> + /// ConstantArrays constructed during linking can cause quadratic memory
>> + /// explosion. Releasing all unused constants can cause a 20% LTO compile-time
>> + /// slowdown for a large application.
>> + /// NOTE: Constants are currently owned by LLVMContext. This can then only
>> + /// be called where all uses of the LLVMContext are understood.
>> + void dropTriviallyDeadConstantArrays();
>>
>>
>>> On Jan 16, 2015, at 6:17 PM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
>>>
>>>> A 20% slowdown seems excessive. Do I understand correctly that if you
>>>> don't delete unused `ConstantExpr`s there's no real slowdown?
>>
>> Without deleting “ConstantExprs”, the run time is 10 minutes, and it reduces the memory footprint from 22GB to 6GB.
>> If we delete unused “ConstantExprs”, the run time is 12 minutes, the memory footprint is about the same.
>>
>> Thanks,
>> Manman
>
> LGTM, once you fix a couple of comment nitpicks:
>
>> Index: include/llvm/IR/Module.h
>> ===================================================================
>> --- include/llvm/IR/Module.h (revision 226024)
>> +++ include/llvm/IR/Module.h (working copy)
>> @@ -630,6 +630,11 @@
>> named_metadata_end());
>> }
>>
>> + /// Destroy ConstantArrays in LLVMContext if they are not used.
>> + /// ConstantArrays constructed during linking can cause quadratic memory
>> + /// explosion. Releasing all unused constants can cause a 20% LTO compile-time
>> + /// slowdown for a large application.
>
> Can you add an empty (but commented) line here? This makes the NOTE
> jump out a bit more clearly.
>
> ///
>
>> + /// NOTE: Constants are currently owned by LLVMContext. This can then only
>> + /// be called where all uses of the LLVMContext are understood.
>> + void dropTriviallyDeadConstantArrays();
>> +
>> /// @}
>> /// @name Utility functions for printing and dumping Module objects
>> /// @{
>> Index: lib/IR/LLVMContextImpl.cpp
>> ===================================================================
>> --- lib/IR/LLVMContextImpl.cpp (revision 226024)
>> +++ lib/IR/LLVMContextImpl.cpp (working copy)
>> @@ -154,6 +154,95 @@
>> 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();
>> +}
>> +
>> // ConstantsContext anchors
>> void UnaryConstantExpr::anchor() { }
>>
>> Index: lib/IR/LLVMContextImpl.h
>> ===================================================================
>> --- lib/IR/LLVMContextImpl.h (revision 226024)
>> +++ lib/IR/LLVMContextImpl.h (working copy)
>> @@ -392,6 +392,10 @@
>>
>> LLVMContextImpl(LLVMContext &C);
>> ~LLVMContextImpl();
>> +
>> + /// Destroy the ConstantArrays if they are not
>
> This comment is incomplete.
>
>> + void dropTriviallyDeadConstantArrays();
>> };
>>
>> }
>> Index: lib/Linker/LinkModules.cpp
>> ===================================================================
>> --- lib/Linker/LinkModules.cpp (revision 226024)
>> +++ lib/Linker/LinkModules.cpp (working copy)
>> @@ -1721,7 +1721,9 @@
>> bool Linker::linkInModule(Module *Src) {
>> ModuleLinker TheLinker(Composite, IdentifiedStructTypes, Src,
>> DiagnosticHandler);
>> - return TheLinker.run();
>> + bool RetCode = TheLinker.run();
>> + Composite->dropTriviallyDeadConstantArrays();
>> + return RetCode;
>> }
>>
>> //===----------------------------------------------------------------------===//
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150120/bcd83d86/attachment.html>
More information about the llvm-commits
mailing list