[llvm-dev] Optimizing memory allocation for custom allocators and non C code

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 5 09:52:17 PST 2016


On 01/05/2016 05:02 AM, Amaury SECHET wrote:
> Do you think all of them deserve their own check ? Some of them 
> already have a way to be expressed in the IR (no alias return for 
> instance) but others seems like a pack of behavior that goes together 
> for the most part.
Honestly, I'm not sure yet.  Some of them might make sense to promote to 
attributes - since it can enable some interesting inter-procedural 
analysis - but others may not.  I do want to make sure we update the 
documentation and clarify what the existing predicates mean as a minimum 
though.

My current feeling is that (1,4,5, and possibly Nuno's initialized 
memory) should be more generic with the rest bundled under better 
described predicates.  However, that's evolving as I go.  :)

I started on this because I discovered that we'd accidentally duplicated 
a fair amount of logic for our custom allocation functions not knowing 
some of the existing hooks existed.  When I went looking to see if we 
could share code, I was left with great uncertainty about what the 
existing code actually did.  :)
>
> 2016-01-04 23:49 GMT+01:00 Philip Reames <listmail at philipreames.com 
> <mailto:listmail at philipreames.com>>:
>
>
>
>     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.
>
>     I think it's a bit too early to settle on a new attribute at this
>     time.  I want to make each of the properties above explicit in the
>     code and once that's done, we can see which of them are worth
>     promoting to full blown attributes.
>
>
>
>         It seemed to me that adding attribute for allocation like
>         function would be useful. I think this road is superior to the
>         inaccessiblememonly when it come to memory allocation for the
>         following reason:
>          - If the allocator can be exposed (custom allocator use case)
>         inaccessiblememonly is not usable while this is.
>          - Other allocation related optimizations can kick in (for
>         instance InstCombiner::visitAllocSite).
>
>         I think it is fair to keep this attribute for the managed
>         language use case, for instance, to improve GlobalsAA, but we
>         should definitively restrict it to function that are declared
>         but NOT defined. When merging modules, if a function with the
>         attribute becomes defined, then it needs to be thrown out. I
>         don't think it would be that hard to do in practice, and would
>         greatly improves usability of inaccessiblememonly by making it
>         safe to merge modules.
>
>         Thought ?
>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160105/b6770bcc/attachment.html>


More information about the llvm-dev mailing list