[llvm-dev] Optimizing memory allocation for custom allocatorsand non C code
Nuno Lopes via llvm-dev
llvm-dev at lists.llvm.org
Mon Jan 4 15:16:11 PST 2016
> On 01/04/2016 10:37 AM, Amaury SECHET wrote:
>> I had this on my TODO list for a while, but the recent introduction of
>> inaccessiblememonly makes it suddenly more urgent, as there is a risk to
>> waste effort in duplicated work and/or end up with suboptimal solutions.
>> I collected 2 use cases for inaccessiblememonly :
>> - Allocation like functions.
>> - Runtime functions for managed languages, that touch state that the
>> program itself can never touch directly.
>>
>> My initial reflection was that MemoryBuiltins use a set of hardcoded
>> functions to do its magic. Doing so, it support the C API fairly well,
>> some variation of the operator new, and that's it. It seems unlikely and
>> counter productive that all language dump their runtime in there, and
>> won't work when feature like C++ templates comes in.
> I've been looking at this some over the last week and have been trying to
> separate the component properties MemoryBuiltins provides. So far, I have
> the following distinct properties:
> 1) Aliasing - malloc and calloc are assumed not to modify any module
> visible value in MemoryDependenceAnalysis. I believe this should be
> replaceable with inaccessiblememonly.
> 2) Observability - We assume in InstCombine that allocation itself is not
> directly observable. That is, we will remove an allocation site which is
> not otherwise used. We assume the same for free.
> 3) Infinite abstract heap - We assume that malloc only fails if out of
> memory and that out of memory is not a observable condition. In
> particular, we will fold null checks to an unused malloc to false meaning
> that OOM may fail to be observed.
> 4) Nullability - Operator new was hardcoded to return null. This is split
> out in http://reviews.llvm.org/D15820 which I'll be submitting shortly.
> 5) noalias - We assume that allocation returns a noalias pointer and that
> stores to that location are not observable unless the pointer is captured.
> 6) Malloc/Free pairing - We assume that using the incorrect form of free
> is UB and thus we can pretend the proper form was used for all of the
> preceding.
Seems fairly complete list of the properties that currently used by the
optimizers.
I can remember of two more:
- Allocated size: MemoryBuiltins knows how to compute the size of an
allocated object by malloc/new/strdup/etc. This information is used for
e.g. aliasing, lowering __builtin_object_size, bounds checks
instrumentation, etc. It would be interesting to generalize this support
for custom allocators.
- Initialization: LLVM knows that calloc/strdup/.. return initialized
memory, while malloc doesn't. A load from a malloc'ed pointer is folded to
undef.
Nuno
More information about the llvm-dev
mailing list