[llvm-dev] RFC: Adding a !thread.private metadata

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Mon Sep 17 14:31:51 PDT 2018


Posted review for this here: https://reviews.llvm.org/D52192

Philip

On 09/14/2018 04:13 PM, Philip Reames via llvm-dev wrote:
> Problem
>
> LLVM's memory model for NonAtomic accesses is generally fairly weak, 
> but explicitly disallows inserting stores that didn't occur in the 
> original program.  This is required for any potentially shared 
> location, but is overkill for any memory location which is provably 
> only accessed by a single thread.
>
> My particular motivating example is a single thread private field in 
> our implementation, but there are numerous languages which provide 
> thread private storage options and right now, LLVM has no good way to 
> represent them.
>
> (Just to set expectations appropriately: the example which made me 
> write this up is purely a "hey, that's interesting" case at the 
> moment.  It's not a major blocking item or anything.  As such, I'm 
> mostly throwing this out for discussion because it's interesting.)
>
> Proposed Solution
>
> Add a new metadata type which applies to memory accessing instructions 
> (store, load, atomicrmw, etc...) and indicates that the memory 
> location accessed is known to be accessed only by a single thread 
> everywhere it is dereferenceable.
>
> The framing is very similar to the one we use for !invariant.load and 
> for much the same reasons.  If we can prove a location is 
> dereferenceable, we want to be able to insert a store along any 
> dereferenceable path through the function without worrying whether the 
> original location was known to execute or not.  At the moment, the 
> main transform to leverage this would be load store promotion in LICM 
> which would be taught that inserting a loop exit is legal, even if the 
> store didn't execute within the dynamic execution of the loop, if the 
> metadata is present.
>
> Alternatives and Discussion
>
> LLVM IR has existing support for thread local storage, but this 
> doesn't solve our problem.  There's nothing that presents one thread 
> from capturing the address of it's thread local copy and publishing 
> that address in a location visible to other threads. Given a thread 
> local variable and a nocapture result, we can conclude the location is 
> thread private.  (Same for allocas, mallocs, etc...)
>
> As just noted, there are places where we can infer that an access is 
> thread private.  I think it makes sense to expose this as an analysis 
> utility or pass.  We have bits of this already existing in LICM which 
> could be pulled out, renamed, and reused.  There are various other 
> transforms we could implement for thread private locations (e.g. 
> replace an atomicrmw on a thread private with a load, op, store 
> sequence), but I'm not sure these are actually worth implementing at 
> the moment.
>
> We could extend the memory model with a weaker access type.  I think 
> our current NotAtomic is a good default, but we could consider adding 
> a ThreadPrivate specifier which is weaker than the existing NotAtomic 
> in exactly the same way that the metadata implies.  This is a 
> reasonable implementation strategy, but might be a bit more work than 
> I can practically commit to at the moment.
>
> Hal recently brought up the idea of a nosync function attribute. If I 
> understand the intended semantics properly, such functions aren't 
> guaranteed to access strictly thread private locations. They're simply 
> required not to synchronize; that is, they are allowed to access 
> shared variables in a racy manner.
>
> Philip
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list