yaxunl marked 6 inline comments as done. yaxunl added inline comments.
================ Comment at: include/clang/Basic/SyncScope.h:92 +/// \brief Defines the synch scope ABI for OpenCL. +class AtomicScopeOpenCLABI : public AtomicScopeABI { +public: ---------------- rjmccall wrote: > yaxunl wrote: > > rjmccall wrote: > > > yaxunl wrote: > > > > rjmccall wrote: > > > > > Please correct me if I'm wrong, but I believe you don't get to define > > > > > the "ABI for OpenCL" any more than I get to define the "ABI for C". > > > > > You're defining the ABI for your specific OpenCL implementation, but > > > > > Clang might reasonably support other implementations with their own > > > > > ABIs. So this name is inappropriate. > > > > > > > > > > Now, if I understand how SPIR works, SPIR does require some sort of > > > > > stable lowering of these atomic operations in order to ensure that > > > > > the resulting LLVM IR can be ingested into an arbitrary > > > > > implementation. (Ot at least that was true prior to SPIR V?) > > > > > Therefore, SPIR needs to specify a lowering for these atomic > > > > > operations, and that probably includes ABI values for specific > > > > > sync-scopes. But the appropriate name for that would be the "SPIR > > > > > ABI", not the "OpenCL ABI". And, of course, you would need to be > > > > > sure that you're implementing the lowering that SPIR actually wants. > > > > The ABI is not intended for a specific OpenCL implementation, but for > > > > extending to other languages. For example, we have a downstream C++ > > > > based language called HCC, which may support atomic scope with an ABI > > > > different than OpenCL atomic scope ABI. > > > By "ABI" you mean that it might present a different model of > > > synchronization scopes to the source language? Okay, that's great, and > > > it explains a lot of things that were very murky about some of our > > > previous conversations. > > > > > > In that case, I think the appropriate design for these builtins is: > > > > > > - They don't need to be in the __builtin_opencl namespace. > > > - They *do* need to be enabled only in language modes with well-defined > > > sync-scope models, which for now just means OpenCL. > > > - The language mode's sync-scope model should determine everything > > > about the scope argument, including its type. Sema-level validation > > > requires first determining the language's sync-scope model. > > > - There is no meaningful way to "default" the scope argument on the > > > non-scoped builtins the way that we are now. Instead, the scope argument > > > should only exist for the scoped builtins. > > > > > > Alternatively, if you potentially want the opencl-model builtins to be > > > usable from non-opencl languages, the right design is for HCC to use its > > > own set of builtins with their own type-checking rules. > > > > > > In either case, I don't think it's a good idea to call this "ABI", which > > > is associated too strongly with target-lowering concepts. You're really > > > talking about a source-language concept. > > We could introduce __builtin_hcc_atomic_* in downstream HCC. > > > > We need a generic approach to represent atomic scope values for different > > languages and associated semantic/codegen needs, and AtomicScopeABI seems > > generic enough to serve the purpose. It has interface for semantic checking > > (isValid), and the interface to map to LLVM sync scope for both constant > > and variable arguments. If the name is not proper, we could rename it to > > just `AtomicScope`. > > > > I can remove the default atomic scope for atomic expressions without scope > > originally. For them I just emit LLVM atomic instructions with default LLVM > > synch scope. > I agree that there's value in having a generic approach even if you're going > to have different builtins for different scope models. However, if you do > use different builtins for different scope models, you need to make sure that > you pick the appropriate model for the builtin being used, not according to > the current language mode. That is, there should be some way to map a > builtin ID to an AtomicScopeModelKind (values: None, OpenCL, (future) HCC), > and then you can use that to create an AtomicScopeModel, which can have all > these methods on it. > > I would encourage you to go ahead and give AtomicScopeModel an implementation > file and move more of these method definitions into that. Thanks. Will do. ================ Comment at: include/clang/Basic/SyncScope.h:105 + + AtomicScopeOpenCLABI() {} + ---------------- rjmccall wrote: > I would call this OpenCLAtomicScopeModel. Will do. ================ Comment at: include/clang/Basic/SyncScope.h:128 + static_assert(Last == SubGroup, "Does not include all synch scopes"); + static unsigned Scopes[] = { + static_cast<unsigned>(WorkGroup), static_cast<unsigned>(Device), ---------------- rjmccall wrote: > Make this const, please. will do. https://reviews.llvm.org/D36580 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits