bader added inline comments.
================ Comment at: clang/include/clang/AST/Type.h:493 + // Default is a superset of SYCL address spaces. + (A == LangAS::Default && + (B == LangAS::sycl_private || B == LangAS::sycl_local || ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Ok if you allow implicit conversions both ways then this condition should > > > be extended to also contain all named address spaces in `A` and `Default` > > > in `B`. But actually, could you simplify by checking that you have > > > `Default` on either side, so something like > > > > > > > > > ``` > > > (A == LangAS::Default || B == LangAS::Default) > > > ``` > > > ? > > > Ok if you allow implicit conversions both ways then this condition should > > > be extended to also contain all named address spaces in `A` and `Default` > > > in `B`. But actually, could you simplify by checking that you have > > > `Default` on either side, so something like > > > > > > > > > ``` > > > (A == LangAS::Default || B == LangAS::Default) > > > ``` > > > ? > > > > According to the comment above `isAddressSpaceSupersetOf` function > > definition. > > ``` > > /// Returns true if address space A is equal to or a superset of B. > > ``` > > > > `(A == LangAS::Default || B == LangAS::Default)` <- this change makes > > `Default` address space a superset of all address spaces including OpenCL, > > which we were trying to avoid with adding SYCL address spaces. Another > > problem with this code is that make `Default` a **sub-set** of named > > address spaces (like `sycl_local`), which is not right. > > If I understand it correctly defining "isSupersSetOf" relation is enough > > for the rest of framework to enable conversions. Am I right? > > (A == LangAS::Default || B == LangAS::Default) <- this change makes Default > > address space a superset of all address spaces including OpenCL. > > I see, yes this will break pretty much everything unless we guard by SYCL > mode. But I don't think it is good to go this route though. > > > Another problem with this code is that make Default a sub-set of named > > address spaces (like sycl_local), which is not right. > > Well, if you need implicit conversions to work both ways as you have written > in the documentation then you don't really have a true super-/subsets between > the named address spaces and the default one. They appear to be equivalent. > > ``` > SYCL mode enables both explicit and implicit conversion to/from the default > address space from/to > the address space-attributed type. > ``` > > So do you actually need something like this to work? > > ``` > int * genptr = ...; > __private int * privptr = genptr: > ``` > > I looked though the code base and I see that explicit cast is used when raw pointer is casted to address space annotated type. I think we can always use explicit cast from `Default` to named address space instead of implicit cast. It might be even useful to avoid unintended implicit casts causing UB. @keryell, @Naghasan, what do you think if we update https://reviews.llvm.org/D99488 to disallow implicit casts from `Default` to named address space? I think it should be okay considering that current implementation doesn't use this type of casts (and I can't come up with a use case for it). Meanwhile I've added checks for that to clang/test/SemaSYCL/address-space-conversions.cpp. ================ Comment at: clang/lib/AST/ItaniumMangle.cpp:2379 unsigned TargetAS = Context.getASTContext().getTargetAddressSpace(AS); - if (TargetAS != 0) + if (TargetAS != 0 || Context.getASTContext().getLangOpts().SYCLIsDevice) ASString = "AS" + llvm::utostr(TargetAS); ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Any reason not to use OpenCL mangling? If you do then you might be able > > > to link against libraries compiled for OpenCL. Also you will get more > > > stable naming i.e. it would not differ from target to target. > > > Any reason not to use OpenCL mangling? If you do then you might be able > > > to link against libraries compiled for OpenCL. Also you will get more > > > stable naming i.e. it would not differ from target to target. > > > > I'm not sure I understand your suggestion. Could you elaborate on "OpenCL > > mangling", please? > > > > Let me clarify the problem this change addresses. The test case covering it > > is located in > > `clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp` lines > > 86-91. > > > > ``` > > template <typename T> > > void tmpl(T t) {} > > > > int *NoAS; > > __attribute__((opencl_private)) int *PRIV; > > > > tmpl(PRIV); > > // CHECK-DAG: [[PRIV_LOAD5:%[a-zA-Z0-9]+]] = load i32*, i32* addrspace(4)* > > [[PRIV]].ascast > > // CHECK-DAG: call spir_func void [[PRIV_TMPL:@[a-zA-Z0-9_]+]](i32* > > [[PRIV_LOAD5]]) > > tmpl(NoAS); > > // CHECK-DAG: [[NoAS_LOAD5:%[a-zA-Z0-9]+]] = load i32 addrspace(4)*, i32 > > addrspace(4)* addrspace(4)* [[NoAS]].ascast > > // CHECK-DAG: call spir_func void [[GEN_TMPL:@[a-zA-Z0-9_]+]](i32 > > addrspace(4)* [[NoAS_LOAD5]]) > > ``` > > Clang has separate code paths for mangling types w/ and w/o address space > > attributes (i.e. using `Default` address space). > > > > Address space is not mangled if there is no AS attribute (`Default`) or if > > address space attribute is maps to `0` target address space. SPIR target > > maps `*_private` address space to `0`, which causes name conflict for the > > example above. > > > > This change for SYCL compiler enables mangling for non-default address > > space attributes regardless of their mapping to target address space. > It's just that all language address spaces are mangled with the source > spelling in Italium ABI right now, if you check the `else` statement. I don't > think it is part of the official spec yet but it might be better to stick to > the same pattern if possible. > It's just that all language address spaces are mangled with the source > spelling in Italium ABI right now, if you check the `else` statement. I don't > think it is part of the official spec yet but it might be better to stick to > the same pattern if possible. I would really love to avoid changes to the mangler (e.g. to be able to link binaries produced by different front-end like SYCL/OpenCL/CUDA), but I don't know the better way to address the issue Sorry, I don't get what do you suggest here. Could you clarify what exactly I should change, please? ================ Comment at: clang/lib/Basic/Targets/AMDGPU.cpp:74 Local, // cuda_shared + Global, // sycl_global + Local, // sycl_local ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Would this map ever be used for SYCL? If not it would be better to add a > > > comment about it and/or perhaps even just use dummy values. > > I can't find an example of how to do this. > > CUDA address spaces use valid values and I wasn't able to find similar > > comments. > > > > Where do you think we can put a comment? > I think you could add a comment right here. I bet you can use any values i.e. > `0`? They are not expected to be meaningful. It would be good if we could add > an asset somewhere but perhaps it might be hard to find a good place... > I think you could add a comment right here. I bet you can use any values i.e. > `0`? They are not expected to be meaningful. It would be good if we could add > an asset somewhere but perhaps it might be hard to find a good place... I've set Generic value (i.e. `0`) and added a comment. ================ Comment at: clang/lib/Basic/Targets/SPIR.h:129 + TargetInfo::adjust(Opts); + setAddressSpaceMap(/*DefaultIsGeneric=*/Opts.SYCLIsDevice); + } ---------------- Anastasia wrote: > Anastasia wrote: > > Ok, do you still plan to add a `FIXME` as mentioned previously explaining > > why we need to reset the map here? > Btw I was just thinking of another alternative here. > > What do you think about just setting a value in `Default` AS entry then we > wouldn't need any extra map at all in this case? So something like: > > > ``` > AddrSpaceMap[LangAS::Default] = AddrSpaceMap[LangAS::opencl_generic]; > ``` > with a good explanation in `FIXME`? :) > > Btw I was just thinking of another alternative here. > > What do you think about just setting a value in `Default` AS entry then we > wouldn't need any extra map at all in this case? So something like: > > > ``` > AddrSpaceMap[LangAS::Default] = AddrSpaceMap[LangAS::opencl_generic]; > ``` > with a good explanation in `FIXME`? :) > I think this won't work because AddrSpaceMap is a constant. Regarding `FIXME`, could you point where it was previously mentioned, please? I think it might miss it. I can add a link to the SYCL spec - https://www.khronos.org/registry/SYCL/specs/sycl-2020/html/sycl-2020.html#subsec:genericAddressSpace. Will it be sufficient? ================ Comment at: clang/lib/CodeGen/TargetInfo.cpp:9985 + "Address space agnostic languages only"); + LangAS DefaultGlobalAS = getLangASFromTargetAS( + CGM.getContext().getTargetAddressSpace(LangAS::sycl_global)); ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Since you are using SYCL address space you should probably guard this > > > line by SYCL mode... Btw the same seems to apply to the code below as it > > > implements SYCL sematics? > > > > > > Can you add spec references here too. > > > > > > Also there seems to be nothing target specific in the code here as you > > > are implementing what is specified by the language semantics. Should this > > > not be moved to `GetGlobalVarAddressSpace` along with the other language > > > handling? > > > > > > I am not very familiar with this part of address space handling though. I > > > would be more comfortable if @rjmccall could take a look too. > > This code assigns target address space "global variables w/o address space > > attribute". > > SYCL says it's "implementation defined" (from > > https://www.khronos.org/registry/SYCL/specs/sycl-2020/html/sycl-2020.html#subsec:commonAddressSpace): > > > > > Namespace scope > > > If the type is const, the address space the declaration is assigned to is > > > implementation-defined. If the target of the SYCL backend can represent > > > the generic address space, then the assigned address space must be > > > compatible with the generic address space. > > > Namespace scope non-const declarations cannot be used within a kernel, as > > > restricted in Section 5.4. This means that non-const global variables > > > cannot be accessed by any device kernel or code called by the device > > > kernel. > > > > I added clarification that SPIR target allocates global variables in global > > address space to https://reviews.llvm.org/D99488 (see line #248). > > > > @rjmccall, mentioned in the mailing list discussion that this callbacks > > were developed for compiling C++ to AMDGPU target, so this not necessary > > designed only for SYCL, but it works for SYCL as well. > After all what objects are allowed to bind to non-default address space here > is defined in SYCL spec even if the exact address spaces are not defined so > it is not completely a target-specific behavior. > > My understanding of the API you are extending (judging from its use) is that > it allows you to extend the language sematics with some target-specific > setup. I.e. you could add extra address spaces to C++ or OpenCL or any other > language. But here you are setting the language address spaces instead that > are mapped to the target at some point implicitly. > > It seems like this change better fits to > `CodeGenModule::GetGlobalVarAddressSpace` that already contains very similar > logic? > > Otherwise, it makes more sense to use target address spaces directly instead > of SYCL language address spaces. But either way, we should guard it by SYCL > mode somehow as we have not established this as a universal logic for SPIR. > It seems like this change better fits to > `CodeGenModule::GetGlobalVarAddressSpace` that already contains very similar > logic? This was the original implementation (see https://reviews.llvm.org/D89909?id=299795), but @rjmccall suggested to use this callback instead. Both ways work for me, but the implementation proposed by John is easier to maintain. > Otherwise, it makes more sense to use target address spaces directly instead > of SYCL language address spaces. But either way, we should guard it by SYCL > mode somehow as we have not established this as a universal logic for SPIR. I've updated the code to use target address space. I also added an assertion for SYCL language mode, although I think SPIR doesn't support global variables in address spaces other than global or constant regardless of the language mode, so I think the logic is universal. ================ Comment at: clang/test/CodeGenSYCL/address-space-cond-op.cpp:8 + +// CHECK-LABEL: define {{.*}} @_Z3foobR1SS_( +// CHECK-NEXT: entry: ---------------- Anastasia wrote: > I am trying to understand what specifically you are testing from the patch > and whether you need this whole IR output to be checked? > > It helps for reviewing and maintenance purposes to minimize the IR patterns > as much as possible. > I am trying to understand what specifically you are testing from the patch > and whether you need this whole IR output to be checked? > > It helps for reviewing and maintenance purposes to minimize the IR patterns > as much as possible. Removed this test. ================ Comment at: clang/test/CodeGenSYCL/address-space-cond-op.cpp:39 +template <typename name, typename Func> +__attribute__((sycl_kernel)) void kernel(Func kernelFunc) { + kernelFunc(); ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > This code doesn't seem to be relevant to the testing. > > Probably not for this patch, but the next patch > > (https://reviews.llvm.org/D71016) makes it necessary to emit LLVM IR for > > this test. Is it okay to leave it as is? > I would prefer if we minimize the amount of noise as much as possible. This > patch has enough functionality so I don't think adding extra helps in any way. > > The testing should generally encapsulate what is relevant. Otherwise, I don't > know how to assess it without reviewing other patches too. Removed from all new tests. ================ Comment at: clang/test/CodeGenSYCL/address-space-of-returns.cpp:8 +const char *ret_char() { + return "N"; +} ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Are you testing address space segment binding here? Could you extend to > > > other use cases too? > > > Are you testing address space segment binding here? Could you extend to > > > other use cases too? > > > > This test checks that returned address space is generic and address space > > is correctly casted for character, array, reference and aggregate types. > > > > Could you clarify how exactly do you want this test to be extended, please? > > I think I'm not getting it. > It seems to me that you are just testing address space inference here similar > to `address-space-deduction.cpp`? I don't see anything specific to a return > type in either the test or your patch? > It seems to me that you are just testing address space inference here similar > to `address-space-deduction.cpp`? I don't see anything specific to a return > type in either the test or your patch? Right. Removed. ================ Comment at: clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp:80 + // Ensure that we still get 3 different template instantiations. + tmpl(GLOB); + // CHECK-DAG: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* [[GLOB]].ascast ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > What functionality in the patch does this test? > > > What functionality in the patch does this test? > > > > As I mentioned in the comment for clang/lib/AST/ItaniumMangle.cpp, there > > was a problem with instantiating templates for parameters which differs > > only by address space attribute. Lines 79-91 cover mangling changes. > You are not testing the mangling though? > You are not testing the mangling though? Right, what we are checking here is that each instantiation emits a different function in LLVM IR. Exact mangling is not relevant to the check. ================ Comment at: clang/test/CodeGenSYCL/convergent.cpp:2 // RUN: %clang_cc1 -fsycl-is-device -emit-llvm -disable-llvm-passes \ -// RUN: -triple spir64-unknown-unknown-sycldevice -emit-llvm %s -o - | \ // RUN: FileCheck %s ---------------- Anastasia wrote: > bader wrote: > > Anastasia wrote: > > > Is this change related? I thought we are not adding the environment > > > component after all... > > > > > > > > > Is this change related? I thought we are not adding the environment > > > component after all... > > > > While I was removing `-sycldevice` environment component from the patch, I > > noticed that one of the committed tests already uses it. > > https://github.com/llvm/llvm-project/blob/main/clang/test/CodeGenSYCL/convergent.cpp#L2 > > > > Do you want to me to create a separate review request for this change? > I see, this looks trivial enough test clean up. You could just commit it > without any review perhaps? > I see, this looks trivial enough test clean up. You could just commit it > without any review perhaps? Done in https://github.com/llvm/llvm-project/commit/95c614afcd4de71d00a240d6a4a02c036c972ed0 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D89909/new/ https://reviews.llvm.org/D89909 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits