diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -486,13 +486,16 @@ // allocated on device, which are a subset of __global. (A == LangAS::opencl_global && (B == LangAS::opencl_global_device || B == LangAS::opencl_global_host)) || + (A == LangAS::sycl_global && (B == LangAS::sycl_global_device || + B == LangAS::sycl_global_host)) || // Consider pointer size address spaces to be equivalent to default. ((isPtrSizeAddressSpace(A) || A == LangAS::Default) && (isPtrSizeAddressSpace(B) || B == LangAS::Default)) || // Default is a superset of SYCL address spaces. (A == LangAS::Default && (B == LangAS::sycl_private || B == LangAS::sycl_local || - B == LangAS::sycl_global)); + B == LangAS::sycl_global || B == LangAS::sycl_global_device || + B == LangAS::sycl_global_host)); } /// Returns true if the address space in these qualifiers is equal to or diff --git a/clang/include/clang/Basic/AddressSpaces.h b/clang/include/clang/Basic/AddressSpaces.h --- a/clang/include/clang/Basic/AddressSpaces.h +++ b/clang/include/clang/Basic/AddressSpaces.h @@ -46,6 +46,8 @@ // SYCL specific address spaces. sycl_global, + sycl_global_device, + sycl_global_host, sycl_local, sycl_private, diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h --- a/clang/include/clang/Sema/ParsedAttr.h +++ b/clang/include/clang/Sema/ParsedAttr.h @@ -658,6 +658,10 @@ switch (getKind()) { case ParsedAttr::AT_OpenCLGlobalAddressSpace: return LangAS::sycl_global; + case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace: + return LangAS::sycl_global_device; + case ParsedAttr::AT_OpenCLGlobalHostAddressSpace: + return LangAS::sycl_global_host; case ParsedAttr::AT_OpenCLLocalAddressSpace: return LangAS::sycl_local; case ParsedAttr::AT_OpenCLPrivateAddressSpace: diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -932,6 +932,8 @@ 8, // cuda_constant 9, // cuda_shared 1, // sycl_global + 5, // sycl_global_device + 6, // sycl_global_host 3, // sycl_local 0, // sycl_private 10, // ptr32_sptr diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -2124,8 +2124,10 @@ case LangAS::opencl_generic: return "__generic"; case LangAS::opencl_global_device: + case LangAS::sycl_global_device: return "__global_device"; case LangAS::opencl_global_host: + case LangAS::sycl_global_host: return "__global_host"; case LangAS::cuda_device: return "__device__"; diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -52,6 +52,8 @@ Constant, // cuda_constant Local, // cuda_shared Global, // sycl_global + Global, // sycl_global_device + Global, // sycl_global_host Local, // sycl_local Private, // sycl_private Generic, // ptr32_sptr @@ -72,9 +74,11 @@ Constant, // cuda_constant Local, // cuda_shared // SYCL address space values for this map are dummy - Generic, // sycl_global - Generic, // sycl_local - Generic, // sycl_private + Global, // sycl_global + Global, // sycl_global_device + Global, // sycl_global_host + Local, // sycl_local + Private, // sycl_private Generic, // ptr32_sptr Generic, // ptr32_uptr Generic // ptr64 diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h --- a/clang/lib/Basic/Targets/NVPTX.h +++ b/clang/lib/Basic/Targets/NVPTX.h @@ -36,6 +36,8 @@ 4, // cuda_constant 3, // cuda_shared 1, // sycl_global + 1, // sycl_global_device + 1, // sycl_global_host 3, // sycl_local 0, // sycl_private 0, // ptr32_sptr diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -35,6 +35,8 @@ 0, // cuda_shared // SYCL address space values for this map are dummy 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host 0, // sycl_local 0, // sycl_private 0, // ptr32_sptr @@ -56,6 +58,8 @@ 0, // cuda_constant 0, // cuda_shared 1, // sycl_global + 5, // sycl_global_device + 6, // sycl_global_host 3, // sycl_local 0, // sycl_private 0, // ptr32_sptr diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h --- a/clang/lib/Basic/Targets/TCE.h +++ b/clang/lib/Basic/Targets/TCE.h @@ -42,8 +42,10 @@ 0, // cuda_device 0, // cuda_constant 0, // cuda_shared - 3, // sycl_global - 4, // sycl_local + 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host + 0, // sycl_local 0, // sycl_private 0, // ptr32_sptr 0, // ptr32_uptr diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -36,6 +36,8 @@ 0, // cuda_constant 0, // cuda_shared 0, // sycl_global + 0, // sycl_global_device + 0, // sycl_global_host 0, // sycl_local 0, // sycl_private 270, // ptr32_sptr diff --git a/clang/test/CodeGenSYCL/address-space-conversions.cpp b/clang/test/CodeGenSYCL/address-space-conversions.cpp --- a/clang/test/CodeGenSYCL/address-space-conversions.cpp +++ b/clang/test/CodeGenSYCL/address-space-conversions.cpp @@ -29,6 +29,10 @@ // CHECK-DAG: [[PRIV:%[a-zA-Z0-9]+]] = alloca i32* // CHECK-DAG: [[PRIV]].ascast = addrspacecast i32** [[PRIV]] to i32* addrspace(4)* __attribute__((opencl_private)) int *PRIV; + // CHECK-DAG: [[GLOB_DEVICE:%[a-zA-Z0-9]+]] = alloca i32 addrspace(5)* + __attribute__((opencl_global_device)) int *GLOBDEVICE; + // CHECK-DAG: [[GLOB_HOST:%[a-zA-Z0-9]+]] = alloca i32 addrspace(6)* + __attribute__((opencl_global_host)) int *GLOBHOST; // Explicit conversions // From names address spaces to default address space diff --git a/clang/test/SemaSYCL/address-space-conversions.cpp b/clang/test/SemaSYCL/address-space-conversions.cpp --- a/clang/test/SemaSYCL/address-space-conversions.cpp +++ b/clang/test/SemaSYCL/address-space-conversions.cpp @@ -61,4 +61,15 @@ void *v = GLOB; (void)i; (void)v; + + __attribute__((opencl_global_host)) int *GLOB_HOST; + bar(*GLOB_HOST); + bar2(*GLOB_HOST); + GLOB = GLOB_HOST; + GLOB_HOST = GLOB; // expected-error {{assigning '__global int *' to '__global_host int *' changes address space of pointer}} + __attribute__((opencl_global_device)) int *GLOB_DEVICE; + bar(*GLOB_DEVICE); + bar2(*GLOB_DEVICE); + GLOB = GLOB_DEVICE; + GLOB_DEVICE = GLOB; // expected-error {{assigning '__global int *' to '__global_device int *' changes address space of pointer}} } diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -43,7 +43,7 @@ template void tooBig() { - __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388590)}} + __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388588)}} } template @@ -101,7 +101,7 @@ car<1, 2, 3>(); // expected-note {{in instantiation of function template specialization 'car<1, 2, 3>' requested here}} HasASTemplateFields<1> HASTF; neg<-1>(); // expected-note {{in instantiation of function template specialization 'neg<-1>' requested here}} - correct<0x7FFFED>(); + correct<0x7FFFEB>(); tooBig<8388650>(); // expected-note {{in instantiation of function template specialization 'tooBig<8388650>' requested here}} __attribute__((address_space(1))) char *x;