diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 85ee1e9b99cf1..146aaffd2ec9d 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -480,6 +480,12 @@ class Qualifiers { // Otherwise in OpenCLC v2.0 s6.5.5: every address space except // for __constant can be used as __generic. (A == LangAS::opencl_generic && B != LangAS::opencl_constant) || + // We also define global_device and global_host address spaces, + // to distinguish global pointers allocated on host from pointers + // allocated on device, which are a subset of __global. + // FIXME: add a reference to spec when ready + (A == LangAS::opencl_global && (B == LangAS::opencl_global_device || + B == LangAS::opencl_global_host)) || // Consider pointer size address spaces to be equivalent to default. ((isPtrSizeAddressSpace(A) || A == LangAS::Default) && (isPtrSizeAddressSpace(B) || B == LangAS::Default)); @@ -493,7 +499,9 @@ class Qualifiers { (!hasAddressSpace() && (other.getAddressSpace() == LangAS::opencl_private || other.getAddressSpace() == LangAS::opencl_local || - other.getAddressSpace() == LangAS::opencl_global)); + other.getAddressSpace() == LangAS::opencl_global || + other.getAddressSpace() == LangAS::opencl_global_device || + other.getAddressSpace() == LangAS::opencl_global_host)); } /// Determines if these qualifiers compatibly include another set. diff --git a/clang/include/clang/Basic/AddressSpaces.h b/clang/include/clang/Basic/AddressSpaces.h index faf7f303aa2d6..a9db52dfcc9c8 100644 --- a/clang/include/clang/Basic/AddressSpaces.h +++ b/clang/include/clang/Basic/AddressSpaces.h @@ -36,6 +36,8 @@ enum class LangAS : unsigned { opencl_constant, opencl_private, opencl_generic, + opencl_global_device, + opencl_global_host, // CUDA specific address spaces. cuda_device, diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 8f238f3a93a83..4d88180124972 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1294,6 +1294,16 @@ def OpenCLGlobalAddressSpace : TypeAttr { let Documentation = [OpenCLAddressSpaceGlobalDocs]; } +def OpenCLGlobalDeviceAddressSpace : TypeAttr { + let Spellings = [Clang<"opencl_global_device">]; + let Documentation = [OpenCLGlobalAddressSpacesDocs]; +} + +def OpenCLGlobalHostAddressSpace : TypeAttr { + let Spellings = [Clang<"opencl_global_host">]; + let Documentation = [OpenCLGlobalAddressSpacesDocs]; +} + def OpenCLLocalAddressSpace : TypeAttr { let Spellings = [Keyword<"__local">, Keyword<"local">, Clang<"opencl_local">]; let Documentation = [OpenCLAddressSpaceLocalDocs]; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 9e4b3fce64f97..1a7bca252912b 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -3559,6 +3559,17 @@ scope) variables and static local variable as well. }]; } +def OpenCLGlobalAddressSpacesDocs : Documentation { + let Category = DocOpenCLAddressSpaces; + let Heading = "[[clang::opencl_global_device]], [[clang::opencl_global_host]]"; + let Content = [{ +The (global_device) and (global_host) address space attributes specify that an +object is allocated in global memory on the device/host. It helps distinguishing +USM pointers that access device memory and accessors that access global memory +from those that access host memory. + }]; +} + def OpenCLAddressSpaceLocalDocs : Documentation { let Category = DocOpenCLAddressSpaces; let Heading = "__local, local, [[clang::opencl_local]]"; diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h index 21e030fe51346..8946b12ee03fc 100644 --- a/clang/include/clang/Sema/ParsedAttr.h +++ b/clang/include/clang/Sema/ParsedAttr.h @@ -606,6 +606,10 @@ class ParsedAttr final return LangAS::opencl_constant; case ParsedAttr::AT_OpenCLGlobalAddressSpace: return LangAS::opencl_global; + case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace: + return LangAS::opencl_global_device; + case ParsedAttr::AT_OpenCLGlobalHostAddressSpace: + return LangAS::opencl_global_host; case ParsedAttr::AT_OpenCLLocalAddressSpace: return LangAS::opencl_local; case ParsedAttr::AT_OpenCLPrivateAddressSpace: diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d2330f8e4f46f..877cb84124b52 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -919,18 +919,20 @@ static const LangASMap *getAddressSpaceMap(const TargetInfo &T, // The fake address space map must have a distinct entry for each // language-specific address space. static const unsigned FakeAddrSpaceMap[] = { - 0, // Default - 1, // opencl_global - 3, // opencl_local - 2, // opencl_constant - 0, // opencl_private - 4, // opencl_generic - 5, // cuda_device - 6, // cuda_constant - 7, // cuda_shared - 8, // ptr32_sptr - 9, // ptr32_uptr - 10 // ptr64 + 0, // Default + 1, // opencl_global + 3, // opencl_local + 2, // opencl_constant + 0, // opencl_private + 4, // opencl_generic + 11, // opencl_global_device + 12, // opencl_global_host + 5, // cuda_device + 6, // cuda_constant + 7, // cuda_shared + 8, // ptr32_sptr + 9, // ptr32_uptr + 10 // ptr64 }; return &FakeAddrSpaceMap; } else { diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 9aa61383e2dd3..99a93e3984f43 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -2387,16 +2387,39 @@ void CXXNameMangler::mangleQualifiers(Qualifiers Quals, const DependentAddressSp switch (AS) { default: llvm_unreachable("Not a language specific address space"); // ::= "CL" [ "global" | "local" | "constant" | - // "private"| "generic" ] - case LangAS::opencl_global: ASString = "CLglobal"; break; - case LangAS::opencl_local: ASString = "CLlocal"; break; - case LangAS::opencl_constant: ASString = "CLconstant"; break; - case LangAS::opencl_private: ASString = "CLprivate"; break; - case LangAS::opencl_generic: ASString = "CLgeneric"; break; + // "private"| "generic" | "global_device" | + // "global_host" ] + case LangAS::opencl_global: + ASString = "CLglobal"; + break; + case LangAS::opencl_global_device: + ASString = "CLDevice"; + break; + case LangAS::opencl_global_host: + ASString = "CLHost"; + break; + case LangAS::opencl_local: + ASString = "CLlocal"; + break; + case LangAS::opencl_constant: + ASString = "CLconstant"; + break; + case LangAS::opencl_private: + ASString = "CLprivate"; + break; + case LangAS::opencl_generic: + ASString = "CLgeneric"; + break; // ::= "CU" [ "device" | "constant" | "shared" ] - case LangAS::cuda_device: ASString = "CUdevice"; break; - case LangAS::cuda_constant: ASString = "CUconstant"; break; - case LangAS::cuda_shared: ASString = "CUshared"; break; + case LangAS::cuda_device: + ASString = "CUdevice"; + break; + case LangAS::cuda_constant: + ASString = "CUconstant"; + break; + case LangAS::cuda_shared: + ASString = "CUshared"; + break; // ::= [ "ptr32_sptr" | "ptr32_uptr" | "ptr64" ] case LangAS::ptr32_sptr: ASString = "ptr32_sptr"; diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index e3796accb26e4..7e6cf7bdd2be0 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1823,6 +1823,12 @@ void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType T, case LangAS::opencl_global: Extra.mangleSourceName("_ASCLglobal"); break; + case LangAS::opencl_global_device: + Extra.mangleSourceName("_ASCLDevice"); + break; + case LangAS::opencl_global_host: + Extra.mangleSourceName("_ASCLHost"); + break; case LangAS::opencl_local: Extra.mangleSourceName("_ASCLlocal"); break; diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 87b273234ad96..0505d53d6f99d 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -1577,6 +1577,8 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, case attr::OpenCLPrivateAddressSpace: case attr::OpenCLGlobalAddressSpace: + case attr::OpenCLGlobalDeviceAddressSpace: + case attr::OpenCLGlobalHostAddressSpace: case attr::OpenCLLocalAddressSpace: case attr::OpenCLConstantAddressSpace: case attr::OpenCLGenericAddressSpace: @@ -1880,6 +1882,10 @@ std::string Qualifiers::getAddrSpaceAsString(LangAS AS) { return "__constant"; case LangAS::opencl_generic: return "__generic"; + case LangAS::opencl_global_device: + return "__global_device"; + case LangAS::opencl_global_host: + return "__global_host"; case LangAS::cuda_device: return "__device__"; case LangAS::cuda_constant: diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index da7bd34c95325..d5af8c3965356 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -45,6 +45,8 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { Constant, // opencl_constant Private, // opencl_private Generic, // opencl_generic + Global, // opencl_global_device + Global, // opencl_global_host Global, // cuda_device Constant, // cuda_constant Local, // cuda_shared @@ -60,6 +62,8 @@ const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { Constant, // opencl_constant Private, // opencl_private Generic, // opencl_generic + Global, // opencl_global_device + Global, // opencl_global_host Global, // cuda_device Constant, // cuda_constant Local, // cuda_shared diff --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h index fc8c832641ad8..194baa411d623 100644 --- a/clang/lib/Basic/Targets/NVPTX.h +++ b/clang/lib/Basic/Targets/NVPTX.h @@ -30,6 +30,8 @@ static const unsigned NVPTXAddrSpaceMap[] = { 0, // opencl_private // FIXME: generic has to be added to the target 0, // opencl_generic + 1, // opencl_global_device + 1, // opencl_global_host 1, // cuda_device 4, // cuda_constant 3, // cuda_shared diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index dcaabec665367..9a3b2b960fef8 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -24,33 +24,37 @@ namespace clang { namespace targets { static const unsigned SPIRAddrSpaceMap[] = { - 0, // Default - 1, // opencl_global - 3, // opencl_local - 2, // opencl_constant - 0, // opencl_private - 4, // opencl_generic - 0, // cuda_device - 0, // cuda_constant - 0, // cuda_shared - 0, // ptr32_sptr - 0, // ptr32_uptr - 0 // ptr64 + 0, // Default + 1, // opencl_global + 3, // opencl_local + 2, // opencl_constant + 0, // opencl_private + 4, // opencl_generic + 11, // opencl_global_device + 12, // opencl_global_host + 0, // cuda_device + 0, // cuda_constant + 0, // cuda_shared + 0, // ptr32_sptr + 0, // ptr32_uptr + 0 // ptr64 }; static const unsigned SYCLAddrSpaceMap[] = { - 4, // Default - 1, // opencl_global - 3, // opencl_local - 2, // opencl_constant - 0, // opencl_private - 4, // opencl_generic - 0, // cuda_device - 0, // cuda_constant - 0, // cuda_shared - 0, // ptr32_sptr - 0, // ptr32_uptr - 0 // ptr64 + 4, // Default + 1, // opencl_global + 3, // opencl_local + 2, // opencl_constant + 0, // opencl_private + 4, // opencl_generic + 11, // opencl_global_device + 12, // opencl_global_host + 0, // cuda_device + 0, // cuda_constant + 0, // cuda_shared + 0, // ptr32_sptr + 0, // ptr32_uptr + 0 // ptr64 }; class LLVM_LIBRARY_VISIBILITY SPIRTargetInfo : public TargetInfo { diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h index 9cbf2a3688a2e..445fe4fe72936 100644 --- a/clang/lib/Basic/Targets/TCE.h +++ b/clang/lib/Basic/Targets/TCE.h @@ -35,6 +35,8 @@ static const unsigned TCEOpenCLAddrSpaceMap[] = { 4, // opencl_local 5, // opencl_constant 0, // opencl_private + 1, // opencl_global_device + 1, // opencl_global_host // FIXME: generic has to be added to the target 0, // opencl_generic 0, // cuda_device diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index 39ccac96a49d8..2b2462f97af82 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -29,6 +29,8 @@ static const unsigned X86AddrSpaceMap[] = { 0, // opencl_constant 0, // opencl_private 0, // opencl_generic + 0, // opencl_global_device + 0, // opencl_global_host 0, // cuda_device 0, // cuda_constant 0, // cuda_shared diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index d3135ccfb0adf..1069134fdfa5f 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1360,10 +1360,18 @@ static void removeImageAccessQualifier(std::string& TyName) { // (basically all single AS CPUs). static unsigned ArgInfoAddressSpace(LangAS AS) { switch (AS) { - case LangAS::opencl_global: return 1; - case LangAS::opencl_constant: return 2; - case LangAS::opencl_local: return 3; - case LangAS::opencl_generic: return 4; // Not in SPIR 2.0 specs. + case LangAS::opencl_global: + return 1; + case LangAS::opencl_constant: + return 2; + case LangAS::opencl_local: + return 3; + case LangAS::opencl_generic: + return 4; // Not in SPIR 2.0 specs. + case LangAS::opencl_global_device: + return 11; + case LangAS::opencl_global_host: + return 12; default: return 0; // Assume private. } @@ -3858,6 +3866,8 @@ LangAS CodeGenModule::GetGlobalVarAddressSpace(const VarDecl *D) { if (LangOpts.OpenCL) { AddrSpace = D ? D->getType().getAddressSpace() : LangAS::opencl_global; assert(AddrSpace == LangAS::opencl_global || + AddrSpace == LangAS::opencl_global_device || + AddrSpace == LangAS::opencl_global_host || AddrSpace == LangAS::opencl_constant || AddrSpace == LangAS::opencl_local || AddrSpace >= LangAS::FirstTargetAddressSpace); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 0908218e98b8f..b4f1a7bfb01b9 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -7967,6 +7967,8 @@ static bool isAddressSpaceKind(const ParsedAttr &attr) { return attrKind == ParsedAttr::AT_AddressSpace || attrKind == ParsedAttr::AT_OpenCLPrivateAddressSpace || attrKind == ParsedAttr::AT_OpenCLGlobalAddressSpace || + attrKind == ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace || + attrKind == ParsedAttr::AT_OpenCLGlobalHostAddressSpace || attrKind == ParsedAttr::AT_OpenCLLocalAddressSpace || attrKind == ParsedAttr::AT_OpenCLConstantAddressSpace || attrKind == ParsedAttr::AT_OpenCLGenericAddressSpace; @@ -8048,6 +8050,8 @@ static void processTypeAttrs(TypeProcessingState &state, QualType &type, break; case ParsedAttr::AT_OpenCLPrivateAddressSpace: case ParsedAttr::AT_OpenCLGlobalAddressSpace: + case ParsedAttr::AT_OpenCLGlobalDeviceAddressSpace: + case ParsedAttr::AT_OpenCLGlobalHostAddressSpace: case ParsedAttr::AT_OpenCLLocalAddressSpace: case ParsedAttr::AT_OpenCLConstantAddressSpace: case ParsedAttr::AT_OpenCLGenericAddressSpace: diff --git a/clang/test/AST/language_address_space_attribute.cpp b/clang/test/AST/language_address_space_attribute.cpp index f9ab4612320b1..c6977212e60f5 100644 --- a/clang/test/AST/language_address_space_attribute.cpp +++ b/clang/test/AST/language_address_space_attribute.cpp @@ -10,6 +10,18 @@ void langas() { // CHECK: VarDecl {{.*}} z_global '__global int *' [[clang::opencl_global]] int *z_global; + // CHECK: VarDecl {{.*}} x_global_device '__global_device int *' + __attribute__((opencl_global_device)) int *x_global_device; + + // CHECK: VarDecl {{.*}} z_global_device '__global_device int *' + [[clang::opencl_global_device]] int *z_global_device; + + // CHECK: VarDecl {{.*}} x_global_host '__global_host int *' + __attribute__((opencl_global_host)) int *x_global_host; + + // CHECK: VarDecl {{.*}} z_global_host '__global_host int *' + [[clang::opencl_global_host]] int *z_global_host; + // CHECK: VarDecl {{.*}} x_local '__local int *' __attribute__((opencl_local)) int *x_local; diff --git a/clang/test/CodeGenCXX/mangle-address-space.cpp b/clang/test/CodeGenCXX/mangle-address-space.cpp index 2c5cdfc3dadbe..71bfb68b9a4ab 100644 --- a/clang/test/CodeGenCXX/mangle-address-space.cpp +++ b/clang/test/CodeGenCXX/mangle-address-space.cpp @@ -43,6 +43,10 @@ void ocl_f0(char __private *p) { } struct ocl_OpaqueType; typedef ocl_OpaqueType __global * ocl_OpaqueTypePtr; +typedef ocl_OpaqueType __attribute__((opencl_global_host)) * ocl_OpaqueTypePtrH; +typedef ocl_OpaqueType + __attribute__((opencl_global_device)) * + ocl_OpaqueTypePtrD; // CHECKOCL-LABEL: define {{.*}}void @_Z6ocl_f0PU8CLglobal14ocl_OpaqueType // WINOCL-LABEL: define {{.*}}void @"?ocl_f0@@YAXPEAU?$_ASCLglobal@$$CAUocl_OpaqueType@@@__clang@@@Z" @@ -61,4 +65,12 @@ __constant float *ocl_f1(char __generic const *p) { return 0;} // CHECKOCL-LABEL: define {{.*}}float* @_Z6ocl_f2PU9CLgenericKc // WINOCL-LABEL: define {{.*}}float* @"?ocl_f2@@YAPEAU?$_ASCLgeneric@$$CAM@__clang@@QEAU?$_ASCLgeneric@$$CBD@2@@Z" __generic float *ocl_f2(__generic char const * const p) { return 0;} + +// CHECKOCL-LABEL: define {{.*}}void @_Z6ocl_f3PU6CLHost14ocl_OpaqueType +// WINOCL-LABEL: define {{.*}}void @"?ocl_f3@@YAXPEAU?$_ASCLHost@$$CAUocl_OpaqueType@@@__clang@@@Z" +void ocl_f3(ocl_OpaqueTypePtrH) {} + +// CHECKOCL-LABEL: define {{.*}}void @_Z6ocl_f4PU8CLDevice14ocl_OpaqueType +// WINOCL-LABEL: define {{.*}}void @"?ocl_f4@@YAXPEAU?$_ASCLDevice@$$CAUocl_OpaqueType@@@__clang@@@Z" +void ocl_f4(ocl_OpaqueTypePtrD) {} #endif diff --git a/clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp b/clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp index 264e787a80d21..f62c6c8b10711 100644 --- a/clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp +++ b/clang/test/CodeGenSYCL/address-space-parameter-conversions.cpp @@ -5,12 +5,16 @@ void bar2(int & Data) {} // CHECK-DAG: define spir_func void @[[RAW_REF2:[a-zA-Z0-9_]+]](i32 addrspace(4)* align 4 dereferenceable(4) % void bar(__attribute__((opencl_local)) int &Data) {} // CHECK-DAG: define spir_func void [[LOC_REF:@[a-zA-Z0-9_]+]](i32 addrspace(3)* align 4 dereferenceable(4) % +void bar3(__attribute__((opencl_global)) int &Data) {} +// CHECK-DAG: define spir_func void @[[GLOB_REF:[a-zA-Z0-9_]+]](i32 addrspace(1)* align 4 dereferenceable(4) % void foo(int * Data) {} // CHECK-DAG: define spir_func void @[[RAW_PTR:[a-zA-Z0-9_]+]](i32 addrspace(4)* % void foo2(int * Data) {} // CHECK-DAG: define spir_func void @[[RAW_PTR2:[a-zA-Z0-9_]+]](i32 addrspace(4)* % void foo(__attribute__((opencl_local)) int *Data) {} // CHECK-DAG: define spir_func void [[LOC_PTR:@[a-zA-Z0-9_]+]](i32 addrspace(3)* % +void foo3(__attribute__((opencl_global)) int *Data) {} +// CHECK-DAG: define spir_func void @[[GLOB_PTR:[a-zA-Z0-9_]+]](i32 addrspace(1)* % template void tmpl(T t){} @@ -19,6 +23,10 @@ void tmpl(T t){} void usages() { // CHECK-DAG: [[GLOB:%[a-zA-Z0-9]+]] = alloca i32 addrspace(1)* __attribute__((opencl_global)) int *GLOB; + // CHECK-DAG: [[GLOBDEV:%[a-zA-Z0-9]+]] = alloca i32 addrspace(11)* + __attribute__((opencl_global_device)) int *GLOBDEV; + // CHECK-DAG: [[GLOBHOST:%[a-zA-Z0-9]+]] = alloca i32 addrspace(12)* + __attribute__((opencl_global_host)) int *GLOBHOST; // CHECK-DAG: [[LOC:%[a-zA-Z0-9]+]] = alloca i32 addrspace(3)* __attribute__((opencl_local)) int *LOC; // CHECK-DAG: [[NoAS:%[a-zA-Z0-9]+]] = alloca i32 addrspace(4)* @@ -35,6 +43,32 @@ void usages() { // CHECK-DAG: [[GLOB_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD2]] to i32 addrspace(4)* // CHECK-DAG: call spir_func void @[[RAW_REF2]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOB_CAST2]]) + bar(*GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBDEV_CAST]]) + bar2(*GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD2:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD2]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF2]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBDEV_CAST2]]) + bar3(*GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD3:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST3:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD3]] to i32 addrspace(1)* + // CHECK-DAG: call spir_func void @[[GLOB_REF]](i32 addrspace(1)* align 4 dereferenceable(4) [[GLOBDEV_CAST3]]) + + bar(*GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBHOST_CAST]]) + bar2(*GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD2:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST2:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD2]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF2]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBHOST_CAST2]]) + bar3(*GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD3:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST3:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD3]] to i32 addrspace(1)* + // CHECK-DAG: call spir_func void @[[GLOB_REF]](i32 addrspace(1)* align 4 dereferenceable(4) [[GLOBHOST_CAST3]]) + bar(*LOC); // CHECK-DAG: [[LOC_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]] // CHECK-DAG: call spir_func void [[LOC_REF]](i32 addrspace(3)* align 4 dereferenceable(4) [[LOC_LOAD]]) @@ -58,6 +92,30 @@ void usages() { // CHECK-DAG: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]] // CHECK-DAG: [[GLOB_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD4]] to i32 addrspace(4)* // CHECK-DAG: call spir_func void @[[RAW_PTR2]](i32 addrspace(4)* [[GLOB_CAST4]]) + foo(GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD4]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_PTR]](i32 addrspace(4)* [[GLOBDEV_CAST4]]) + foo2(GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD5:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST5:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD5]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_PTR2]](i32 addrspace(4)* [[GLOBDEV_CAST5]]) + foo3(GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD6:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST6:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD6]] to i32 addrspace(1)* + // CHECK-DAG: call spir_func void @[[GLOB_PTR]](i32 addrspace(1)* [[GLOBDEV_CAST6]]) + foo(GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST4:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD4]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_PTR]](i32 addrspace(4)* [[GLOBHOST_CAST4]]) + foo2(GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD5:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST5:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD5]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_PTR2]](i32 addrspace(4)* [[GLOBHOST_CAST5]]) + foo3(GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD6:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST6:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD6]] to i32 addrspace(1)* + // CHECK-DAG: call spir_func void @[[GLOB_PTR]](i32 addrspace(1)* [[GLOBHOST_CAST6]]) foo(LOC); // CHECK-DAG: [[LOC_LOAD3:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]] // CHECK-DAG: call spir_func void [[LOC_PTR]](i32 addrspace(3)* [[LOC_LOAD3]]) @@ -72,10 +130,16 @@ void usages() { // CHECK-DAG: [[NoAS_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(4)*, i32 addrspace(4)** [[NoAS]] // CHECK-DAG: call spir_func void @[[RAW_PTR2]](i32 addrspace(4)* [[NoAS_LOAD4]]) - // Ensure that we still get 3 different template instantiations. + // Ensure that we still get 5 different template instantiations. tmpl(GLOB); // CHECK-DAG: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]] // CHECK-DAG: call spir_func void [[GLOB_TMPL:@[a-zA-Z0-9_]+]](i32 addrspace(1)* [[GLOB_LOAD4]]) + tmpl(GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: call spir_func void [[GLOBDEV_TMPL:@[a-zA-Z0-9_]+]](i32 addrspace(11)* [[GLOBDEV_LOAD4]]) + tmpl(GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD4:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: call spir_func void [[GLOBHOST_TMPL:@[a-zA-Z0-9_]+]](i32 addrspace(12)* [[GLOBHOST_LOAD4]]) tmpl(LOC); // CHECK-DAG: [[LOC_LOAD5:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOC]] // CHECK-DAG: call spir_func void [[LOC_TMPL:@[a-zA-Z0-9_]+]](i32 addrspace(3)* [[LOC_LOAD5]]) @@ -88,6 +152,8 @@ void usages() { } // CHECK-DAG: define linkonce_odr spir_func void [[GLOB_TMPL]](i32 addrspace(1)* % +// CHECK-DAG: define linkonce_odr spir_func void [[GLOBDEV_TMPL]](i32 addrspace(11)* % +// CHECK-DAG: define linkonce_odr spir_func void [[GLOBHOST_TMPL]](i32 addrspace(12)* % // CHECK-DAG: define linkonce_odr spir_func void [[LOC_TMPL]](i32 addrspace(3)* % // CHECK-DAG: define linkonce_odr spir_func void [[PRIV_TMPL]](i32* % // CHECK-DAG: define linkonce_odr spir_func void [[GEN_TMPL]](i32 addrspace(4)* % @@ -97,6 +163,10 @@ void usages2() { // CHECK-DAG: [[PRIV:%[a-zA-Z0-9_]+]] = alloca i32* __attribute__((opencl_global)) int *GLOB; // CHECK-DAG: [[GLOB:%[a-zA-Z0-9_]+]] = alloca i32 addrspace(1)* + __attribute__((opencl_global_device)) int *GLOBDEV; + // CHECK-DAG: [[GLOBDEV:%[a-zA-Z0-9_]+]] = alloca i32 addrspace(11)* + __attribute__((opencl_global_host)) int *GLOBHOST; + // CHECK-DAG: [[GLOBHOST:%[a-zA-Z0-9_]+]] = alloca i32 addrspace(12)* __attribute__((opencl_constant)) int *CONST; // CHECK-DAG: [[CONST:%[a-zA-Z0-9_]+]] = alloca i32 addrspace(2)* __attribute__((opencl_local)) int *LOCAL; @@ -110,6 +180,14 @@ void usages2() { // CHECK-DAG: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(1)*, i32 addrspace(1)** [[GLOB]] // CHECK-DAG: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(1)* [[GLOB_LOAD]] to i32 addrspace(4)* // CHECK-DAG: call spir_func void @[[RAW_REF]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOB_CAST]]) + bar(*GLOBDEV); + // CHECK-DAG: [[GLOBDEV_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(11)*, i32 addrspace(11)** [[GLOBDEV]] + // CHECK-DAG: [[GLOBDEV_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(11)* [[GLOBDEV_LOAD]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBDEV_CAST]]) + bar(*GLOBHOST); + // CHECK-DAG: [[GLOBHOST_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(12)*, i32 addrspace(12)** [[GLOBHOST]] + // CHECK-DAG: [[GLOBHOST_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(12)* [[GLOBHOST_LOAD]] to i32 addrspace(4)* + // CHECK-DAG: call spir_func void @[[RAW_REF]](i32 addrspace(4)* align 4 dereferenceable(4) [[GLOBHOST_CAST]]) bar2(*LOCAL); // CHECK-DAG: [[LOCAL_LOAD:%[a-zA-Z0-9]+]] = load i32 addrspace(3)*, i32 addrspace(3)** [[LOCAL]] // CHECK-DAG: [[LOCAL_CAST:%[a-zA-Z0-9]+]] = addrspacecast i32 addrspace(3)* [[LOCAL_LOAD]] to i32 addrspace(4)* diff --git a/clang/test/SemaSYCL/address-space-parameter-conversions.cpp b/clang/test/SemaSYCL/address-space-parameter-conversions.cpp index 3f2be32d76fcd..8dd54d3db23b8 100644 --- a/clang/test/SemaSYCL/address-space-parameter-conversions.cpp +++ b/clang/test/SemaSYCL/address-space-parameter-conversions.cpp @@ -3,15 +3,19 @@ void bar(int & Data) {} void bar2(int & Data) {} void bar(__attribute__((opencl_private)) int & Data) {} +void bar3(__attribute__((opencl_global)) int &Data) {} void foo(int * Data) {} void foo2(int * Data) {} void foo(__attribute__((opencl_private)) int * Data) {} +void foo3(__attribute__((opencl_global)) int *Data) {} template void tmpl(T *t){} void usages() { __attribute__((opencl_global)) int *GLOB; + __attribute__((opencl_global_device)) int *GLOBDEV; + __attribute__((opencl_global_host)) int *GLOBHOST; __attribute__((opencl_private)) int *PRIV; __attribute__((opencl_local)) int *LOC; int *NoAS; @@ -19,6 +23,14 @@ void usages() { bar(*GLOB); bar2(*GLOB); + bar(*GLOBDEV); + bar2(*GLOBDEV); + bar3(*GLOBDEV); + + bar(*GLOBHOST); + bar2(*GLOBHOST); + bar3(*GLOBHOST); + bar(*PRIV); bar2(*PRIV); @@ -30,6 +42,12 @@ void usages() { foo(GLOB); foo2(GLOB); + foo(GLOBDEV); + foo2(GLOBDEV); + foo3(GLOBDEV); + foo(GLOBDEV); + foo2(GLOBHOST); + foo3(GLOBHOST); foo(PRIV); foo2(PRIV); foo(NoAS); @@ -38,12 +56,18 @@ void usages() { foo2(LOC); tmpl(GLOB); + tmpl(GLOBDEV); + tmpl(GLOBHOST); tmpl(PRIV); tmpl(NoAS); tmpl(LOC); (void)static_cast(GLOB); (void)static_cast(GLOB); + (void)static_cast(GLOBDEV); + (void)static_cast(GLOBDEV); + (void)static_cast(GLOBHOST); + (void)static_cast(GLOBHOST); // FIXME: determine if we can warn on the below conversions. int *i = GLOB; void *v = GLOB; diff --git a/clang/test/SemaTemplate/address_space-dependent.cpp b/clang/test/SemaTemplate/address_space-dependent.cpp index 76cd338769eaa..fa6cc68bba419 100644 --- a/clang/test/SemaTemplate/address_space-dependent.cpp +++ b/clang/test/SemaTemplate/address_space-dependent.cpp @@ -43,7 +43,7 @@ void neg() { template void tooBig() { - __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388595)}} + __attribute__((address_space(I))) int *bounds; // expected-error {{address space is larger than the maximum supported (8388593)}} } template