nhaehnle wrote:

Digging into this a bit further in the context of the overall PR stack, I'm not 
convinced that this is the right approach. I agree with @arsenm that mapping 
LangAS to LangAS is a fundamentally dodgy operation.

The LLVM IR we want to achieve has a certain address space on the 
`llvm::GlobalVariable`, but taking its address in HIP results in an 
addrspace(0) pointer via an implicit addrspacecast.

This kind of behavior already exists for `__shared__` variables: they become 
addrspace(3) GlobalVariables, but taking their address results in an implicit 
addrspacecast to addrspace(0).

From what I can tell, the way this works is that the language-level type of the 
address of the variable is just a pointer to the variable's type, i.e. it lives 
in the default address space, but `GetGlobalVarAddressSpace` returns 
`cuda_shared`. And I believe the `performAddrSpaceCast` at the end of 
`GetOrCreateLLVMGlobal` reconciles this difference by inserting an implicit 
addrspacecast.

So why not implement barriers the same way?

* Define a `LangAS::hip_barrier` language-level address space
* Make `GetGlobalVarAddressSpace` return that address space for barrier globals
* There may be some additional places where Clang needs to be taught to treat 
`hip_barrier` analogously to `cuda_shared`

... and then everything else hopefully just falls out?

https://github.com/llvm/llvm-project/pull/195612
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to