tra added inline comments.

================
Comment at: clang/include/clang/Basic/BuiltinsNVPTX.def:1057
+
+BUILTIN(__nvvm_atom_xchg_global_i, "iiD*i", "n")
+TARGET_BUILTIN(__nvvm_atom_cta_xchg_global_i, "iiD*i", "n", SM_60)
----------------
t4c1 wrote:
> tra wrote:
> > We need to figure out how address-space-specific builtins are supposed to 
> > work.
> > Right now two competing approaches.
> > 
> > This patch declares builtins with generic pointer as an argument, but, 
> > according to the test, expects to be used with the AS-specific pointer.
> > It probably does not catch a wrong-AS pointer passed as an argument, either.
> > It does happen to work, but I think it's mostly due to the fact that LLVM 
> > intrinsics are overloaded and we happen to end up addrspacecast'ing  things 
> > correctly if the builtin gets the right kind of pointer.
> > 
> > The other approach is to declare the pointer with the expected AS. E.g:
> > > TARGET_BUILTIN(__nvvm_mbarrier_init_shared, "vWi*3i", "", 
> > > AND(SM_80,PTX70))
> > 
> > IMO, this is the correct way to do it, but it is also rather inconvenient 
> > to use from CUDA code as it operates on generic pointers.
> > 
> > @jdoerfert - WDYT?
> >TARGET_BUILTIN(__nvvm_mbarrier_init_shared, "vWi*3i", "", AND(SM_80,PTX70))
> >IMO, this is the correct way to do it, but it is also rather inconvenient to 
> >use from CUDA code as it operates on generic pointers.
> 
> I tried doing this, however it is also completely unusable from OpenCL code 
> (which is our use case). Trying to use it gives you errors about how casting 
> pointers to different address spaces  - for example from local to AS3 is not 
> allowed.
Hmm. It should've worked. It would need the same explicit cast to a pointer in 
AS(3) as in your tests, but it would safeguard against attempts to pass it a 
generic pointer. E.g. https://godbolt.org/z/qE6oxzheM

Explicit casting to AS(X) for AS-specific variants is annoying, but it's 
probably unavoidable at the moment regardless of whether we declare the pointer 
argument to be AS-specific or not.  LLVM will not always be able to infer that 
a pointer is in particular AS.
Using specific AS in the declaration has a minor benefit of safeguarding at 
compile time against unintentional use of generic pointers.

Ideally we may want to convert generic variant of the builtin to AS-specific 
one, if LLVM does know the AS. We currently do this for loads/stores, but not 
for other instructions.



================
Comment at: clang/test/CodeGen/builtins-nvptx.c:557
+  // expected-error@+1 {{'__nvvm_atom_acquire_add_global_i' needs target 
feature sm_70}}
+  __nvvm_atom_acquire_add_global_i((__attribute__((address_space(1))) int 
*)ip, i);
+
----------------
t4c1 wrote:
> tra wrote:
> > What happens if I pass a wrong pointer kind? E.g. a generic or shared 
> > pointer?
> It will silently accept it. I can look into how to output appropriate error 
> message.
I guest the bast we can do here is to safeguard against unintentional use of 
generic pointer.
There's not much we can do if someone explicitly casts a pointer to a wrong AS.

I think declaring pointer arg to be in specific AS would be sufficient. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112718/new/

https://reviews.llvm.org/D112718

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to