Free memory used by initializers of global variables, created during linking
Manman Ren
mren at apple.com
Fri Jan 9 10:25:31 PST 2015
Hi Rafael,
Updated patch is attached. It updates the comments as suggested.
> On Jan 8, 2015, at 2:49 PM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
>
> + /// HACK: constants are currently owned by LLVMContext. It is conceptually
> + /// awkard for Module to delete them.
>
>
> N.B. might be more canonical than hack :-)
>
> Add something on the lines of: This can then only be called where all
> uses of the context are understood.
>
> + // Go through ArrayConstants and destroy constants without usage.
>
> The repeated comment in each loop doesn't add a lot of value. Just put
> a larger one at the start of the function saying that it goes over all
> constant stores.
>
> Can at least some of these loops use range loops?
Duncan already answered this. Thanks!
>
> What about ExprConstants?
Yes, added.
Thanks for reviewing,
Manman
-------------- next part --------------
A non-text attachment was scrubbed...
Name: append_gv2.patch
Type: application/octet-stream
Size: 3107 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150109/54989674/attachment.obj>
-------------- next part --------------
>
>
> On 8 January 2015 at 13:02, Manman Ren <mren at apple.com> wrote:
>> Hi All,
>>
>> ——————— The problem
>> Here is a simple example where we can have memory issue during LTO:
>> Suppose we have 3 .ll files (a.ll b.ll c.ll), each with "@llvm.compiler.used = appending global [3 x i8*]”.
>>
>> We currently create a new GlobalVariable with a new ConstantArray as its initializer (see linkAppendingVarProto and linkAppendingVarInit), when linking in each .ll file.
>> With our example, when linking b.ll, we will create a GlobalVariable (V_2) and a ConstantArray (CA_2) with 3+3 operands;
>> when linking c.ll, we will create another GlobalVariable (V_3) and a ConstantArray (CA_3) with 6+3 operands, we then delete the GlobalVariable V_2, but the memory occupied by CA_2 is not released.
>>
>> This will cause memory explosion when we are looking at 500 .ll files, each with "@llvm.compiler.used = appending global [100 x i8*]”.
>> A ConstantArray will be created when linking in each .ll file and its number of operands will be a sum of the operands from the previous .ll files.
>> We will create 499 ConstantArrays, with number of operands from 200, 300, …, 100*500. The total amount of memory allocated will be O(n^2) where n is # of .ll files linked.
>>
>> The application I was looking at used 18GB memory for these temporary ConstantArrays.
>>
>> ——————— The proposed solution
>> After off-line discussions with Rafael and Duncan, we are adding Module::dropTriviallyDeadConstants that gets the LLVMContextImpl, walks the various constant stores and removes the ones with no uses.
>>
>> Currently the owner of the Constants is LLVMContext, so we added comments for Module::dropTriviallyDeadConstants.
>> + /// Destroy constants in LLVMContext if they are not used.
>> + /// HACK: constants are currently owned by LLVMContext. It is conceptually
>> + /// awkard for Module to delete them.
>>
>> The plan is to move constants to “Module” after we are done with moving Metadata to “Module”.
>>
>> The patch is attached, please review!
>>
>> Thanks,
>> Manman
More information about the llvm-commits
mailing list