[PATCH] Use Rvalue refs in APInt
Pete Cooper via llvm-commits
llvm-commits at lists.llvm.org
Tue May 31 18:33:47 PDT 2016
> On May 31, 2016, at 6:29 PM, Matthias Braun <mbraun at apple.com> wrote:
>
> I've seen those APInt allocations being an actual compiletime problem as well. Back at the time I had the idea that we may be able to create APInt variants that allocate their data with a BumpPtrAllocator which we could store with the SCEV pass.. I never got around to actual work on that though.
Yeah, i’ve been wondering about a BumpPtrAllocator, or even just a greater amount of inline storage. An APInt is effectively a SmallVector<uint64_t, 1> in some sense but could have 2 or even more elements inline if it made sense.
Given that the majority of long-lived APInt’s are uniqued inside ConstantInt, we may not even see much of a peak memory increase by doing this. But its just a theory right now, and may be complicated to even try it.
Cheers,
Pete
>
> - Matthias
>
>> On May 31, 2016, at 6:06 PM, Pete Cooper via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>>
>> Hi David, Chandler
>>
>> I’ve been measuring the number of allocations in LLVM and see millions of APInt’s in the trace.
>>
>> The majority of the traces come from things like ConstantRange where its common to see expressions like 'this_max * Other_max + 1’ (from ConstantRange::multiply).
>>
>> This patch attempts to reduce the number of allocations with r-value refs on expressions such as these. Using the bitcode for verify-uselistorder, this reduces the total number of allocations with ‘opt -O2 verify-uselistorder’ from 19.5m to 19.1m.
>>
>> There are also compiler time wins to be had. Before I started reducing the allocations, ConstantRange::multiply was 6.5% of ‘opt -O2’ time on this use case, and after a series of patches to reduce its allocations from 26m to 16m, it drops to about 2.5% of compile time.
>>
>> I’ve only covered the case where the LHS is an APInt&& and RHS is a uint64_t. I could add in all the possible cases, i.e.:
>> - LHS is APInt&&, RHS is APInt&
>> - LHS is APInt&, RHS is APInt&&
>> - LHS is APInt&&, RHS is APInt&&
>>
>> I’m happy to do this, but it may eventually become unwieldy.
>>
>> What do you think of this particular patch, and then what do you think about going forwards whether its a good idea to cover the other cases with r-value refs?
>>
>> Cheers,
>> Pete
>>
>> <apint.diff>_______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list