diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index a193000aeaf7..562bc53fcf04 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 faf7f303aa2d..a9db52dfcc9c 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 053b3eb4fd38..b65c2697dd1a 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -326,6 +326,7 @@ def CUDA : LangOpt<"CUDA">; def SYCLIsDevice : LangOpt<"SYCLIsDevice">; def SYCL : LangOpt<"SYCLIsDevice">; def SYCLIsHost : LangOpt<"SYCLIsHost">; +def SYCLExplicitSIMD : LangOpt<"SYCLExplicitSIMD">; def HIP : LangOpt<"HIP">; def COnly : LangOpt<"", "!LangOpts.CPlusPlus">; def CPlusPlus : LangOpt<"CPlusPlus">; @@ -1124,6 +1125,7 @@ def SYCLDevice : InheritableAttr { let Subjects = SubjectList<[Function]>; let LangOpts = [SYCLIsDevice]; let Documentation = [SYCLDeviceDocs]; + let PragmaAttributeSupport = 0; } def SYCLKernel : InheritableAttr { @@ -1159,6 +1161,7 @@ def SYCLDeviceIndirectlyCallable : InheritableAttr { let Subjects = SubjectList<[Function]>; let LangOpts = [SYCLIsDevice]; let Documentation = [SYCLDeviceIndirectlyCallableDocs]; + let PragmaAttributeSupport = 0; } def SYCLIntelKernelArgsRestrict : InheritableAttr { @@ -1167,6 +1170,7 @@ def SYCLIntelKernelArgsRestrict : InheritableAttr { let LangOpts = [ SYCLIsDevice, SYCLIsHost ]; let Documentation = [ SYCLIntelKernelArgsRestrictDocs ]; let SimpleHandler = 1; + let PragmaAttributeSupport = 0; } def SYCLIntelNumSimdWorkItems : InheritableAttr { @@ -1265,6 +1269,7 @@ def IntelReqdSubGroupSize: InheritableAttr { let Subjects = SubjectList<[Function, CXXMethod], ErrorDiag>; let Documentation = [IntelReqdSubGroupSizeDocs]; let LangOpts = [OpenCL, SYCLIsDevice, SYCLIsHost]; + let PragmaAttributeSupport = 0; } // This attribute is both a type attribute, and a declaration attribute (for @@ -1293,6 +1298,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 a942c9011bb4..eafcc37e8bc5 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -3561,6 +3561,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/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index d1074e0da4f0..6d4c77fca5a9 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -248,6 +248,7 @@ LANGOPT(SYCLStdLayoutKernelParams, 1, 0, "Enable standard layout requirement for LANGOPT(SYCLUnnamedLambda , 1, 0, "Allow unnamed lambda SYCL kernels") LANGOPT(SYCLVersion , 32, 0, "Version of the SYCL standard used") LANGOPT(DeclareSPIRVBuiltins, 1, 0, "Declare SPIR-V builtin functions") +LANGOPT(SYCLExplicitSIMD , 1, 0, "SYCL compilation with explicit SIMD extension") LANGOPT(HIPUseNewLaunchAPI, 1, 0, "Use new kernel launching API for HIP") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 8f15ebf76282..55431a0fed32 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3576,6 +3576,10 @@ def fno_sycl : Flag<["-"], "fno-sycl">, Group, Flags<[CoreOption]>, HelpText<"Disable SYCL kernels compilation for device">; def sycl_std_EQ : Joined<["-"], "sycl-std=">, Group, Flags<[CC1Option, NoArgumentUnused, CoreOption]>, HelpText<"SYCL language standard to compile for.">, Values<"2017, 121, 1.2.1, sycl-1.2.1">; +def fsycl_esimd : Flag<["-"], "fsycl-explicit-simd">, Group, Flags<[CC1Option, NoArgumentUnused, CoreOption]>, + HelpText<"Enable SYCL explicit SIMD extension">; +def fno_sycl_esimd : Flag<["-"], "fno-sycl-explicit-simd">, Group, + HelpText<"Disable SYCL explicit SIMD extension">, Flags<[NoArgumentUnused, CoreOption]>; include "CC1Options.td" diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h index 21e030fe5134..8946b12ee03f 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 7244e063c7a6..12f33edb24ef 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 { @@ -2067,7 +2069,9 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { Align = Target->getDoubleAlign(); break; case BuiltinType::LongDouble: - if (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice && + if (((getLangOpts().SYCL && getLangOpts().SYCLIsDevice) || + (getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice)) && + AuxTarget != nullptr && (Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() || Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) { Width = AuxTarget->getLongDoubleWidth(); diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 3710b95bb340..9164921c9716 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 e3796accb26e..7e6cf7bdd2be 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 87b273234ad9..0505d53d6f99 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 da7bd34c9532..d5af8c396535 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 fc8c832641ad..194baa411d62 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 dcaabec66536..49d6d840566d 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 { @@ -209,8 +213,6 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_32SPIRTargetInfo MicrosoftX86_32SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsX86_32SPIRTargetInfo(Triple, Opts) { - LongDoubleWidth = LongDoubleAlign = 64; - LongDoubleFormat = &llvm::APFloat::IEEEdouble(); assert(DataLayout->getPointerSizeInBits() == 32); } @@ -261,8 +263,6 @@ class LLVM_LIBRARY_VISIBILITY MicrosoftX86_64_SPIR64TargetInfo MicrosoftX86_64_SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) : WindowsX86_64_SPIR64TargetInfo(Triple, Opts) { - LongDoubleWidth = LongDoubleAlign = 64; - LongDoubleFormat = &llvm::APFloat::IEEEdouble(); assert(DataLayout->getPointerSizeInBits() == 64); } diff --git a/clang/lib/Basic/Targets/TCE.h b/clang/lib/Basic/Targets/TCE.h index 9cbf2a3688a2..445fe4fe7293 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 39ccac96a49d..2b2462f97af8 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 775fdd42edae..c656e2d10f21 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1363,10 +1363,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. } @@ -3861,6 +3869,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/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 6d95f062907b..e808b1376cc2 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4085,6 +4085,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fsycl"); CmdArgs.push_back("-fsycl-is-device"); CmdArgs.push_back("-fdeclare-spirv-builtins"); + + if (Args.hasFlag(options::OPT_fsycl_esimd, options::OPT_fno_sycl_esimd, + false)) + CmdArgs.push_back("-fsycl-explicit-simd"); // Pass the triple of host when doing SYCL auto AuxT = llvm::Triple(llvm::sys::getProcessTriple()); std::string NormalizedTriple = AuxT.normalize(); @@ -6132,6 +6136,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // doing the host pass. CmdArgs.push_back("-fsycl"); CmdArgs.push_back("-fsycl-is-host"); + + if (Args.hasFlag(options::OPT_fsycl_esimd, options::OPT_fno_sycl_esimd, + false)) + CmdArgs.push_back("-fsycl-explicit-simd"); } if (IsSYCLOffloadDevice && JA.getType() == types::TY_SYCL_Header) { // Generating a SYCL Header diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 6e26d1bbd354..636430f6e9ee 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2553,6 +2553,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, << A->getAsString(Args) << A->getValue(); } } + Opts.SYCLExplicitSIMD = Args.hasArg(options::OPT_fsycl_esimd); } Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header); diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index f5bd8a32954f..52f0ffc02c77 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1113,6 +1113,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__SYCL_NVPTX__", "1"); } } + if (LangOpts.SYCLExplicitSIMD) + Builder.defineMacro("__SYCL_EXPLICIT_SIMD__", "1"); if (LangOpts.SYCLUnnamedLambda) Builder.defineMacro("__SYCL_UNNAMED_LAMBDA__", "1"); diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 882048d766b0..6b6b5a239dbf 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -1753,7 +1753,12 @@ void Sema::checkDeviceDecl(const ValueDecl *D, SourceLocation Loc) { if (Ty->isDependentType()) return; - if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) || + auto IsSYCLDeviceCuda = getLangOpts().SYCLIsDevice && + Context.getTargetInfo().getTriple().isNVPTX(); + if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type() && + // Disable check for SYCL CUDA BE until FP16 support is properly + // reported there (issue#1799) + !IsSYCLDeviceCuda) || ((Ty->isFloat128Type() || (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128)) && !Context.getTargetInfo().hasFloat128Type()) || diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 05bfbba231a9..2304ce856539 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -908,8 +908,11 @@ bool Sema::LookupBuiltin(LookupResult &R) { *this, 0, R, II, Index.first - 1, Index.second, [this](const SPIRVBuiltin::BuiltinStruct &, FunctionDecl &NewBuiltin) { - NewBuiltin.addAttr( - SYCLDeviceAttr::CreateImplicit(this->Context)); + if (!this->getLangOpts().CPlusPlus) + NewBuiltin.addAttr(OverloadableAttr::CreateImplicit(Context)); + if (this->getLangOpts().SYCLIsDevice) + NewBuiltin.addAttr( + SYCLDeviceAttr::CreateImplicit(this->Context)); }); return true; } diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index b83ee3c864bc..cb3c2a2c78dd 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -1857,6 +1857,38 @@ void SYCLIntegrationHeader::emitForwardClassDecls( // template class Foo specialized by class Baz, not a template // class template