[llvm-dev] [RFC] Introduce non-capturing stores [second try]
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Mon Nov 15 08:37:42 PST 2021
Johannes,
JFYI, I'm still not convinced of this approach, but also don't have the
cycles to engage with this and likely wont for a while. Mentioning this
just so you know not to expect feedback from me, and to remove any
implicit blockage.
Philip
On 11/8/21 2:53 PM, Johannes Doerfert via llvm-dev wrote:
> NOTE: This was originally send in January 2021 [0]. The rational is
> still the same,
> there are two different proposed solutions based on the
> conversations back then.
>
> TL;DR: A pointer stored in memory is not necessarily captured, let's
> add a way to express this in IR.
>
>
> --- Rational (copied mostly from [0]) ---
>
> This would solve PR48475.
>
> Runtime functions, as well as regular functions, might require a pointer
> to be passed in memory even though the memory is simply a means to pass
> (multiple) arguments. That is, the indirection through memory is only
> used on the call edge and not otherwise relevant. However, such pointers
> are currently assumed to escape as soon as they are stored in memory
> even if the callee only reloads them and use them in a "non-escaping"
> way.
> Generally, storing a pointer might not cause it to escape if all "uses of
> the memory" it is stored to all have the "nocapture" property. While the
> Attributor is aware of this and tries to determine all "copies" that the
> store created, other passes are not and frontends cannot provide this
> information for known APIs.
>
> To allow optimizations in the presence of pointers stored to memory we
> introduce *two* IR extensions:
> Option A) `!nocapture_store` metadata and `"nocapture_use"` operand
> bundle tags.
> Option B) `!nocapture_storage` metadata and `"nocapture_use"` operand
> bundle tags.
> Option A) is what was proposed in [0]. Option B) is slightly different
> and
> based on the discussions from [0] as well as a prototype patch [2].
>
> Semantics Option A)
> If a store of a pointer is tagged with `!nocapture_store` it
> guarantees that
> the pointer is not captured by this store. To ensure we still
> "account" for the
> uses of the pointer once it is reloaded we add the `"nocapture_use"`
> operand
> bundle tag with the pointer as argument to callees that will interact
> with the
> pointer loaded from memory.
>
> Semantics Option B)
> If a memory allocation is tagged with `!nocapture_storage` it
> guarantees that
> stores of a pointer to that memory are not capturing the pointer. To
> ensure
> we still "account" for the uses of the pointer once it is reloaded we
> add the
> `"nocapture_use"` operand bundle tag with the pointer as argument to
> callees
> that will interact with the pointer loaded from memory.
> The difference to Option B) is that we do not tag stores but allocations.
>
>
> --- Previous Discussion ---
>
> The discussion as part of [0] did evolve around a way to handle yet
> another use case,
> basically what happens if the reloads of the stored away pointer are
> (partially)
> exposed rather than hidden behind a runtime function interface. The
> short answer is:
> That is not supported by this RFC alone. The longer answer contains
> different possible
> extensions to this RFC that would allow us to support such use cases.
> That said, the
> runtime use case seems relevant enough to be handled first, especially
> since there is
> no frontend/pass right now (in LLVM) that would rely on any of the
> extended use cases.
>
>
> --- Proposal ---
>
> Resurrect [1], or make [2] into a proper patch.
> I still think [1] is the way to go as it is more generic and has less
> lookup cost.
>
> ---
>
> ~ Johannes
>
>
> [0] https://lists.llvm.org/pipermail/llvm-dev/2021-January/147664.html
> [1] https://reviews.llvm.org/D93189
> [2] https://reviews.llvm.org/D109749#3078176
>
>
More information about the llvm-dev
mailing list